7 советов по локализации инди-игры в Unity
Unity — один из самых популярных игровых движков среди независимых разработчиков. Это мощный инструмент, открывающий доступ в игровую индустрию даже самым мелким издателям и разработчикам-одиночкам.
Проблема независимого пути в том, что нужно всегда пытаться соответствовать стандартам и нагрузке больших коллективов. Unity облегчает задачу, упрощая процесс разработки, чтобы с ней мог справиться один человек.
Это относится и к локализации, благодаря которой вы можете познакомить со своей игрой весь мир. Однако нужно быть осторожным, ведь локализация игры — сложный процесс. Давайте рассмотрим наилучший способ выполнить её в Unity.
1. Используйте расширения Smart Localization и I2 Localization (но аккуратно)
Smart Localization (бесплатная и платная версии)
Хорошим началом локализации проекта Unity будет выбор готового расширения под названием Smart Localization, разработанного janeTech. У расширения есть две версии: бесплатная и платная версия Pro.

Вот что можно доверить Smart Localization:
- Создание структуры папок для разных языков.
- Импорт и экспорт файлов
I2 Localization (45$)
Среди платных ассетов определённо полезным будет I2 Localization, разработанный игровой студией Inter Illusion.

Наиболее удобными функциями этого ассета являются синхронизация с электронными таблицами Google и автоматическое отображение текста справа налево для арабского.
«I2 Localization в целом прекрасный инструмент для локализации. [. ] Первое и главное — это возможность импорта данных непосредственно из Таблиц Google даже после выпуска игры. Это чрезвычайно полезно, потому что большинство компаний-локализаторов отдаёт результаты в файле Excel, который можно быстро перенести в Таблицы Google и импортировать все данные.
Вторая функция, которую я люблю, позволяет обрабатывать hardcoded-текст в коде. Вместо того, чтобы создавать конструкции из циклов или switch, можно использовать единственную строку для перевода текста: I2.Loc.ScriptLocalization.Get(»»);».
Оба расширения популярны среди разработчиков Unity (в особенности бесплатная версия Smart Localization, по понятным причинам). Это полезные инструменты, но применяйте их аккуратно. Ни одно расширение не решит всех вопросов локализации, и уж точно не выполнит процесс локализации за вас.
2. Наймите профессиональных переводчиков
От этого никуда не уйти, если вы серьёзно настроены продавать свою игру на иностранных рынках. Вам нужны профессиональные переводчики видеоигр, и чем раньше вы начнёте с ними работать, тем лучше.
Подготовьте первый черновик переводов ещё до начала разработки.
Вы сэкономите кучу времени, если займётесь кодингом игры после того, как процесс локализации будет выполнен. Уделите особое внимание длине слов и предложений в каждом переводе по сравнению с английской версией (или другим базовым языком). Так вы сможете внести в дизайн необходимые правки или снова обратиться к переводчику и поработать над альтернативами.
Если вы займётесь локализацией после завершения разработки, то это обернётся кошмаром.
3. Выберите правильный формат текстовых строк
После начала разработки первое, что нужно сделать с точки зрения локализации — выбрать способ форматирования текстовых строк. Здесь вы делаете выбор не только с точки зрения разработки: это определит, насколько просто или сложно будет добавлять новые языки в игру в будущем или изменять существующие переводы.
Unity поддерживает множество форматов, самые популярные из них это:
- JSON
- XML
- YAML
- CSV
Если вы разрабатываете игру на JavaScript, то правильнее всего будет использовать JSON. Это простой и лёгкий формат, используемый множеством разработчиков в течение долгих лет. Кроме того, он быстр в обработке. Кроме преимуществ для разработчика, он очень лёгок в чтении даже для тех, кто не занимается разработкой. Это важный плюс для будущих переводов и правок.
Многие разработчики по-прежнему работают с XML, и это хороший выбор, если вы предпочитаете работать именно с этим языком разметки. Это не самый эффективный язык и его сложнее читать, так что учтите это при создании игры.
С точки зрения переводов другие варианты значительно более проблематичны, но вам нужно придерживаться того языка, который наиболее удобен. Плотно взаимодействуйте с переводчиком, чтобы как можно больше упростить его работу, потому что это снизит количество ошибок.
4. Определитесь со структурой строк
Подбор самого эффективного способа структурирования строк может стать настоящей проблемой. Для этого процесса нет чётко заданных инструкций. Unity предоставляет разработчику свободу в выборе структуры. Свобода — это, конечно, всегда хорошо, но она и увеличивает вероятность ошибок.
Существует три основных фактора, влияющих на структуру строк:
- Язык
- Идентификаторы (ID) строк
- Текст
Для большинства игр (в которых выбор языка сохраняется в самом начале) можно хранить строки в отдельных файлах для каждого языка (например, en.json, es.json, fr.json и т.д.). Это наиболее продуктивный способ разделения строк по языкам, чтобы игре не требовалось обрабатывать ненужные дополнительные файлы.
Идентификаторы строк
Затем нужно подумать об идентификаторах строк. Объём этой задачи сильно зависит от количества текстовых строк в игре. Стремитесь предугадывать проблемы при создании ID строк, давая каждой из них уникальный подробный идентификатор, позволяющий с лёгкостью найти нужную строку в будущем.
В основном выбор зависит от личных предпочтений, но не забывайте, что в будущем с вашим кодом могут работать другие разработчики.
Всегда создавайте строки с учётом будущей локализации. Наиболее частые ошибки: разная длина строк в различных языках и отсутствие подходящего перевода для строк. Не позволяйте им снижать качество скрипта, но укорачивание или перефразирование могут помочь в будущем.
Если вы выберете такой подход, процесс сохранения и загрузки локализованных строк станет гораздо проще. Вы не только снизите таким образом рабочую нагрузку, но и уменьшите риск возникновения ошибок.
5. Создавайте большинство компонентов локализации в Unity
Unity позволяет создавать компоненты, что значительно уменьшает объём разрабатываемого вручную кода. Это также снижает риск возникновения ошибок и экономит время.
Подробно о компонентах можно почитать на странице ресурсов Unity. Однако в этой статье мы сосредоточимся только на нескольких задачах:
- Возможность смены языка пользователями
- Сохранение выбранного языка
- Автоматический выбор языка при перезапуске игры
- Загрузка правильной строки для каждого значения
Большинству игроков достаточно один раз выбрать язык и закончить на этом. Один из вариантов: определить местоположение пользователя и выбрать по умолчанию местный язык. Однако, возможно, придётся добавить экран с запросом подтверждения языка при первом запуске игры. Например, не для всех американцев английский язык родной.
Способ выбора дизайна и реализации этой возможности больше относится и к UX, и к локализации. Здесь важно сохранить выбранное игроком значение (если оно было выбрано) и сохранить его как новое значение по умолчанию. После этого вам не придётся задавать один и тот же вопрос при каждом запуске игры.
Чтобы сделать это в Unity, можно создать компонент Master для назначения языка по умолчанию. Если пользователь решает сменить настройку языка, то новый язык назначается компоненту и обрабатывается как язык по умолчанию.
6. Локализация визуальных элементов в Unity
Этого не избежать, и локализация визуальных элементов игры может стать пыткой. Первое, о чём нужно подумать — это шрифты. Важен не только их внешний вид, но и поддерживаемые ими языки. Вот какие аспекты нужно рассмотреть:
- Стиль
- Языковая поддержка
- Размеры шрифтов
- Размеры файлов
Это зависит от количества языков, которые вы хотите поддерживать. Поиск шрифтов с диакритическими символами (для испанского, французского, итальянского и т.д.) не очень сложен. Но вы замучаетесь искать один шрифт, поддерживающий, например, несколько европейских языков и азиатские системы отображения. И даже если вы его найдёте, размер файла будет очень велик. Поэтому не бойтесь подбирать отдельные шрифты для разных языков, если вам нравятся их стили.
Конечно, не все тексты должны быть обязательно заданы в коде. Некоторые текстовые элементы представлены в графике. Кроме того, существуют другие различные визуальные элементы, о которых тоже нужно подумать.
Текстовая графика
Большинство элементов текстовой графики вообще не требует локализации. Например, имена персонажей остаются одинаковыми во всех языках (если вы не будете их локализовать). Поэтому всю графику с их именами (например, бейджи, значки игроков и т.д.) можно оставить неизменной.
Однако, значимые имена, в которых, например, есть метафоры или игра слов, тоже, возможно, потребуют локализации, в противном случае некоторые игроки не смогут оценить шутку. Конечно же, нужно подумать не только об именах персонажа, но и о названиях уровней, оружия и игровых предметов.
Самое важное — не пропустить текстовую графику, влияющую на геймплей. Это может быть что-то простое, вроде элемента UI внутри мини-игры, но вы будете жалеть о том, что упустили такие мелкие детали.
Как локализовать текстовую графику в Unity
Определившись с текстовой графикой, которую нужно локализовать (и с той, которую нужно оставить в покое), с помощью Unity вы сможете с лёгкостью переключаться между типами графики на основе выбранного пользователем языка. Есть три способа, каждый из которых имеет свои плюсы и минусы:
- Создание атласов в упаковщике спрайтов (Sprite Packer)
- Создание отдельной графики и вызов её при необходимости
- Замена графики текстом и элементами UI
Можно достичь такого же визуального уровня, создавая отдельную локализованную графику и вызывая её при необходимости, но это наименее эффективный подход. Если вы не будете аккуратны, игра будет работать слишком медленно.
Ещё один вариант — полностью заменить графику текстовыми строками и элементами UI. Они могут выглядеть не так хорошо, как графика, но это самый экономный с точки зрения ресурсов подход, позволяющий максимизировать скорость работы игры. Также его можно встроить в стандартный процесс локализации, передав переводчику тексты вместе с другими локализуемыми строками.
7. Используйте AssetBundle движка Unity
Бандлы AssetBundle в Unity позволяют создавать пакеты файлов, загружаемые пользователями только при необходимости. Это значит, что можно значительно уменьшить общий размер игры, в то же время предоставив полные ресурсы для любой аудитории.
Например, пользователи будут загружать только тексты на французском, если этот язык выбран основным в игре. В противном случае им не нужны эти файлы, которые будут храниться на серверах, ожидая скачивания.
Это не только значительно повышает скорость благодаря снижению количества загружаемых ресурсов, но и делает игры меньше и быстрее, что позволяет скачивать их в первую очередь. Но самое лучшее, что вам не приходится идти на компромиссы в отношении файлов и ресурсов, создаваемых для локализации. Можно предоставлять игры любой нужной аудитории и при этом знать, что пользователей не будут ограничивать ненужные им ресурсы.
Итак, это была инструкция для начинающих по локализации игр в Unity. Плохие новости в том, что невозможно выполнить её в одиночку – вам необходимы профессиональные переводчики. Однако, есть и хорошие новости: Unity делает управление процессом локализации гораздо проще.
Но движок всё-таки не может научить вас делать локализацию правильно, так что обратитесь к тем, кто поможет вам адаптировать игры под иностранную аудиторию.
Интеграция текста в Unity

