
Гайды / За кадром
Как мы перевели наши мобильные игры на 14 языков
Что понадобилось, чтобы выпустить наши Android-игры на 14 языках: как мы устраиваем файлы строк, почему важны правила множественного числа и шрифты, какие ошибки перевода возвращались снова и снова, баг, который бьёт только по телефонам в Европе, и почему 14 языков означают 16 страниц в магазине.
Все шесть наших игр полностью переведены на 14 языков: английский, немецкий, испанский, французский, хорватский, индонезийский, итальянский, японский, корейский, португальский, русский, словенский, турецкий и традиционный китайский. Первые четыре, Idle Ronin, Idle Summoner, Idle AI Factory и Block Brain, вместе содержат около 2 100 английских строк - от 254 в Block Brain до 1 253 в Idle Ronin, и каждая переведена 13 раз. Idle Restaurant: Miami и ONI Snakes вышли на тех же 14 языках. Вот чего это стоило и что мы сделали бы снова.
Один файл строк на язык, с контекстом
У каждой игры есть простой текстовый файл на каждый язык. Запись - это исходная английская строка, помеченная @, а за ней перевод, помеченный =, и у большинства записей есть комментарий для переводчика. Вот первый монстр в английском файле Idle Summoner:
# monster name with its number in the summon chain (1-55); names appear on small labels
@ {0}. Slime
Эти комментарии - самое полезное, что мы добавили. В английском файле Idle Summoner их 156 на 258 строк. Переводчик, который знает, что строка стоит на крошечной плашке или что {0} - это число, ошибается гораздо реже, чем тот, кто гадает по одним словам.
Использование самого английского текста в качестве ключа делает файлы читаемыми, но в этом есть ловушка. Строка, которая одинакова в обеих колонках, не обязательно имя, которое должно остаться на английском: в Idle Ronin около 680 из первых 1 185 записей совпадали со своим английским текстом. На английском остаются только настоящие имена собственные - имена 19 Стражей, названия юнитов и 12 костюмов, - и наш скрипт сборки блокирует именно их.
Правила множественного числа - не опция
В английском две формы: 1 unit, 2 units. Во многих языках их больше, и правила различаются. Наш код Loc следует правилам множественного числа для целых чисел из таблиц Unicode CLDR:
| Языки | Формы, которые использует наш код |
|---|---|
| Английский, немецкий, испанский, итальянский | one, other |
| Французский, португальский | one (0 и 1), other |
| Хорватский | one, few, other |
| Русский | one, few, many |
| Словенский | one, two, few, other |
| Турецкий, индонезийский, японский, корейский, китайский | одна форма |
Больше всего удивляет словенский: у него есть отдельная форма для двух, поэтому говорят «2 enoti», но «5 enot». Если твой код знает только единственное и множественное число, каждый из этих языков где-нибудь покажет неправильную грамматику.
Шрифты: буквы, которых неожиданно не хватает
Шрифт текста в Idle Summoner был урезанной копией Noto Sans KR Black, в которой не было č, š, ž и ć, западноевропейских диакритических знаков, турецких букв и традиционного китайского. Недостающие буквы либо подменялись шрифтом телефона, либо вообще не отображались. Мы пересобрали его со всеми буквами, которые используют наши таблицы, и добавили Noto Sans JP для японского и Noto Sans TC для традиционного китайского. Надписи пиксельным шрифтом игры сохраняют его, только пока текст укладывается в буквы, которые в этом шрифте есть.
Шрифты могут и обманывать. В корейском шрифте Idle Ronin заглавная N нарисована так, что ON и OFF читаются как «OΠ». Мы заменили эти переключатели корейскими словами 켜기 и 끄기, которые к тому же читаются лучше.
Ошибки, которые возвращались в каждом языке
Как бы ни переводили игру, первый черновик редко бывает готов. Наш повторял одну и ту же горстку ошибок почти в каждом языке - те самые, которые первой нашла наша собственная проверка словенского перевода:
- «Particle», настройка графики, переведённая как термин из физики вместо «Эффекты».
- «Stack», дополнительные копии юнита, оставленное по-английски или переведённое как «куча» вместо «копии».
- Задание победить монстра по имени Treasure Chest, переведённое как «разбить сундуки с сокровищами».
- Текст, переведённый целиком для строк и значков, куда помещается только одно-два слова.
- «FIGHT FLOOR {0}» с лишним глаголом, из-за которого кнопка становилась слишком длинной.
Поэтому мы написали проверку, которая выводит именно эти строки для любого языка, и передаём список до начала перевода. Два языка, переведённые со списком на руках, не потребовали правок; переведённые без него потребовали примерно по шесть.
Проверяй экраны, а не только файлы
Файл может быть полным, а экран всё ещё показывать английский. Наш тест: переключи игру на другой язык, собери весь видимый на экране текст и сравни с английским файлом. Всё, что осталось на английском, - это надпись, которую код никогда не переводит. В Idle Ronin такая проверка нашла всегда видимую кнопку OPEN и кнопки настроек, застрявшие на языке, который был активен при первом открытии меню.
Потом проверь, помещается ли всё на реальном разрешении телефона. Мы смотрим каждый экран в 1080 x 2400 на самых длинных языках, а также на японском, корейском, китайском и русском, и предпочитаем сократить текст, а не уменьшать его, пока никто не сможет его прочитать.
Запятая, которая ломает сохранения в Европе
Один баг вообще не связан со словами. В игре, которую мы сейчас делаем, сохранение склеивает числа через запятую. На телефоне, язык которого пишет десятичные дроби через запятую, как во многих странах Европы, 7392.58 превращается в 7392,58, лишняя запятая разрезает число надвое, и каждое значение после него сдвигается на одну позицию. При тестировании на английском этого никогда не видно. Исправление - одна строка при запуске, которая фиксирует формат чисел на инвариантной культуре, плюс защита, чтобы уже сломанные сохранения всё равно загружались.
14 языков, 16 страниц в магазине
В Google Play отдельные страницы для испанского в Испании и Латинской Америке и для португальского в Португалии и Бразилии. Мы держим один перевод в игре на каждый язык, но пишем текст для магазина отдельно для каждого рынка, со своими поисковыми запросами. Получается 16 страниц на игру, у каждой свой заголовок, краткое описание, полное описание и скриншоты. Наш сайт устроен так же, а как мы его собираем, рассказываем в отдельной записи.
Что мы сделали бы снова
- Пиши комментарий с контекстом к каждой строке.
- Блокируй имена собственные в сборке, а не в голове переводчика.
- Реализуй правила множественного числа до того, как придёт первый перевод.
- Проверь, что в твоих шрифтах есть все буквы, которые используют твои таблицы.
- Веди список известных проблемных строк и передавай его заранее.
- Пройдись по экранам на другом языке в поисках забытого английского.
- Записывай данные сохранений в инвариантной культуре.
- Закладывай 16 страниц в магазине, а не 14.
Хочешь увидеть результат? Переключи язык в Idle Ronin, Idle Summoner, Idle AI Factory, Block Brain, Idle Restaurant: Miami или ONI Snakes: каждая из них говорит на всех 14.
Источники
- Unicode CLDR, Language Plural Rules.
- Код игр ONI Games, сентябрь 2026 года: Idle Summoner (Loc.cs, LocFonts.cs, Localization/Summoner/en.txt), Idle Ronin (Localization/Ronin), Idle AI Factory (Localization/AIFactory), Block Brain (Localization/Brain).








