Задать вопрос
@Valera_Petrovi4

Как работают переводы на другие языки в играх?

Мне стало интересно как работают переводы игр на другие языки с технической составляющей. Точного ответа на этот вопрос я не нашел, поэтому предположил что перевод игры лежит в отдельном файле(например json и хранит в себе каждую строчку текста, которая применяется в игре), и потом в коде запрашивать нужную строку из файла и брать от туда значение текста для последующего применения на сцене. Я верно предположил или есть способы попроще? Можно для простоты объяснений взять untiy или godot
  • Вопрос задан
  • 1189 просмотров
Подписаться 2 Простой 10 комментариев
Решения вопроса 3
@Mercury13
Программист на «си с крестами» и не только
А теперь расскажу как человек, который давно и плотно интересуется локализацией, но в глаза Unity не видел.
Локализация ДОЛЖНА храниться в простенькой базе «ключ-значение», это может быть INI, CSV, XML или что-то ещё. А то часто бывают половинчатые решения, когда общие строки локализуются, а прописанные где-то в скриптах — через зад (StarCraft первый). Или одна и та же строка служит и ключом чего-то, и выводимой локализованной строкой (Atreides/Ordos/Harkonnen в Dune II).

Существуют два основных подхода к локализации.

1. Есть так называемый «основной» язык, прописанный ПРЯМО в EXE-файле, ПРЯМО в скриптах игры и так далее. Локализация имеет вид
«Open»,cmd → «Открыть»
«The door is locked.»,level1 → «Дверь закрыта.»

Как вы видите, ключ состоит из двух частей: строки-оригинала и уточнения. Если ключ совпадает, а уточнение — нет, берём строку без уточнения, а если и таковой нет — то что угодно. А если и ключ не совпадает — берём непереведённую.

Адепты этого подхода — Gettext и Qt.

2. Даже первый язык наравне с остальными.
Cmd.Open → «Открыть»
Level1.Locked → «Дверь закрыта.»

Вариант 2.1: первый язык (обычно английский) используется как резервный, если локализации не нашлось.

Сам я в пользу второго подхода, но он сложнее.

САМАЯ простая база ключ-значение, чаще всего использовавшаяся на Java ME, где с памятью швах,— это простой линейный массив.
[0] Открыть
[1] Дверь закрыта.
Всё преобразование из человекочитаемых идентификаторов S_CMD_OPEN в номера происходит на машине разработчика, генерацией файла
constexpr unsigned S_CMD_OPEN = 0;

Какой из методов брать?
1. Насколько много локализации?
2. Есть ли скрипты, GUI-формы и прочие ресурсы, способные содержать строки локализации?
3. Насколько много больших текстов?
4. Если программа параллельно разрабатывается и переводится: насколько тексты стабильны? Первый подход совершенно не выдерживает ситуации, когда исходные тексты меняются.
5. Возможны ли неофициальные локализации? Метод 2 без уточнения 2.1, если программа «живая», исключает их.
6. Что поддерживается вашим движком из коробки?
7. Локализация встроена изначально, или приходится переводить неготовую к этому прогу?
8. Насколько много интерфейса? У интерфейса есть противная фишка: нужно расщеплять строки, то есть давать одинаковым строкам разный ID (Open=«Открыть», «Открыто» и т.д.), и первый поход по умолчанию объединяет, второй по умолчанию расщепляет.

И ма-ахонький апдейт. Есть ещё такое понятие, как сегмент — кусок МЕНЬШЕ локализуемого текста. То есть сегменты есть только на уровне комплекта локализации, в экспортированных текстах они склеиваются в единый текст. Обычно предложение или абзац. Сегментация используется в переводе больших текстов, особенно в интерфейсах, с такими целями.
• Существуют тексты-«козы», которые могут найтись в памяти переводов. Например: «Серп и молот символизирует крестьян и рабочих. Осторожно, в вашем законодательстве эта символика может быть запрещена.»
• Из-за недостатков интерфейса проги перевода можно пропустить целое предложение. Да, бывает!
• В «живых» программах — можно помечать плохо переведённым кусок меньший, чем целый текст.
(Живой я называю программу, которая параллельно разрабатывается и переводится. Благо методика «аджайл» предполагает частые небольшие выпуски.)
Ответ написан
Комментировать
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
перевод игры лежит в отдельном файле(например json и хранит в себе каждую строчку текста, которая применяется в игре), и потом в коде запрашивать нужную строку из файла и брать от туда значение текста для последующего применения на сцене

Да, так оно и работает.

или есть способы попроще

Проще уже некуда.
Ответ написан
CityCat4
@CityCat4
Дома с переломом ноги
перевод игры лежит в отдельном файле

именно так. Причем так работают не только игры, но и локализация программ
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы