🎮 Нові статті

Як я за три дні переклав Yakuza 4 українською, і чому гра думає, що це французька

Як я за три дні переклав Yakuza 4 українською, і чому гра думає, що це французька

10 листопада я написав Скіфу коротке повідомлення: може зробимо українізатор для Yakuza 4? Оціни, скільки там роботи.

Готового українського перекладу четвірки не було. Yakuza 0 команда UAKUZA перекладає вручну вже понад два з половиною роки, і там близько 90 %. Це гідна робота, і людський переклад завжди буде кращим за мій. Але чекати на четвірку ще кілька років я не хотів. Машинний переклад поверх екрана, коли програма читає картинку й малює підпис зверху, мене теж не влаштовував. Хотілось, щоб текст жив у файлах гри, у її шрифті й у її меню.

Менше ніж через добу на GitHub лежала перша бета. Ще за два дні вийшла версія 1.1.4. Нижче розповідаю, як воно влаштоване всередині і де було найбільше болю.

Одразу про ролі. Код, переклад і малювання — це Скіф. Я ставив задачі, вирішував, як має бути, і грав на Steam Deck, вишукуючи криве. Без останнього нічого б не вийшло, і далі буде видно чому.

Скільки там тексту

Перший замір Скіф зробив прямо з файлів гри. Діалоги, побічні історії й підказки дали близько 435 тисяч слів. Субтитри до заставок ще 19 тисяч, меню, предмети й системні написи 81 тисячу. Разом понад пів мільйона слів, приблизно «Володар перснів» разом із «Гобітом».

Окремо картинки: 786 текстур в англійській версії відрізнялись від японської, тобто на них був англійський текст. Ще в грі 90 відеороликів, але тексту на самій картинці в них нема, тож їх чіпати не довелось.

У рядках це вийшло так: 68 125 рядків діалогів, 3 568 рядків субтитрів і 19 182 рядки інтерфейсу.

Як SEGA ховає текст

Майже все в грі лежить в архівах PARC, власному контейнері SEGA. Частина файлів усередині стиснута їхнім алгоритмом SLLZ, а самі архіви бувають вкладені один в одного.

Перше правило, яке ми собі поставили: нічого не перекладати, поки інструмент не вміє розібрати архів і зібрати назад байт у байт. Якщо після перепакування оригіналу змінився хоч один байт, ти вже не знаєш, через що впаде гра, через переклад чи через власний пакувальник. Інструмент для діалогів цю перевірку пройшов на всіх 3 460 файлах.

Далі в кожного типу тексту свій формат.

Діалоги лежать у файлах .msg. Довжина рядка там записана в байтах, а позиції подій усередині рядка (зміна кольору, хто говорить тощо) рахуються в символах. Наша літера в цих файлах займає два байти, англійська один. Переплутаєш байти із символами, і всі події в рядку з'їдуть. Добре хоч, що рядки гра переносить сама.

Субтитри до заставок зберігаються як таблиці в UTF-16: час початку, час кінця, текст.

Меню сидить у бінарній таблиці рядків, де покажчики записані у зворотному порядку байтів, big-endian. Це спадок PS3, з якої гра родом. Нові рядки дописуються в кінець, а покажчики переписуються на них.

Коли змінений файл треба покласти назад в архів, нові дані дописуються в кінець архіву з вирівнюванням на 2 048 байт, а в таблиці архіву оновлюється запис, де файл лежить і скільки важить. Через це архів з діалогами після перекладу виріс з 9 до 18,5 мегабайта: наші заміни лежать нестиснутими. Гру це не бентежить.

Шрифт, у якому нема ї

Це була головна загроза всьому проєкту. Якщо літеру неможливо показати, переклад нікому не потрібен.