Появившись в 2005 году, среда разработки Unity постепенно завоевала огромную популярность. Поддержка более двух десятков платформ (персональных компьютеров, игровых консолей, мобильных устройств, интернет-приложений), визуальная среда разработки и модульность пришлись по вкусу всем — как инди-разработчикам, так и большим опытным командам. Мы расскажем вам о нескольких неочевидных технических проблемах локализации проектов в Unity, чтобы когда-нибудь перед вами в самый неподходящий момент не возникла необходимость основательно переделывать проект.
Шрифты
С чего начинается внутриигровой текст? Конечно, со шрифта.
Стандартным средством работы со шрифтами в Unity является компонент UI Text. Однако в 2018 году в Unity появился новый компонент: TextMesh Pro — и нет причин им не пользоваться.
В TextMesh Pro работа со шрифтами реализована через элементы Font Asset.
Если вы будете создавать отдельный Font Asset для каждого языка и копировать в него все символы соответствующего этому языку шрифта, то увеличите объем сборки и снизите быстродействие игры. Ваши игроки это точно не оценят, поэтому процесс требует оптимизации. Решение простое: объединить языки в Font Asset’ы по системе письменности (латиница, кириллица и т. п.) и в дальнейшем комбинировать эти группы.
Для начала рассмотрим простой случай: языки с алфавитной письменностью.
Создадим латинский Font Asset и включим в него все символы расширенной таблицы ASCII. Затем создадим один Font Asset с кириллицей. Подключим кириллический Font Asset к латинскому как Fallback (т. е. дополнительный набор, к которому игра обращается при отсутствии нужного символа в основном наборе). Можно подключить неограниченное количество элементов Fallback, поэтому все языки Европы умещаются всего в нескольких FontAsset’ах!
Алгоритм, по которому игра ищет нужный символ в наборах (например, при пользовательском вводе), выглядит следующим образом:

