Продолжаю рассказывать о разработке своей интерактивной книги в формате «симулятора поддержки людей, столкнувшихся с аномально-криповым». В этот раз поговорим о локализации, но почти исключительно с технической точки зрения. Т.е., посмотрим что и как переводить или не переводить, а не «где нанять переводчика / какой ИИшкой лучше переводить». Читать далее
Продолжаю рассказывать о разработке своей интерактивной книги в формате «симулятора поддержки людей, столкнувшихся с аномально-криповым». В этот раз поговорим о локализации, но почти исключительно с технической точки зрения. Т.е., посмотрим что и как переводить или не переводить, а не «где нанять переводчика / какой ИИшкой лучше переводить».

Diclaimer: в эту задачку я погрузился с места в карьер, вообще не изучая готовые решения и инструменты, со словами «я программист или как?» Итак...
Шаг 1. Заводим CSV-файлик для хранения айдишников и строк для каждого языка.

Шаг 2. Генерируем CS-файл из него с enum-ом и собственно строками текста.


Шаг 3. Используем в коде как-то так с помощью класса-менеджера, который подставит нужную строку в зависимости от языка.

Да-да, я буквально одной консолькой, написанной на C#, генерирую второй файлик, написанный на C# и включённый в другой проект. При этом я генерирую его тупо как текст, без каких-то хитрых библиотек и валидаций. И работает же! Ну а чего бы ему не работать то?)
Да, в случае с озвучкой я сразу решил, что не буду делать озвучку на других языках, но сделаю субтитры в роликах…

...и расшифровку голосовых сообщений.

Причём, как видите, обе фичи получились полезными и для русскоязычных игроков — как для имеющих ограниченные возможности, так и для тех, кто просто терпеть не может голосовые сообщения.
Да-да, часть присылаемых по сюжету картинок таки требуют перевода! Там, где я картинку делал сам — то просто перевёл в редакторе и подставил текст в новую вёрстку. В более сложных же местах я просил ИИ-шку перерисовать картинку, и там она справилась на ура.

Самая болезненная часть, для понимания которой вам просто необходимо изучить мой пост про скрипты, хранящиеся в Obsidian. Прочитали? Вернулись? Отлично, тогда продолжаем: после обработка obsidian-файла у меня получаются файлики с такой структурой.

Т.е., в них хранится прямо текст вопросов и ответов, а не ID-строчек. Поэтому мой пайплайн из нескольких маленьких консолек выглядит так:
загрузить json-файл, распарсить его и работать уже с понятной структурой
вытащить все строчки в пары «ID – текст», где ID является хэшем от содержимого строки
сохранить эти пары в CSV-файл, одноимённый файлу с диалогом
перевести содержимое файла
другой консолькой сделать копию квеста с суффиксом, соответствующим имени квеста, например для английского будет очевидное «_en»
игра знает, какой язык выбран и в зависимости от этого загружает файл с нужным суффиксом
Причём консольки получились достаточно умные: например, если файл уже существует, он не перетирается с нуля, а дополняется и обновляется. Если я отредактировал строку в русском файле — у неё сменится хэш, и нужно будет заново перевести только такие строки. Удобно? Вполне)
Что дальше
Игра релизнится 14 июля, и через месяц-два я вернусь с рассказом о том, насколько (без)успешно она продалась, как я выводил деньги из Steam, платил за всё это дело налоги и т.п. Если интересно — подписывайтесь, чтоб не пропустить ;-)
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | LLM для игры в ДнД: эволюция подхода | 0 | 7 | 23-06-2026 |
| 2 | Когда контекстное окно кончается, а проект — нет | 5 | 7 | 23-06-2026 |
| 3 | Забытый мультиколор (часть 4) | 0 | 7 | 15-06-2026 |
| 4 | Адаптация в команде есть? А если найду? | 0 | 5 | 17-06-2026 |
| 5 | От мешевых аватаров к искусственному интеллекту в Second Life: как я построил ИИ‑агентов для виртуального мира | 0 | 7 | 19-06-2026 |
| 6 | Как мы разрабатывали TTS для Ил-2 Штурмовик | 5 | 7 | 24-06-2026 |
| 7 | Как желание быстрее читать чужой код превратилось в войну с недетерминизмом LLM | 0 | 5 | 28-06-2026 |
| 8 | Материалы по хакингу на русском | 5 | 7 | 07-07-2026 |
| 9 | Мне надоело писать один и тот же код. Поэтому я сделал Featuregen | 3 | 6 | 09-07-2026 |
| 10 | Основы вёрстки для дизайнера. Часть 1. Введение: как дизайн превращается в живой сайт | 5 | 7 | 07-07-2026 |