Створення українізатора 2.0

Цей посібник створений як розширення посібника piggsy. Він не повторює інформацію, а розширює її прикладами й новими інструментами. Рекомендується ознайомитися з обома посібниками. Усе, що описано в цьому посібнику, засноване на власному досвіді автора.

Останні зміни: 25.06.2026
Telegram: Канал
Discord: Сервер

Unity

Я однозначно рекомендую переходити з UABEA на UABEANext. Перший фактично перебуває у замороженому стані: розробка припинена, нові версії Unity не підтримуються, а частина критичних багів так і не була виправлена. Натомість UABEANext активно* розвивається, отримує підтримку нових версій рушія та пропонує значно ширший і зручніший інструментарій для роботи з асетами.

UABEANext

  • Робота з безліччю assets/bundle одночасно, підтримка вкладок.
  • Підтримка останніх* версій Unity асетів.
  • Підтримка пакетного експорту/імпорту асетів.
  • Підтримка експорту спрайтів як текстур.
  • Підтримка Drag & Drop.
  • Підтримка пошуку по Path ID.
  • Підтримка пошуку тексту.

UABEA

  • Робота лише з одним assets/bundle за раз.
  • Не підтримуються нові версії bundle.
  • Експорт/імпорт відбувається поштучно.
  • В одному assets підтягуються файли з інших assets, що наводить плутатину.
  • Баг при імпорті JSON.
  • Збій програми при експорті файлів, назва яких перевищує 260 символів.
  • Розробка припинена.

Типи асетів Unity, що містять текст

Імпорт

❗️ Увага: Якщо ви досі використовуєте UABEA для роботи з assets та bundle, майте на увазі: в програми є баг, через який json може імпортуватися некоректно з першого разу. Завжди перевіряйте файл за допомогою кнопки View Data. Якщо з’являється повідомлення Asset failed to deserialize — повторіть імпорт json.

Новий інструмент UABEANext позбавлений цієї проблеми — імпортування завжди проходить успішно. Також можна використовувати авторський консольний інструмент UnityCLI. Його можливості:

bundle, unity3d та catalog.*

Для патчингу catalog.json чи catalog.bin використовуйте покращений мною інструмент CatalogTool, у якому виправлено роботу з бандлами, що містять символи # у назвах, та додано функцію Drag & Drop для патчингу без ручного введення шляху. Це консольна утиліта, просто перетягніть catalog.json/.bin на .exe програми. Або використовуйте python скрипт Unity Catalog Patcher від NooB.

Увага: UABEANext поки не підтримує компресію bundle і unity3d контейнерів, тому використовуйте старий UABEA або UnityCLI:

Вибирайте завжди LZ4 компресію, якщо не хочете просидіти 10-15 хв з LZMA.

Шрифти

Для швидкої і зручної генерації атласу шрифту використовуйте інструмент TMP Unity від MrIkso.

Якщо ви віддаєте перевагу ручній генерації атласів шрифтів через рушій Unity по посібнику від art-kandy, використовуйте авторську програму Atlas MonoBehaviour Merger для подальшого об’єднання згенерованих гліфів TMP/2D шрифтів з оригінальними MonoBehaviour.

Відеогайд від MrIkso як за допомогою BepInEx та UnityExplorer знайти шрифт, згенерувати новий через TMP Unity та замінити все через UABEANext:

Неофіційна українська мова

Для додавання української як окремої в MonoBehaviour файли з масивами було написано власний інструмент Array Language Tool.

Її слід використовувати в поєднанні з Unity Localization Tool:

Додатково може знадобитися додавання нового рядка з ID з назвою нашої мови у багатомовний MonoBehaviour і/або редагування .dll в залежності від гри.

Unreal Engine 4 & 5

AES захист та sig файли

Для швидкого пошуку AES-ключа зручно користуватися сайтом AES Dumpster.

Якщо у вашій грі використовується AES-захист разом із .sig файлами у теці Paks, скористайтеся інструментом Unreal Engine Signature Check Bypasser (один з авторів українець). Його потрібно розпаковувати у теку Binaries/Win64 поряд з .exe, так, обидва .dll та .asi. Якщо на вашій грі це не спрацювало, створіть issue в репозиторії авторів щодо цього.

Це дозволить завантажувати сторонні pak файли грою без необхідності ручного прописування -fileopenlog у «Параметрах запуску» властивостей гри в Steam.

❗️ Не забудьте додати .dll, .asi файли та файл із ліцензією (❗️ ОБОВ’ЯЗКОВО ❗️) у архів разом із перекладом для решти гравців, або ж додайте посилання на Unreal Engine Signature Check Bypasser для окремого завантаження. ❗️

Текст

