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

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

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

Вы перевели игру, экспорт прошёл чисто, а в окне диалога — сплошные □□□. Это почти никогда не проблема перевода: это проблема шрифта, и лечится она иначе, чем две поломки, с которыми её путают. Здесь — как отличить недостающий глиф от отброшенного символа и от кракозябр и как чинить каждый случай в Unity, TextMeshPro, Ren'Py и инструментах времени выполнения.

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

Что такое квадрат на самом деле

Шрифт — это таблица соответствия кодовой точки Unicode и формы. Когда рендерера просят нарисовать кодовую точку, которой в шрифте нет, он подставляет отсутствующий глиф шрифта — обычно пустой или перечёркнутый прямоугольник, формально называемый .notdef, а во всём остальном мире известный как тофу-квадрат. Один квадрат равен одному символу, который шрифт не смог нарисовать. Весь механизм в этом.

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

Три симптома — три разные проблемы

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

  • Квадраты □□□ — символы верные, шрифт не может их нарисовать. Чините шрифт.
  • ???? — символов больше нет. Что-то перекодировало строку в более узкий набор символов и заменило всё, что не смогло представить. Никакой шрифт их не вернёт. Чините кодировку или выберите целевой язык, который формат способен удержать.
  • Искажённая латиница вроде テキスト или テキスト, показанное как テキスト, — кракозябры. Байты верные, декодер неверный: текст, записанный в одной кодировке, читается как другая. Чините то, какая кодировка читается.

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

Квадраты: недостающий глиф

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

Вопросительные знаки: символы были отброшены

Когда строку приходится записывать обратно в формат, который хранит текст в устаревшей одно- или двухбайтовой кодировке, каждый символ вне этой кодировки должен чем-то стать. По традиции этим чем-то оказывается ?. Shift-JIS и cp932 держат японский, ASCII и почти ничего больше; строгое поле ASCII не держит ни греческого, ни кириллицы, ни тайского, ни CJK. Это свойство формата файла, а не шрифта, и происходит оно на экспорте — к моменту, когда игра читает файл, информация уже потеряна.

У RuneTranslate есть один движок, где это живое ограничение, и оно названо, а не спрятано: YU-RIS перекодирует свои строки в cp932, что дружелюбно к английскому и другой латинице, но тайский выдаёт как ?. Целям вне cp932 на этом движке нужен шрифтовой хак, которого пока нет.

Искажённая латиница: кракозябры

Японский текст, записанный как Shift-JIS и прочитанный как UTF-8 (или наоборот), даёт длинные вереницы латинских букв с диакритикой и символов псевдографики. Так бывает, когда инструмент пишет файл не в той кодировке или когда собственный загрузчик игры ожидает кодировку, которую ваш экспорт не использовал. Лечение — записать файл в той кодировке, которую ждёт движок, и уж точно не менять шрифт: это ничего не изменит.

Почему сильнее всего страдают CJK и тайский

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

  • Игра, сделанная под японский, обычно несёт кану, распространённые кандзи и ASCII. Переведите её на русский, греческий, тайский или корейский — и каждый не-ASCII символ выпадет.
  • Игра, сделанная под английский, обычно несёт только латиницу — так что японский, китайский, корейский, тайский, греческий и кириллица отваливаются разом.
  • Тайский — худший случай на практике: он вне всех распространённых игровых шрифтов, и ему к тому же нужны комбинируемые знаки гласных и тонов над и под базовым символом, так что шрифт, формально содержащий нужные кодовые точки, всё равно может нарисовать его плохо.
  • Латиница не безопасна автоматически. В польском, чешском, венгерском, турецком, вьетнамском и румынском есть символы Latin-Extended, которых у шрифта, сделанного под английский или японский, часто нет. RuneTranslate кладёт более широкий шрифт ровно для таких целей на Ren'Py, потому что «с латиницей всё нормально» оказалось неправдой.

Отдельно про Unity и TextMeshPro

В Unity две системы текста, и ломаются они по-разному. Устаревший uGUI Text использует объект Font. TextMeshPro, на котором сделано большинство современных игр, во время выполнения вообще не использует файл шрифта. Он использует шрифтовой ресурс TMP: текстурный атлас заранее отрисованных изображений глифов плюс таблицу соответствия кодовых точек позициям в этом атласе.

Поэтому у шрифтового ресурса TMP фиксированный набор символов. Когда разработчик его генерировал, он выбрал диапазон символов — обычно только тот язык, под который выпускался, — и TMP впёк в атлас ровно эти глифы. Статический шрифтовой ресурс никогда не нарисует ничего вне этого набора, чем его ни корми. Динамический шрифтовой ресурс хранит ссылку на исходный файл шрифта и может растрировать новые глифы по требованию — единственный режим, способный дорасти до языка, о котором разработчик не думал.