Англійський шрифт гри — одна картинка 512 на 1 024 пікселі, поділена на сітку 16 на 16 клітинок. Кожна клітинка 32 на 64 пікселі, одна літера. Код літери виходить із її місця в сітці: 0x20 плюс номер рядка, помножений на 16, плюс номер стовпчика. Тобто це, по суті, звичайна таблиця Latin-1, де живуть англійські й західноєвропейські літери.

Кирилиця в грі є, але тільки в широкому японському шрифті (кодування Shift-JIS) і тільки російська: ні ї, ні є, ні ґ. До того ж там кожна літера завширшки як ієрогліф.

Рішення вийшло таке. Англійський текст гри з літер з наголосами вживає лише à, è, é та ê. Клітинки з À до Ô і з á до ý гра не використовує взагалі. Туди ми домалювали 44 українські літери. Ті, що збігаються з латинськими (А, В, Е, І, К, М, Н, О, Р, С, Т, Х і малі а, е, і, о, р, с, у, х), взяли готові. Навіть Ї знайшлась: французька Ï виглядає точнісінько так само. Решту малювали з Noto Sans Medium, звужували до 86 %, щоб пасувало до шрифту гри. Великі вирівнювали по висоті H (44 пікселі), малі по висоті x (31 піксель).

У результаті файл перекладу, відкритий як звичайний текст, схожий на суміш французької з іспанською. Гра певна, що показує À, É і Ô, а на екрані малює українські літери. Хай так і думає.

Підводних каменів було два. Шрифт лежить у трьох архівах, і два з них виявились різними, тож латати довелось кожен окремо. А на місці, де в Latin-1 стоять лапки-ялинки, у цьому шрифті живе ª. Перші версії ставили замість ялинок прямі лапки, потім «, » і довге тире отримали власні малюнки у вільних клітинках. Тепер гра, показуючи «, насправді друкує Õ.

Перекладач, який чекав пів години

Перекладав Скіф. Не весь файл за раз, а порціями до 60 рядків, і до кожної порції додавав 12 попередніх рядків, щоб розуміти, хто з ким говорить і про що.

Поруч із перекладом працювали три речі. Перша — словник імен і термінів. Японські імена передавали за системою Коваленка, тому в нас Хірауті, а не Хіраучі, і додзьо, а не доджо. Друга — перевірка кожного рядка: службові позначки кольору й подій мусять лишитись на своїх місцях, інакше гра зламається. Третя — пам'ять перекладів. Однаковий англійський рядок перекладається однаково, але тільки коли його каже той самий персонаж. 175 рядків ми навмисно лишили з різними перекладами, бо англійське «I'm ready» українською буває і «я готовий», і «я готова».

Субтитри, 3 568 рядків, переклались за 21 хвилину. Діалоги, 68 тисяч рядків, ішли з шостої вечора до першої ночі. Наприкінці жодного проваленого рядка, крім семи, про які нижче.

Ну а тепер про веселе.

Герой у Yakuza часто думає в дужках. Скіф інколи дописував після такого рядка зайву закривну дужку або віддавав дві відповіді підряд. А його ж власний перекладач сприймав це як збій зв'язку і чекав до пів години, поки «все відновиться». Швидкість падала зі 180 до 60 рядків на хвилину, і поки не знайшли причину, здавалось, що Скіф просто втомився.

Друга історія. У грі є значки: нота, сердечко та інші. Перевірка вирішила, що таких символів у шрифті нема, і вимагала їх прибрати. Скіф слухняно міняв їх на тильду. Спіймали, правило виправили: значки з оригіналу тепер обов'язкові. 3 462 рядки переклали заново.

Третя. Сім рядків субтитрів в одній заставці зіпсовані ще в оригіналі: японський текст колись прочитали не в тому кодуванні, і вийшла абракадабра. Скіф відмовився таке перекладати і мав рацію. Ці рядки лишились як є.