Для перекладу та роботи з locres, uasset і umap файлами використовуйте авторський інструмент UELT або мій старий форк UE Localization Tool 2.8.6 (не рекомендую, з перелічених у спойлерах причин).

Також текст з певних структур uasset та umap файлів, можна перенести в locres для зручності і збереження сумісності перекладу з оновленнями гри, що й було зроблено з перекладом Fatekeeper від Sent_Dez. Детальніше розписано в документації UELT.

Usmap/jmap/jmap.gz для uasset/umap файлів

Спробуйте переглянути випадковий uasset/umap у FModel. Якщо з’явиться повідомлення ...but mapping file is missing... — вам потрібен usmap/jmap/jmap.gz.

Що це таке: Цей файл містить усі структури гри для правильного відкриття та редагування uasset/umap, usmap є старою бінарною версією, коли jmap є новою альтернативою у вигляді JSON файлу, jmap.gz є його стисненим варіантом в архіві. Практично обов’язковий у Unreal Engine 5, іноді потрібен у 4-х версіях, тому й важливо перевіряти шляхом передогляду випадкового uasset у FModel'і.

Варіанти отримання usmap/jmap/jmap.gz

Правильне розпакування uasset/umap разом з uexp і подальший переклад

У вас при Export Data Raw в FModel експортується uasset/umap без uexp? Вітаю, у вас Zen-контейнери. Для роботи з ними потрібен retoc. Користуйтеся або консольним варіантом, або GUI-обгорткою від NooB.

Шаблон консольної команди для експорту потрібного файлу:

retoc --aes-key ВАШ_КЛЮЧ to-legacy --filter "/YourGame/Content/Some/Path/ФАЙЛ.uasset" "C:\Path\To\Game\Content\Paks" "C:\Path\To\OutputDir" --version UE*_*

--aes-key можна не використовувати, якщо ваша гра його немає.

--version версію рушія гри можете дізнатись із заголовку вікна FModel, з Властивостей виконуваного файлу гри, чи переглянувши перші рядки згенерованого jmap.

У моєму випадку з Samson команда виглядає ось так:

retoc to-legacy --filter "/CJ/Content/CJ/Core/Systems/Dialogue/DT_SayLines.uasset" "E:\Games\Samson\CJ\Content\Paks" "E:\Exports" --version UE5_7

Увага: Для ігор на 5.7 версії Unreal Engine потрібно розпаковувати з обов’язковим аргументом --version UE5_7, інакше асети конвертуватимуться як з 5.6 версії і не відкриватимуться коректно.

Правильний переклад uasset/umap

Раніше ми отримати usmap/jmap/jmap.gz, тепер маємо uasset/umap+uexp. Далі використовуємо UELT, відкриваємо uasset/umap та підтягуємо usmap/jmap/jmap.gz:

Застосування плюралізації та родів

Плюралізація