Языки с иероглифической письменностью требуют иной стратегии.
Вот пример для японского:
- Создать Font Asset и импортировать в него символы хираганы (46 уникальных знаков, составляющих основу японской письменности).
- Создать по одному Font Asset с символами катаканы (46 уникальных знаков, используемых в основном для записи слов неяпонского происхождения) и кандзи (2136 китайских иероглифов, используемых в японском языке).
- Добавить Font Asset’ы катаканы и кандзи к Font Asset хираганы в качестве Fallback.
Алгоритм поиска выглядит так:

Для упрощенного китайского:
- Создать Font Asset и импортировать в него все иероглифы, использованные во внутриигровых текстах.
- Создать Font Asset для иероглифов из первой категории списка Table of General Standard Chinese Characters (3500 минус те, что уже есть в Primary Font Asset).
- Создать Font Asset для иероглифов из второй категории (3000 минус имеющиеся в Primary Font Asset).
- Создать Font Asset для иероглифов из третьей категории (1605 минус имеющиеся в Primary Font Asset).
- Подключить Font Asset’ы из пп. 2–4 к Font Asset из п. 1.
Для наглядности изобразим отношения подмножеств иероглифов на диаграмме:

*Table of General Standard Chinese Characters
Параметры Sampling Point Size и Padding
При создании Font Asset в проекте (окно Font Asset Creator -> Font Settings) обратите внимание на параметр Sampling Point Size. Он определяет, насколько точно на экране будет отрисован каждый символ из шрифта. Не углубляясь в технические подробности, скажем лишь, что если в своем проекте для текстов вы используете атласы текстур с разрешением 2048 × 2048 (оптимально для мобильной игры), то лучшим выбором будет значение 72 пункта.

