Самодельная локализация .NET-игры: дневник разработки

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

Дисклеймер: я подошел к этой задаче «напролом», без глубокого анализа существующих фреймворков и готовых решений, руководствуясь принципом «я разработчик или где?». Итак, поехали.

Интернационализация интерфейса

Этап 1. Создаем CSV-таблицу, где хранятся пары «идентификатор – текст» для каждой языковой версии.

Этап 2. На основе CSV генерируем C#-файл, содержащий enum с ключами и соответствующие строковые константы.

Этап 3. В коде используем специализированный класс-менеджер, который подтягивает актуальный текст согласно настройкам языка игрока.

Да, я написал простую консольную утилиту, которая «на лету» генерирует C#-код. Никаких громоздких библиотек — чистая текстовая генерация. Работает стабильно, нареканий нет.

Озвучка и доступность

Я изначально отказался от дубляжа на другие языки, сделав упор на локализацию субтитров для видеороликов…

…а также текстовые расшифровки для всех входящих голосовых сообщений.

Подобный подход оказался крайне полезен и для основной аудитории: как для людей с особенностями восприятия, так и для тех, кто попросту предпочитает текстовый формат аудиосообщениям.

Графика и локализация

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

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

Самый сложный участок работы. Если вы ознакомились с моим постом об интеграции Obsidian, то знаете, что сценарии хранятся в специфической структуре. Мой автоматизированный пайплайн выглядит следующим образом:

  • Парсинг JSON-файлов для формирования структурированных данных.
  • Экспорт контента в пары «ID (хэш контента) – текст».
  • Генерация CSV-таблиц по каждому диалогу.
  • Перевод контента.
  • Создание дубликатов файлов для каждого языка с соответствующим суффиксом (например, «_en»).
  • Игровой движок динамически подгружает нужный файл в зависимости от выбранного языка.

Утилиты получились довольно «умными»: при повторном запуске они не перезаписывают данные, а обновляют только измененные строки (те, у которых поменялся хэш). Это значительно экономит время и силы.

Что дальше?

Релиз намечен на 14 июля. Спустя пару месяцев после выхода я обязательно поделюсь отчетом о коммерческих результатах, нюансах вывода средств со Steam и налоговых аспектах. Подписывайтесь, чтобы ничего не пропустить!

Y

 

Источник

Читайте также