Unreal Engine підтримує плюралізацію (множину чогось/когось) через конструкцію {x}|plural(...). Важливо: замінюючи англійську локалізацію плюралізація обмежуватиметься лише one= і other= опціями, для повноцінної плюралізації з чотирма опціями потрібно створювати локалізацію окремою українською (дякую veydzh3r'у за ідею перевірити це):

{daysDelay} {daysDelay}|plural(one=day,other=days) {daysDelay} {daysDelay}|plural(one=день,few=дні,many=днів,other=дня)
<NumberText>{0}</NumberText> {0}|plural(one=Townie,other=Townies) <NumberText>{0}</NumberText> {0}|plural(one=містянин,few=містяни,many=містян,other=містянина)
and it also requires {amount} {name}{amount}|plural(one=s,other=) і також вимагає {amount} {amount}|plural(one={name},few={name}и,many={name}ів,other={name}а)
Ключ Коли спрацьовує Приклад
one= 1, 21, 31, 41... 1 день, 21 день
few= 2-4, 22-24, 32-34... 2 дні, 3 дні
many= 5-20, 25-30, 35-40... 5 днів, 11 днів
other= десяткові числа (1.5, 2.3...) та 0 1.5 дня

Роди

Для перекладу слів залежно від роду персонажа (знайшов/знайшла/знайшло) використовується конструкція {x}|gender(...).

Назва всередині дужок { } це аргумент, який задають розробники. Він може бути будь-яким: {NpcGender}, {NPC_A.Gender}, {Player.Gender} тощо. Знайти його можна двома способами:

Пишете три форми через кому: Masculine → Feminine → Neuter (чоловічий, жіночий, середній рід). Порядок не можна змінювати. Якщо в оригіналі дві форми, додаєте третю за потребою.

{NPC_A} did not sleep all night. {NPC_A} не {NPC_A.Gender}|gender(спав,спала,спало) усю ніч.
{NPC_A} is tired. {NPC_A} {NPC_A.Gender}|gender(втомлений,втомлена,втомлене).
{NPC_A} met {NPC_B.Gender}|gender(his,her,its) best friend. {NPC_A} {NPC_A.Gender}|gender(зустрів,зустріла,зустріло) {NPC_B.Gender}|gender(свого найкращого друга,свою найкращу подругу,свого найкращого друга).

Значення роду персонажа (Masculine/Feminine/Neuter) зберігається в окремих файлах (CompanionData, NPCData). Перекладач цього не бачить — він лише дає всі три форми, а рушій сам підставляє потрібну.

Приклад плюралізації та родів в одному рядку

{NPC_A} has fallen ill for {DaysAmount} {DaysAmount}|plural(one=day,other=days). {NPC_A.Gender}|gender(His,Her) condition worsens. {NPC_A} захворів на {DaysAmount} {DaysAmount}|plural(one=день,few=дні,many=днів,other=дня). {NPC_A.Gender}|gender(Його,Її,Його) стан погіршується.

Особливості перекладу

Коли ви заміняєте англійську локалізацію, у деяких іграх може залишатись неперекладеними список мов і час та дата збережень, наприклад:

Для їх перекладу потрібно дістати uk.res з кожної теки у Engine/Content/Internationalization/icudt64l (включно з нею) і перейменувати їх у en.res (або ту, яку ви заміняєте):

Результат:

Заміна шрифтів

uasset

Коли поряд з uasset немає файлу ufont, а ви впевнені, що шрифт усередині uasset+uexp — знадобиться авторська програма UAsset Font Tool. Підтримується заміна ttf/otf та swf. Перевірено на Life is Strange 2, Borderlands 3 та KINGDOM HEARTS III + Re Mind.

Приклад заміненого шрифту:

ufont (UE 5.6+)

Починаючи з Unreal Engine 5.6 було додано розмір шрифту у заголовок ufont файлів як метадані для швидшого зчитування рушієм. Для видалення розміру і подальшого його правильного обрахування для пакування було написано інструмент uFontTool. Підтримується перетягування ufont/ttf/otf файлів та тек з підтеками.

Пакування

pak контейнери

Замість старого unrealpak варто використовувати новий інструмент repak, який дозволяє пакувати різними версіями контейнерів під потрібну версію Unreal Engine, а також є швидшим.

Важливо: Починаючи з Unreal Engine 5.6 з’явилася вимога обов’язкових utoc/ucas контейнерів для pak файлів, інакше гра просто не завантажить запакований переклад у контейнері pak. Так як у нових pak зберігаються лише locres, ufont, ini та інші звичайні формати — uasset та umap із Zen-контейнерів потрібно запаковувати в utoc.
Увага: У випадках, коли немає потреби у перекладі uasset чи umap, і при цьому utoc/ucas обов’язкові — можна взяти global.utoc і global.ucas з гри і використовувати їх як заглушки, перейменувавши під назву pak файлу.

Zen-контейнери utoc/ucas

Для цього нам знову потрібен retoc. Користуйтеся або консольним варіантом, або GUI-обгорткою від NooB.

Шаблон консольної команди:

retoc to-zen ТЕКА ЯК_БУДЕ_НАЗИВАТИСЬ_ФАЙЛ.utoc --version UE*_*

У моєму випадку з Life is Strange: Double Exposure команда виглядає ось так:

retoc to-zen Exports pakchunk8-Windows_P.utoc --version UE5_2

Неофіційна українська мова

У даній статті я описав метод можливого додавання української як окремої мови, зауважу, не всюди таке спрацює, якщо маєте бажання, можете спробувати на своїй грі.

Так як LocRes Builder зі статті є вкрай незручним, я написав власний інструмент LocMetaTool для роботи з locmeta файлами. Підтримує перетягування locmeta/json та конвертацію між версіями locmeta. Перевірено на The Midnight Walk і Aphelion.

Godot 4.x

Спершу прочитайте інформацію щодо цього рушія з посібникa piggsy, і вже тоді повертайтеся сюди.

Текст і шрифти

Потрібні інструменти Godot RE Tools і GodotTresEditor. Відеогайд по редагуванню translation файлів від MrIkso:

За таким самим принципом можна замінювати й шрифти — вони, як і інші ресурси, завжди зберігаються в .godot/imported.

Інструменти

Загальні

Unity

Unreal Engine

Поради

Для перекладу тексту та порівняння з оригіналом зручно використовувати ExamDiff, саме Pro версію, яка підтримує усі compare-функції.

Для вводу символів … — – « » ’ ° зручно використовувати авторські швидкі клавіші на AutoHotkey (Тільки для Windows).