С параметром Sampling Point Size тесно связан параметр Padding. Он определяет ряд визуальных эффектов текста: интервал между символами в тексте, смещение тени или сияния символов, толщину контура символов и т. д. Рекомендуется выбирать значение Padding, лежащее в пределах 7–10 % от Sampling Point Size. Так, для Sampling Point Size = 72 лучше выбрать Padding = 6.
Подключая Font Asset в качестве Fallback к основному Font Asset, убедитесь, что соотношение Sampling Point Size / Padding в подключаемом Fallback’е равно или кратно этому же соотношению в основном FontAsset — иначе символы из разных наборов будут отрисовываться по-разному.
Например, в Primary Font Asset мы задали соотношение Sampling Point Size / Padding = 72/6. Тогда для элемента Fallback выберем соотношение Sampling Point Size / Padding = 48/4 (или даже 36/3).
Подробная информация о создании элементов Font Asset приведена здесь.
Словари
Разобравшись со шрифтами, перейдем к смыслу ваших внутриигровых текстов.
Чтобы игроки в Германии имели шанс понять, что написано на экране, по меньшей мере нужно, чтобы оригинал и перевод соответствовали друг другу. Такие соответствия собираются в отдельные текстовые файлы, называемые в локализации «словарями». Информация в словарях организована в виде пар «ключ: значение». Ключом может быть ID строки или даже сам исходный текст, а значением должен быть перевод этой строки на требуемый язык.
В самом начале работы над проектом нужно ответить на фундаментальный вопрос — какой формат должен иметь словарь? Unity поддерживает около десятка форматов текстовых файлов, но наибольшее распространение у локализаторов получили пять: JSON, XML, YAML, CSV и PO. На последних двух остановимся подробнее.
Формат CSV
Простейший формат для словаря — CSV (Comma-Separated Values). В таком файле хранятся данные, разделенные запятой (или точкой с запятой). Универсальность этого формата позволяет работать с этими файлами в любом табличном процессоре, а также загружать их в специализированные средства автоматизированного перевода (memoQ, Trados и т. п.).
В первом столбце словаря следует расположить ключи, а в остальных —значения:

