authors_main:game_management:localization

Многоязычная игра (переводы)

Одна игра, одна статистика, одни коды — а текст каждый игрок читает на своём языке. Переводы лежат рядом с игрой и подменяют текст при показе; там, где перевода нет, игрок видит оригинал. Игроку, у которого язык совпадает с языком игры, ничего не подменяется вообще.

Это рекомендуемый способ. Старый приём с шаблоном {% match lang %} (Шаблоны) продолжает работать, но новые игры лучше делать переводами: текст задания не превращается в простыню из N копий, правка вёрстки не размножается по языкам, а редактор показывает, что ещё не переведено.

В редакторе игры, вкладка «Настройки игры», блок «Локализация»:

  • Язык игры — язык, на котором игра написана. Пока он не выбран, никакой локализации у игры нет: ничего не считается, ничего не хранится, редактор выглядит как обычно.
  • Языки перевода — галочки языков, на которые игра переводится. Рядом с каждым — «падает на»: на какой язык показывать то, что на этом языке ещё не переведено. Пусто — сразу на язык игры.
  • Строка «остальные языки» — куда отправлять игрока, языка которого у игры нет вовсе.

Пример: игра написана по-русски, переведена на украинский и английский, а польский падает на украинский (он ближе, чем русский). Игрок-поляк увидит польский текст там, где он есть, украинский — там, где польского ещё нет, и русский — там, где нет и украинского.

Как только появился хотя бы один язык перевода, в редакторе появляется вкладка «Перевод».

Это таблица пар «оригинал → перевод». Слева строка из игры, справа поле для перевода.

  • Строки собираются автоматически. Большой текст (задание, подсказка, афиша, финишный текст) режется на абзацы; короткие поля (название игры, название задания, название кода, описание подсказки, формат ответа) идут целиком. Размечать в тексте ничего не надо.
  • Одинаковый текст переводится один раз на всю игру. Если строка встречается в нескольких местах, рядом с ней стоит «мест: N» — наведите мышь, чтобы увидеть где. Правка такой строки меняет её везде.
  • Состояние строки видно значком: свой перевод, из языка X (пришло по цепочке), база (перевода нет) или не переводится.
  • Полнота показывается двумя числами: сколько переведено на этот язык и сколько получится с учётом цепочки. Второе число само по себе обманчиво — оно прячет непереведённое за чужим языком.
  • Две вкладки — «Строки» и «Ссылки и файлы»: адреса переводят редко и по другому поводу, поэтому они не мешаются в общем списке. Счётчик на вкладке говорит, есть ли там вообще что-нибудь.
  • Группы строк — «непереведённые», «переведённые», «непереводимые». Это не выбор одного из трёх, а переключатели: они складываются. По умолчанию включены только непереведённые — это и есть работа; переведённые включают, когда идут вычитывать готовое, непереводимые — когда надо снять пометку. Группы одни и те же на обеих вкладках, а числа на них считаются по текущей.

Жирный, ссылки, картинки и шаблоны внутри абзаца в переводе не пишутся руками: на их месте стоят чипсы — маленькие рамки с номером. Кликните по чипсу — он встанет в перевод там, где стоит курсор. Чипсы можно переставлять (порядок слов в языках разный), но каждый должен быть в переводе ровно один раз — иначе перевод не сохранится и редактор скажет об этом.

Так же ведут себя подстановки!username!, !task_n! и прочие: они остаются в переводе как есть, просто в нужном месте фразы.

Полезное следствие: сами теги, адреса ссылок и классы живут только в оригинале. Поправили ссылку в задании — она поменялась во всех языках сразу.

  • Коды-ответы не переводятся никогда. Это и делает статистику общей. Ответы на разных языках просто дописываются синонимами через запятую в том же коде.
  • Не переводить эту строку — переключатель в конце строки таблицы, два режима: «не переводить в этом языке» и «не переводить нигде». Для брендов, имён собственных, латинских цитат. Такие строки уходят из «непереведённых» и не мешают счётчику полноты дойти до 100%.
  • translate=«no» в HTML задания — более сильный способ: такой кусок не станет строкой вовсе, и его не тронет даже автоперевод браузера. Для кодовых слов и ответов внутри текста это важнее, чем кажется: автоматически переведённое кодовое слово ломает игру.

Вторая вкладка таблицы, с теми же группами. Адреса картинок, звуков, видео и ссылок по умолчанию не переводятся — почти все они языконезависимы. Но перевод адреса можно завести: так игрок уходит на страницу своего языка или получает озвучку на своём языке, а абзац и вёрстка остаются одни на всех. В счёт полноты эти строки не идут.

Субтитры оверлеем делать не надо — HTML это уже умеет: несколько <track srclang=«…»> в одном <video>, браузер выберет сам.

Идентичность строки — её текст. Поправили оригинал — перевод к нему больше не подходит, строка снова становится непереведённой, а старый перевод уезжает в раздел «Устаревшие переводы». Если правка была мелкой (опечатка), редактор сам предложит его вернуть кнопкой «восстановить» прямо под новой строкой. Ненужные можно удалить — по одной или все сразу.

Внизу вкладки: «Загрузить переводы из игры» — номер игры и кнопка. Возьмутся только те пары, чей оригинал есть и в этой игре; отчёт скажет, сколько совпало и сколько пропущено. Существующие переводы по умолчанию не перезаписываются. Осмысленно для серии игр одного автора с одним языком оригинала: у игры на другом языке совпадений не будет.

Переводы — часть черновика редактора, наравне с текстом. Переводить можно и несохранённое задание: написали задание, тут же перевели, сохранили одной кнопкой. Правка оригинала и починка переводов уезжают на сервер одной операцией, так что момента, когда игроки видят новый текст со старым переводом, не возникает.

Переводы едут вместе с игрой в её JSON — секцией translations — и приезжают обратно при импорте. Копия игры получает и переводы; копирование одного задания в другую игру переводы не переносит (словарь общий на игру, чужие строки там были бы мусором) — для этого есть «Загрузить переводы из игры».

Откройте игру с явным языком: https://qeng.org/game/1234/?lang=uk. Проверьте и язык, которого у игры нет, — так видно, работает ли строка «остальные языки».

  • тексты бонусов;
  • строки внутри скриптов задания;
  • названия платных товаров.

Для них пока работает прежний способ — {% match lang %}.

  • authors_main/game_management/localization.txt
  • Последние изменения: 2026/08/16 19:12
  • (внешнее изменение)