ДвижкиРуководстваFAQPatreonDiscordСкачать
Войти
RuneTranslate · перевод японских игр от и до
ДвижкиРуководстваСравнениеТекст на картинкахРедактор сохраненийРежим читовFAQСкачатьPatreonDiscordYouTubeКонфиденциальностьУсловияКонтакты
Все статьи
unity · xunity-autotranslator · troubleshooting

XUnity.AutoTranslator не переводит

18 авг. 2026 г.·9 мин чтения

XUnity.AutoTranslator — лучший переводчик времени выполнения, какой есть у Unity, и когда он молчит, причина почти всегда в одном из пяти конкретных пунктов: игра собрана под IL2CPP, текст задаётся через путь, который перехват не отлавливает, рисующий его UI-фреймворк не включён, строка длиннее лимита символов или точка доступа сама себя отключила. Вот как понять, какой случай у вас.

XUnity.AutoTranslator бесплатен, распространяется под лицензией MIT, активно поддерживается и остаётся лучшим инструментом перевода во время выполнения, какой есть у Unity. Он работает так: перехватывает момент, когда игра передаёт строку текстовому компоненту, и подставляет перевод до того, как её нарисуют. Именно из-за такого устройства ему вообще не нужно знать форматы файлов игры — и именно поэтому, когда он не срабатывает, он не срабатывает молча. Ничего не падает. Игра просто идёт на японском.

Пять пунктов ниже покрывают почти каждое сообщение вида «оно не переводит». Идите по ним по порядку: у каждого своё лечение, а угадывание между ними стоит многих вечеров.

Сначала: читайте лог, а не экран

Плагин громко пишет о том, что делает, и лог — единственное место, где он это говорит. При установке через BepInEx смотрите BepInEx/LogOutput.log. Собственный лог Unity лежит рядом: <Game>_Data/output_log.txt в старых сборках или %APPDATA%/../LocalLow/<Company>/<Game>/Player.log в новых.

  • Упоминается ли в логе загрузка XUnity.AutoTranslator вообще? Если нет, проблема в загрузчике, а не в переводчике — вы на причине номер один.
  • Перечисляется ли инициализация точки доступа, а позже — её отключение после серии ошибок? Это причина номер пять.
  • Пишутся ли переводы в BepInEx/Translation/<lang>/Text/_AutoGeneratedTranslations.txt? Если этот файл наполняется корректными переводами, которые никогда не появляются на экране, сетевая сторона в порядке, а отображение — нет.
  • Нажмите ALT+1 в игре, чтобы открыть окно агрегатора переводов. Если в нём есть строки, на которые вы смотрите, перехват их видит. Если оно остаётся пустым, перехват их не видит вовсе.

Это последнее разделение — «переведено, но не показано» против «никогда не увидено» — и есть развилка. Всё дальнейшее висит на ней.

1. Игра собрана под IL2CPP

Unity выпускает игры на двух совершенно разных средах выполнения. Mono держит C# игры обычными сборками .NET в <Game>_Data/Managed/, среди них Assembly-CSharp.dll, с сохранёнными именами типов и методов. IL2CPP заранее переводит этот C# в C++ и компилирует в нативную GameAssembly.dll; всё, что уцелело от системы типов, упаковано в <Game>_Data/il2cpp_data/Metadata/global-metadata.dat.

Перехвату во время выполнения нужно найти метод и подменить его. На Mono это обычная задача рефлексии. На IL2CPP управляемого метода, над которым можно рефлексировать, нет: код нативный, и единственный путь обратно к именам, полям и адресам методов — разобрать global-metadata.dat и реконструировать раскладку. Это совсем другой загрузчик, а не настройка.

  • Как понять за пять секунд: GameAssembly.dll рядом с exe игры плюс папка il2cpp_data означают IL2CPP. Папка Managed/, полная DLL, означает Mono.
  • Для IL2CPP нужен BepInEx в варианте IL2CPP и соответствующий ему релиз XUnity.AutoTranslator, собранный под него. Сборка под Mono просто не загрузится — она попросту не появится в логе, а выглядит это ровно как «плагин сломан».
  • Разрядность тоже важна. 64-битной игре нужен 64-битный загрузчик. Несовпадающая пара отваливается так же тихо.
  • Некоторые игры поставляются с неразбираемым файлом метаданных. Упаковщики и слои защиты от вмешательства шифруют или перестраивают global-metadata.dat, и любой инструмент, которому нужно его прочитать, — включая перехват — на этом останавливается.

2. Плагин загружается, а текст так и не появляется

Плагин есть в логе, точка доступа инициализирована, _AutoGeneratedTranslations.txt растёт — а экран не меняется. Либо перехват переводит строку, которую игра потом выбрасывает, либо игра задаёт текст через путь, который перехват не отлавливает.

TextGetterCompatibilityMode