Если ваш проект не предполагает десятков тысяч слов и вы допускаете фанатскую помощь в локализации, то хорошим выбором для вас станет платформа Google Spreadsheets. Синхронизацию онлайн-словарей в Google Spreadsheets и текста в проекте можно автоматизировать с помощью бесплатного плагина Simple Localization.
Формат Portable Object
Файлы человеко-читаемого формата PO (Portable Object) предусмотрены стандартом gettext — библиотекой проекта GNU для интернационализации. Отличие этой библиотеки в том, что в ней в качестве идентификаторов строк используются сами исходные строки на английском языке, а не замысловатые конструкции. Это несколько облегчает работу, если внутриигровые тексты вы изначально пишете на английском. Кроме того, в библиотеке gettext есть поддержка множественного числа — пользу такой функции для локализации трудно переоценить.
Каждая запись в файле PO содержит связь между оригинальным фрагментом текста и соответствующим ему переводом. Как правило, один файл PO заводится на один язык перевода. Типовая запись в файле PO выглядит так:
#: ссылка на исходный код программы
# | msgid предыдущая строка (на английском)
msgid исходная строка (на английском)
msgstr перевод строки
Подробное объяснение элементов файла PO можно найти здесь.
Важной частью локализации является файл формата POT (Portable Object Template) — заготовка файла PO для перевода на другой язык. Файлы POT используются для создания новых файлов PO в редакторе и для обновления файлов PO при добавлении новых переводов. Файлы POT имеют такую же структуру, что и файлы PO, только строка для переведенного текста пустая.
Переведенные строки не нужно добавлять в файлы PO напрямую — следует обновлять файлы PO из файлов POT. Для этого вам нужен специальный текстовый редактор. Самым популярным редактором файлов PO является Poedit.
Порядок действий выглядит примерно так:
- Создаем шаблон файла PO в формате POT и сам файл PO (храним их в папке Resources/Languages).
- К текстовому элементу игры, требующему перевода, подключаем скрипт UILocalizeText.cs, который будет контролировать его обновление.
- Для UILocalizeText.cs устанавливаем значение в файлах PO и POT.
- Инициализируем менеджер языков LanguageManager (в его коде используем метод DontDestroyOnLoad(), чтобы он не удалялся с загрузкой новой сцены).
- При смене языка делаем вызов LoadLanguage().
- Обновляем внутриигровые тексты вызовом UpdateAllTextBoxes().
Подробную информацию о локализации с помощью файлов PO и листинги скриптов можно найти здесь.
Теперь вы знаете несколько подводных камней и течений локализации в Unity — значит, она вам уже не так страшна.
Как переводить игры на юнити
Инструкция.
1.Загрузить XUnity.AutoTranslator-ReiPatcher
2.Распаковать в корневую папку.
3.Запустить SetupReiPatcherAndAutoTranslator.exe.
4.Запустить созданной программой ярлык
5.После первого запуска игры программа должна создать
Language=ru (на какой язык переводить)
FromLanguage=en (язык в игре)
MaxCharactersPerTranslation=500
IgnoreWhitespaceInDialogue=False
IgnoreWhitespaceInNGUI=False
OverrideFont= (отвечает за замену шрифтов пример OverrideFont=Corbel Bold Italic)
6.Игра готова.Игру можно запускать через основной exe.
Управления AutoTranslator
ALT + 0: включить интерфейс XUnity AutoTranslator. (Это ноль, а не O)ALT + T:
чередовать переведенные и непереведенные версию всех текстов, предоставляемых
этим плагином.ALT + R: Перезагрузить файлы переводов. Полезно, если вы изменяете
текстовые и текстурные файлы на лету. Не гарантируется работа для всех текстур.ALT + U:
ручной захват. Захват по умолчанию не всегда подхватывает текст. Плагин попытается сделать
поиск вручную.ALT + F: если настроен OverrideFont, будет переключаться между переопределенным
шрифтом и шрифтом по умолчанию.ALT + Q: перезагрузите плагин, если он был выключен