Как сделать русификатор для игры
Русификатор — единственное, что фанатский переводчик на самом деле производит: строки, привязанные к тем местам в игре, которым они принадлежат. Здесь вся работа от начала до конца — выбор между оверлеем во время выполнения и пропатченной сборкой, извлечение текста, перевод, правка того, что машина делает неверно, экспорт, тест в игре и раздача файла русификатора вместо самой игры.
Русификатор — это не копия игры. Это работа переводчика: строки плюс достаточно сведений о том, какая строка куда относится, — в форме, которую другой человек может применить к своей собственной копии. В каждом языке для этой вещи своё слово: у нас — русификатор, у корейцев — 한글패치, у китайцев — 汉化. Артефакт везде один и тот же, и работа по его созданию тоже.
Два вида русификатора, и эта развилка решает всё
Прежде чем трогать текст, решите, какую из двух вещей вы собираете: почти каждое дальнейшее решение вытекает отсюда.
Оверлей во время выполнения переводит, пока игра идёт. Рядом с игрой что-то загружается — плагин внутри движка, текстовый хук, читающий память игры, или экранный захват, читающий пиксели, — ловит каждую строку в момент отрисовки и подставляет перевод. На диске в игре ничего не меняется. XUnity.AutoTranslator — известный пример для Unity, а MTool работает так для RPG Maker.
Пропатченная сборка кладёт перевод в собственные файлы игры. Текст читается из тех данных, которые движок реально загружает, переводится, записывается обратно, и на выходе получается папка с игрой, которая запускается и играется сама по себе, без чего-либо запущенного рядом. Это то, что делает RuneTranslate, и то, что делает Translator++ на движках, которые он разбирает.
Честный размен, прямым текстом:
- Оверлею не нужна работа под конкретную игру — он либо цепляется к движку, либо нет, — но ничего не сохраняется. Каждая строка переводится заново в каждом прохождении, на каждой машине, и каждому игроку приходится самому ставить и настраивать оверлей.
- Оверлей достаёт текст только в момент отрисовки. Текст, впечённый в графику, текст, который никогда не проходит через перехватываемый компонент, и текст, нарисованный собственным рендерером, остаются непереведёнными.
- Пропатченная сборка стоит вам шага экспорта и прохода тестирования, и её приходится делать заново, когда игра обновляется. Взамен вы получаете постоянный результат: перевод лежит в файле, поэтому игра просто переведена — офлайн, у любого, кто применит вашу работу.
- Пропатченная сборка даёт редактируемую запись. Через полгода можно исправить одну плохую строку, ничего не переводя заново, — у оверлея исправлять нечего, есть только кэш, который можно очистить.
Если вы переводите для себя, один раз, на движке, который не удаётся разобрать, оверлей — разумный ответ, и стыдиться тут нечего. Если вы намерены отдать свою работу другим людям, вам нужна пропатченная сборка: русификатор можно раздать только тогда, когда он существует как файл.
Что нужно до начала
- Своя копия игры, установленная и запускающаяся. Сначала поиграйте в неё несколько минут — нельзя судить, читается ли перевод правильно, если вы никогда не видели контекста.
- Знание того, какой у неё движок. От этого зависит всё: как текст выходит наружу и как возвращается обратно.
- Целевой язык, на котором вы действительно читаете. Машинный перевод даёт черновик; русификатора он не даёт.
- Место на диске под вторую копию игры. Пропатченная сборка — это отдельная папка, оригинал никогда не изменяется.
Определить движок обычно можно, просто заглянув в папку игры. Папка www/data или data с файлами JSON — это RPG Maker MV или MZ; папка <Game>_Data — Unity; game/*.rpy или архивы .rpa — Ren'Py; архивы .xp3 — Kirikiri. Полный список того, что удаётся разобрать, с приметами каждого движка, — на странице движков: RuneTranslate покрывает 17 движков и форматов, а определение автоматическое, как только вы укажете папку.
Процесс
Независимо от движка, русификатор делается одними и теми же пятью шагами в одном и том же порядке. Соблазн — пропустить третий. Не надо.
- Извлечение — прочитать каждую переводимую строку из собственных файлов игры в список, с которым можно работать.
- Перевод — прогнать список через машинного провайдера и получить полный первый черновик.
- Вычитка — пройти по строкам, которые машина стабильно портит: имена, гоноративы, терминология, всё, где есть плейсхолдер.
- Экспорт — записать переводы обратно в формат игры и получить играбельную сборку.
- Тест — запустить эту сборку и действительно в неё поиграть.
Извлечение
Извлечение — там, где знание движка окупается. Диалоги редко лежат в обычном текстовом файле: RPG Maker хранит их в кодах команд событий, Unity — в блобах TextAsset и полях MonoBehaviour внутри бинарных файлов ресурсов, Kirikiri — в скриптах внутри зашифрованного архива, Unreal — в таблицах .locres внутри .pak. Хороший экстрактор знает ещё и то, что вам отдавать не надо: имя сцены, ключ переменной, операнд сравнения и путь к ресурсу выглядят строками и все ломают игру при переводе. Текст, нарисованный поверх графики, — отдельная задача с отдельным инструментом; см. перевод изображений.
Перевод
Получите полный машинный черновик до того, как править руками, — так вы будете исправлять текст, а не смотреть в пустой столбец. В RuneTranslate 9 провайдеров: Google, бесплатный DeepL и DeepL Classic / Next-gen вообще не требуют API-ключа; остальные — API DeepL, OpenAI, Anthropic Claude, DeepSeek, любой OpenAI-совместимый эндпоинт и локальная модель через Ollama или LM Studio. Бесплатный тариф открывает их всех и все движки; ограничивает он пропускную способность и удержание больше одного проекта за раз. Какой провайдер подходит какому типу игр — в сравнении провайдеров.
Вычитка
Это шаг, ради которого русификатор вообще стоит ставить. Машинный вывод бегл и уверенно неверен в предсказуемых местах, поэтому проходите эти места намеренно, а не читайте всё подряд сверху вниз:
- Имена персонажей. Машина переводит их по-разному каждый раз, а иногда переводит как слова. Определитесь с написанием один раз.
- Гоноративы и регистр речи. Оставлять -сан / -тян или убирать — решение на весь проект, а не на строку. Как и то, говорит ли персонаж официально.
- Терминология. Навыки, предметы, места, системы — всё, что игра придумала. Навык, названный тремя разными способами в меню, подсказке и боевом логе, читается как сломанная игра.
- Плейсхолдеры и управляющие коды. Всё вроде
\C[1],{player}или[name]должно уцелеть нетронутым. Переведённый плейсхолдер — это краш или пустота, а не опечатка. - Строки, вернувшиеся без изменений. Обычно звукоподражания и обычно признак того, что провайдер на этой строке сдался.
Единство терминологии
Русификаторы чаще забрасывают из-за разнобоя, чем из-за корявой прозы. Игроки простят деревянную фразу; они не простят, что один и тот же персонаж в одном разговоре зовётся Юки, Юуки и Снежка, потому что это мешает им понимать, кто говорит. Лечение — глоссарий: список исходных терминов и точных целевых, в которые каждый обязан превратиться, применяемый до перевода, чтобы у провайдера не было шанса импровизировать. Собирайте его рано, из имён, встреченных в первый час, и дополняйте по ходу — руководство по глоссарию объясняет, как он взаимодействует с маскированием тегов и почему ему место в начале, а не в проходе «найти и заменить» в конце.
Шрифты
Японская игра поставляется с японским шрифтом, а в японском шрифте часто нет глифов для кириллицы, греческого, хангыля, тайского и букв с диакритикой польского, турецкого и вьетнамского. Переведите на такой язык — и игра нарисует пустые квадраты: перевод верен, шрифт просто не может его нарисовать. Часть движков закрыта за вас: экспорт Ren'Py кладёт в сборку подходящий шрифт и переназначает на него шрифты игры. Там, где это не автоматически, замена файла шрифта внутри экспортированной сборки обычно решает дело. Буквальные вопросительные знаки — совсем другая беда: это собственная строковая кодировка движка отказывает символу, а не отсутствующий глиф, — и различие стоит знать, прежде чем идти искать не то лечение. Оба случая разобраны в FAQ.
Тестируйте сборку
Экспорт без ошибок — это ещё не протестированный русификатор. Запустите его и проверьте то, что ломается тихо:
- Игра доходит до титульного экрана и начинает новую игру. Сборка, падающая здесь, обычно упала на строке, которая никогда не была текстом, — на переведённом идентификаторе.
- Окна сообщений держат свой текст. Переводы длиннее японского: ищите строки, вылезающие за край окна или обрезанные.
- Меню, названия предметов и подсказки — места, где длинное слово переполняет кнопку фиксированной ширины.
- Сохранение из оригинальной игры по-прежнему загружается, и новое сохранение, сделанное в пропатченной сборке, тоже загружается.
- Одна сцена в глубине игры, а не только начало. Пробелы извлечения проявляются как непереведённые куски, а не как ошибки.
Как раздавать свою работу
Вот часть, которая решает, можно ли вашу работу вообще кому-то отдать. Вы сделали перевод — строки. Игра не ваша, и упаковка её переведённой копии означает распространение чужой игры. Честная форма русификатора — только сама работа, применяемая каждым получателем к копии, которая у него уже есть.
RuneTranslate экспортирует ровно это в виде файла .rtpatch. В нём идентификаторы юнитов, исходные строки, по которым каждый перевод сопоставляется, и ваши переводы. Ни файлов игры, ни ресурсов, ни бинарников — файл содержит ваш текст и ничего больше, поэтому он достаточно мал, чтобы приложить его к сообщению, и безопасен для передачи кому угодно.
На стороне получателя три шага:
- Он создаёт проект из своей собственной установленной копии той же игры, и на его машине извлекаются те же строки.
- Он импортирует ваш
.rtpatch, и эти строки заполняются вашими переводами. - Он экспортирует свою играбельную сборку из своих файлов игры.
Сопоставление идёт сначала по идентификатору юнита, а когда идентификаторы разошлись — из-за обновления игры или изменений в экстракторе — откатывается на сопоставление по самой исходной строке. Именно этот запасной путь сохраняет русификатор рабочим после патча игры. Импорт проверяет, что движок и целевой язык совпадают, прежде чем что-либо применять, поэтому патч, сделанный для игры на Unity, нельзя случайно уронить в проект Ren'Py. На бесплатном тарифе обмен патчами ограничен одним экспортом и одним импортом в скользящее трёхдневное окно; всё остальное в создании патча по функциям не урезано.
Тот же файл — это и способ работать командой: один человек переводит сюжет, другой меню, и патчи сливаются в один проект. И это же способ сохранить свою работу при обновлении игры: заново извлечь из новой версии, импортировать старый патч — и внимания потребуют только строки, которые действительно изменились.
Можно ли распространять саму игру — решает правообладатель, а не вы и не мы. Раздавайте русификатор, говорите людям, под какую версию игры он сделан, и пусть приносят свою копию.
Особенности по движкам
Всё выше — форма работы. По движкам различается то, где лежит текст, что даёт экспорт и что остаётся вне досягаемости, — и это стоит прочитать до старта, а не после того, как экспорт вас удивит: Unity, RPG Maker, Ren'Py или полный список движков для остальных четырнадцати.
RuneTranslate работает на Windows 10 и 11, а также на Linux и Steam Deck под Wine или Proton. При первом запуске нужен бесплатный вход через Patreon; бесплатный тариф открывает каждый движок и каждого провайдера. Если вы взвешиваете его против оверлеев и тулкитов, к которым обычно тянутся первыми, сравнения раскладывают, что на деле даёт каждый подход.
Готовы попробовать RuneTranslate?
Бесплатный тариф открывает все движки и всех провайдеров перевода. Supporter ($3/mo) открывает полную скорость.
Скачать для Windows