Запасной выход TMP — список запасных шрифтов. У каждого шрифтового ресурса есть список m_fallbackFontAssets, а у TMP Settings — глобальный список запасных; когда у основного ресурса нет глифа для кодовой точки, TMP идёт по этим спискам в поисках того, у кого он есть. Вмешиваться правильно именно здесь, потому что собственный шрифт игры остаётся главным для всего, что он уже умеет рисовать: интерфейс сохраняет задуманный вид, и только те символы, с которыми он не справляется, приходят со стороны.

Как чинить инструментом времени выполнения

XUnity.AutoTranslator перехватывает игру на ходу и умеет подменять шрифты из своего файла конфигурации. Нужные настройки лежат в разделе [Behaviour]:

  • OverrideFont — заменяет шрифт, который используют устаревшие компоненты Text интерфейса Unity. Принимает имя шрифта, который может разрешить игра или система.
  • OverrideFontTextMeshPro — заменяет шрифтовой ресурс TMP целиком. Укажите на файл AssetBundle со шрифтом TMP или имя ресурса, который уже есть в игре.
  • FallbackFontTextMeshPro — более безопасная из двух: добавляет шрифт, к которому TMP обращается только за глифами, которых нет в собственном ресурсе игры, оставляя оригинальную гарнитуру на месте во всём остальном.
  • tmp_font_assetbundles — поддерживаемая сообществом коллекция готовых AssetBundle со шрифтами TMP, на которые обычно и указывают OverrideFontTextMeshPro и FallbackFontTextMeshPro. Они собираются под конкретную версию Unity, и бандл, собранный под версию, отличную от версии игры, не загрузится — совпадение версий и есть тот шаг, который пропускают.

Инструмент времени выполнения работает на конкретной машине и в конкретной конфигурации: он чинит игру на том ПК, где установлен, и любому другому, кто запускает эту сборку, нужна та же настройка. RuneTranslate умеет читать и писать собственный файл плагина _AutoGeneratedTranslations.txt, так что проект, уже использующий его, не тупик — см. сравнение, где какой подход уместнее.

Как чинить на уровне файлов

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

Две честные оговорки. Нужно, чтобы TMP Settings, пригодный шаблон шрифтового ресурса и Font существовали в одном контейнере ресурсов игры; игра, у которой это разложено иначе, может выпасть из схемы. И когда внедрение пропущено, экспорт говорит об этом в предупреждениях, а не завершается зелёной галочкой: экспорт, который выйдет квадратами, не должен выглядеть так же, как работающий. Если вы видите такое предупреждение, запасной план — путь через инструмент времени выполнения выше.

Ren'Py добивается того же другим механизмом, потому что TMP там нет: RuneTranslate может положить CJK или нелатинский шрифт в экспортированную сборку и зарегистрировать его через собственный config.font_replacement_map движка Ren'Py, чтобы тот подставлял его везде, где шрифта игры не хватает.

Рабочий чек-лист

  1. Посмотрите на поломку. Однородные прямоугольники, символы ? или искажённые буквы — решите, что из трёх у вас, прежде чем что-либо трогать.
  2. Если это ?, откройте экспортированный файл. Если вопросительные знаки в самом файле, символы потеряны при записи и шрифт не поможет; проверьте, способна ли строковая кодировка движка удержать ваш целевой язык.
  3. Если это искажённые буквы, разбирайтесь с кодировкой, которую движок ждёт для этого файла, а не со шрифтом.
  4. Если это квадраты, убедитесь, что содержимое файла верное — почти всегда так и есть, — и относитесь к этому как к задаче про шрифт.
  5. На Unity лучше добавить запасной шрифт, чем заменить шрифт игры. Замена меняет вид каждой строки, включая те, что рисовались нормально.
  6. Если берёте AssetBundle со шрифтом TMP, подберите его под версию Unity игры.
  7. Переэкспортируйте и проверьте те самые символы, которые не работали, а не только первую строку диалога. Latin-Extended и тайские диакритические знаки часто проходят выборочную проверку и отваливаются в другом месте.

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

Полный процесс для Unity — какой текст Unity действительно отдаёт наружу, а какой остаётся вне досягаемости — в статье как перевести игру на Unity и на странице движка Unity. Текст, впечённый в графику, а не лежащий в данных, — отдельная задача с отдельным инструментом: см. перевод изображений. А FAQ закрывает остальные типичные сюрпризы первого запуска.

RuneTranslate бесплатен в использовании: разблокированы каждый движок и каждый провайдер, включая три, которым вообще не нужен API-ключ. Он разбирает собственные файлы игры и экспортирует играбельную переведённую сборку, которая остаётся у вас. Скачайте его или посмотрите поддерживаемые движки.

Похожие материалы
01

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

unityxunity-autotranslatortroubleshooting18 авг. 2026 г. · 9 мин
Читать →
02

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

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

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

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

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

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

Скачать для Windows