Немало игр читают обратно только что заданный текст — чтобы измерить его, дописать к нему, сравнить с чем-то. Как только компонент держит переведённую строку, это обратное чтение возвращает перевод, собственная логика игры работает с текстом, который она не писала, и результат бывает разный: от строки, откатывающейся к оригиналу, до развалившейся вёрстки. TextGetterCompatibilityMode в AutoTranslatorConfig.ini заставляет геттер отдавать игре её оригинальную строку, пока игрок видит переведённую. По умолчанию он выключен, потому что стоит работы на каждом чтении, и это первый переключатель, который стоит попробовать, когда текст мигает, откатывается или отказывается держаться.

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

3. Переводится только часть текста

Меню переводятся, диалоги — нет. Или диалоги переводятся, а все кнопки остаются на японском. Почти всегда это невключённый UI-фреймворк: плагин перехватывает каждый из них отдельно, и не все включены по умолчанию.

  • Включены по умолчанию: UGUI (встроенный интерфейс Unity), NGUI, TextMeshPro и UIElements (EnableUGUI, EnableNGUI, EnableTextMeshPro, EnableUIElements). Вместе они покрывают большинство современных игр, в том числе фреймворки визуальных новелл вроде Utage, которые рисуют через них, а не имеют собственного переключателя.
  • Выключены по умолчанию: IMGUI и устаревший компонент TextMesh. IMGUI — это immediate-mode GUI самой Unity: он перерисовывается каждый кадр, поэтому его перехват означает перевод на каждом кадре, и отключён он ради производительности, а не потому, что не работает.
  • Флаги лежат в `AutoTranslatorConfig.ini` как EnableIMGUI, EnableTextMesh и им подобные. Поставьте True тому, который использует ваша игра, и перезапустите.
  • Старые и японские додзин-игры на Unity — обычные случаи IMGUI. Игра, чьи меню выглядят как простые серые прямоугольники со стандартным оформлением, — сильная подсказка.

Если включение всего ничего не меняет, текст вообще не идёт через текстовый компонент Unity — возвращайтесь к причине номер два.

4. Длинные строки пропускаются, а не переводятся

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

Эту причину ищут дольше всего, потому что улик почти нет: большая часть игры переводится, а один абзац — нет. Обычные жертвы — визуальные новеллы: длинный блок повествования или монолог без единого переноса легко перебирает 200 символов, и это ровно тот текст, который вы больше всего хотели прочитать переведённым.

Поднимите значение в AutoTranslatorConfig.ini и перезапустите. Учтите, что вы поднимаете и стоимость каждого запроса: у бесплатных точек доступа свои потолки длины на запрос, и они начнут отклонять запросы, которые их превышают, — так что слишком большое значение меняет молчаливый пропуск на видимую ошибку точки доступа. Диапазона примерно 500–1000 хватает обычной прозе визуальных новелл.

5. Точка доступа отказала или ограничила вас по частоте

Точки доступа XUnity по умолчанию — это бесплатные публичные сервисы перевода, к которым обращаются так же, как обратился бы браузер. Они ничем не гарантированы и меняются. Когда серия запросов проваливается подряд, плагин отключает точку доступа до конца сессии, вместо того чтобы долбить её, — решение осознанное и правильное, но оно же означает, что всё после этого момента молча остаётся непереведённым, пока вы не перезапустите игру.

  • Поищите в логе строку об отключении. Если она там есть, лечение — перезапуск плюс что-то изменённое, а не ещё немного ожидания.
  • Замедлите очередь. MaxTranslationsQueuedPerSecond и настройки задержек существуют потому, что лимиты частоты срывают именно всплески. Перемотка визуальной новеллы отправляет сотни запросов за секунды.
  • Смените точку доступа. Если у одного бесплатного сервиса плохой день, у другого обычно нет.
  • Возьмите точку доступа с ключом. Настоящий DeepL или платный API-ключ убирают всю эту категорию проблем — ценой платного API-ключа.
  • Обновите плагин. Когда меняется протокол бесплатной точки доступа, исправление приходит релизом. Двухлетняя сборка против уехавшего вперёд сервиса — частая причина «раньше же работало».

Бонус: текст переводится и рисуется квадратами

Это вообще не сбой перевода. Игра вышла с атласом шрифта, в котором ровно те глифы, что нужны её исходному языку, а вашему целевому языку нужны глифы, которых там нет, поэтому каждый недостающий символ рисуется квадратом или пустотой. Для этого у XUnity есть OverrideFont и OverrideFontTextMeshPro. Запомните признак: квадраты означают недостающий глиф, а буквальные символы `?` — проблему кодировки где-то раньше по цепочке. Это разные баги, и настройка шрифта чинит только первый.

