Перейти к содержанию

Локализация

Локализация является важной частью любой игры, особенно SS14.
Локализацию в игре можно производить на уровне кода и на уровне прототипов.

Локализация прототипов

Большинство прототипов в игре были созданы командой разработки SS14, поэтому для игрока они изначально написаны на английском языке. Для решения этой проблемы можно переводить прототипы через их id:

ent-ClothingHeadHatBeret = берет
    .desc = Берет, любимый головной убор творцов.
В данном случае переводится прототип берета с id 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).