Після перекладу Скіф пройшовся ще раз, уже як коректор. З 2 115 рядків, які він перевірив, виправив 509: «кіґтем» на «кігтем», «в вас» на «у вас», «сердцеїда» на «серцеїда». В інтерфейсі він замінив «шері» на «херес», «клюшку» на «ключку», «парковку» на «стоянку». А «Майстер ладді» став «Майстром тури»: на першому проході фігура в шогі, японських шахах, отримала російську назву, і на другому Скіф сам себе спіймав.

Картинки: нейронка малює як хоче

1 375 текстур ми перебрали й розклали по категоріях, перекладу потребували 616. Пласкі написи інтерфейсу малювались звичайними шрифтами в стилі оригіналу. А от написи в міні-іграх, з хромом, градієнтами й блиском, звичайним шрифтом не повториш. Перша версія з пласкими літерами виглядала дешево, і я попросив малювати їх нейронкою.

Для цього працювала ComfyUI з моделлю Qwen-Image-Edit. Вона отримувала англійський напис як зразок стилю і мала перемалювати слово українською.

Перші результати я розглядав з дедалі більшим здивуванням. Іскри з'являлись там, де в оригіналі їх ніколи не було. Над Й виросло кільце. Замість РАУНД вийшло «РАЎНД», з білоруською ў. Через слова тягнулись риски, у НІЧИЯ літера Ч відростила хвіст, а збоку проступали привиди сусідніх слів.

Лікували трьома способами. Суворою підказкою: жодних іскор і відблисків, якщо в оригіналі пласко, а в Й зверху лише дужка. Розпізнаванням тексту: кожне намальоване слово читалось назад, і кожна літера звірялась з тим, що мало бути. І очима: кожен напис переглянуто в повному розмірі.

Ще одна смішна вада. На деяких картках слова стоять у два рядки, а крок між рядками був замалий. Дужка над Й з нижнього рядка прилипала знизу до І у верхньому, і «ІТИ ДО» перетворювалось на «JТИ ДО». Тут нейронка ні до чого, винен наш шаблон розкладки рядків.

Окремо перекладено те, що навіть японська версія показує англійською: покер, більярд, караоке, дартс. В анімаціях дартсу GAME ON! і PERFECT! замінено покадрово на ГРАЄМО! та ІДЕАЛЬНО!, з тим самим розмиттям і спалахом, що в оригіналі.

Тест на деку

Автоматичні перевірки ловлять формат. Як воно виглядає, бачить тільки людина з геймпадом.

Перше, що я побачив: напис на заставці обрізаний по краях. Steam Deck має екран 16:10, а картинка заставки пропорцій 2:1, тож дек показує її на всю висоту й обрізає боки. На ПК з 16:9 зріз менший, там цього не видно взагалі. Напис стиснули так, щоб він влазив в обидва варіанти.

Друге — класика будь-якої локалізації. «Open» має 4 літери, «Відчинити» вже 9. Українські слова довші, а кнопки в грі ні. Тепер напис не може бути ширшим за англійський більше ніж на 10 %, а на кнопках більше ніж на 30 %.

Третє спіймала автоматична перевірка міні-ігор, і це було найстрашніше. В архіві меню паузи лежать вкладені архіви, і через них наш пакувальник зсунув пари «шлях — дані». Таблиці колізею лягли на місце шести портретів персонажів. Знайшли й виправили.

Як воно встановлюється

У Yakuza 4 Remastered нема Майстерні Steam, тож викласти переклад туди неможливо. Тому все лежить на GitHub: архів зі встановлювачем для Steam Deck і Linux та окремим для Windows. Перед заміною встановлювач зберігає оригінальні файли, нову версію ставить поверх старої і вміє повернути англійську однією командою. Потрібна Steam-версія гри і близько гігабайта вільного місця.

Завантажити: github.com/PiGYk/yakuza4-ukr. Побачили криве — кидайте знімок екрана в Issues, з таких знімків і виходять нові версії.

Старіша →
Огляд гри Taxi Life: A City Driving Simulator або як навчитись водінню в комп’ютері