Порядок разбора

  1. Определите Mono или IL2CPP по наличию GameAssembly.dll и убедитесь, что поставили соответствующий загрузчик.
  2. Откройте BepInEx/LogOutput.log и убедитесь, что плагин загрузился и точка доступа инициализирована.
  3. Нажмите ALT+0 в игре, чтобы открыть собственное окно плагина — если ничего не появилось, плагин не загружен. ALT+1 открывает Translation Aggregator: пустой означает, что перехват не видит текст; заполненный — что видит.
  4. Если перехват его видит, а экран не меняется, включите TextGetterCompatibilityMode.
  5. Если переводится только часть игры, включите IMGUI и устаревший TextMesh.
  6. Если непереведёнными остаются конкретные длинные строки, поднимите MaxCharactersPerTranslation со стандартных 200.
  7. Если всё встало посреди сессии, найдите в логе строку об отключении точки доступа, затем перезапустите с более медленной очередью или другой точкой доступа.

Когда перехват — неподходящая форма для задачи

Каждый из сбоев выше сводится к одному корню: перехват во время выполнения может перевести только тот текст, при появлении которого он присутствует. Если игра не задаёт строку через известный плагину API, или текст был нарисован до загрузки плагина, или среда выполнения не отдаёт метод для перехвата — настраивать нечего. Инструмент делает свою работу правильно, а текст просто вне досягаемости.

Структурная альтернатива — работать с файлами, а не с кадром. Инструмент файлового уровня открывает собственные ресурсы игры, вытаскивает строки, переводит их и записывает переведённую копию игры — так что текст уже на целевом языке до того, как движок вообще его загрузит. Ни перехвата, ни точки внедрения, ни флага под каждый фреймворк, а лимит символов — какой держит формат. Именно это делает RuneTranslate на Unity и ещё 16 движках и форматах.

Компромиссы реальны и идут в обратную сторону. Инструмент файлового уровня достаёт только текст, который лежит в файлах: для Unity это TextAsset, строковые поля MonoBehaviour, скрипты StreamingAssets, таблицы локализации и бандлы ресурсов, включая AES-шифрованные бандлы Addressables. Ему нужен шаг экспорта до игры, а не перевод по ходу. И он ничего не может поделать с текстом, который игра собирает во время выполнения из кусков. Unity — движок best-effort ровно поэтому: что именно конкретная игра выносит наружу, разнится колоссально, и открытие проекта как раз и говорит, что у вас за случай.

  • Текст, вкомпилированный в код C#, — жёсткая граница. На сборках Mono RuneTranslate читает строковые литералы из сборки игры встроенным сайдкаром, с проверкой того, что с ними делает место вызова, чтобы никогда не перевести имя сцены или параметр аниматора. На сборках IL2CPP скомпилированный код остаётся вне охвата.
  • А вот текст ресурсов на IL2CPP доступен. Строковые поля компонентов читаются на IL2CPP через реконструкцию информации о типах из метаданных игры — тот же global-metadata.dat, что нужен перехвату, только используемый для другой цели.
  • Он читает собственный вывод XUnity. Если у вас уже есть заполненный _AutoGeneratedTranslations.txt, RuneTranslate разбирает этот файл и может перевести значения в нём, не трогая ключи. Уже сделанная работа не выбрасывается.
  • Шрифты решаются на экспорте — в игру внедряется запасной шрифтовой ресурс, чтобы целевой язык, который оригинальный шрифт никогда не покрывал, всё же отрисовывался.

Девять провайдеров, трём из которых вообще не нужен API-ключ, — Google, бесплатный DeepL и модели DeepL Classic / Next-gen, — плюс API DeepL, OpenAI, Anthropic, DeepSeek, любой OpenAI-совместимый эндпоинт и локальная модель через Ollama или LM Studio. Бесплатный тариф открывает каждый движок и каждого провайдера; он ограничивает пропускную способность и держит один проект за раз. Windows 10/11 либо Linux и Steam Deck под Wine или Proton. При первом запуске нужен бесплатный вход через Patreon. На выходе — играбельная переведённая сборка, которая остаётся у вас.

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

Куда идти дальше

  • Как перевести игру на Unity — полное руководство, включая то, что Unity выносит наружу, а что нет.
  • Страница движка Unity — поддерживаемые форматы и текущие ограничения в одном месте.
  • RuneTranslate против XUnity.AutoTranslator — два подхода рядом и случаи, где выигрывает каждый.
  • Выбор провайдера перевода — какие движки хорошо справляются с японской прозой и какие не стоят ничего.
  • Основы глоссария — как удержать имена персонажей и терминологию едиными по всему скрипту.
  • Все поддерживаемые движки — если игра всё-таки окажется не на Unity.
Похожие материалы
01

Почему перевод отображается квадратами

unitytextmeshprofontstroubleshooting18 авг. 2026 г. · 9 мин
Читать →
02

Как перевести игру на Unity на английский

unitytutorialengine9 июн. 2026 г. · 6 мин
Читать →
03

Как перевести игры на RPG Maker

rpg-makerhow-toenginecontrol-codes18 авг. 2026 г. · 10 мин
Читать →

Готовы попробовать RuneTranslate?

Бесплатный тариф открывает все движки и всех провайдеров перевода. Supporter ($3/mo) открывает полную скорость.

Скачать для Windows