Локализация
Локализация является важной частью любой игры, особенно SS14.
Локализацию в игре можно производить на уровне кода и на уровне прототипов.
Локализация прототипов
Большинство прототипов в игре были созданы командой разработки SS14, поэтому для игрока они изначально написаны на английском языке. Для решения этой проблемы можно переводить прототипы через их id:
ent-ClothingHeadHatBeret = берет
.desc = Берет, любимый головной убор творцов.
ClothingHeadHatBeret
. Как можно понять, перевести название берета можно добавив к id прототипа приставки -ent
, а после приравняв ключ локализации (название значения, по которому можно локализиировать что-то) к самому переводу.Также тут переводится и описание, просто нужно на следующей строчке через отступ написать
.desc
и написать сам перевод.
Данные строчки находятся по пути Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/head/hats.ftl
.
Как можно заметить, файл локализации имеет формат .ftl
.
Стоит поговорить и про путь: любая локализация должна находится где-то внутри папки Locale
, а в зависимости от языка перевода в соответствующей папке (в данном случае ru-RU
).
Далее стоит следовать пути, по которому оно должно лежать исходя из логики и пути в английской локализации (если она написана там).
Локализация в коде
Много элементов в игре (например, как выводы сообщений в мир при инъекции чего-либо) локализуются прямо в коде через ключи локализации. Посмотрим на локализацию попытки замайднслейвить человека при имеющемся у него майндшилде:
if (HasComp<MindShieldComponent>(slave))
{
_popup.PopupEntity(Loc.GetString("mindslave-target-mindshielded"), slave, master);
return false;
}
PopupEntity()
простую строчку, но это было бы плохой практикой. Для этого и существует система локализации, которую можно вызвать обращением через Loc.GetString()
(если нам нужна строчка) и передачей в него ключа локализации.
Рассмотрим сам ключ локализации:
mindslave-target-mindshielded = Разум цели сопротивляется!
Но если нам нужно в локализацию передать какие-то данные, то это возможно сделать с невероятной простотой! Рассмотрим пример:
mindslave-briefing-slave-master = Вы получили контроль над { $name }! Теперь {SUBJECT($ent)} подчиняется вашей воле.
SUBJECT()
. Эта строчка в зависимости от переданного энтит определяет местоимение (он/она/оно). Примеры различных методов для локализации можно найти в официальном вики для разработчиков.
Перейдём к исполнению этой строчки в коде:
var briefingMaster = Loc.GetString("mindslave-briefing-slave-master", ("name", mindComp.CharacterName), ("ent", slave));
_popup.PopupEntity(briefingMaster, slave, master);
name
- это string
, а ent
- это EntityUid
).