Новый тул для перевода новелл на Ren'Py
Привет! После недолгого перерыва, я выхожу на связь с новой поделкой и на этот раз немного более грандиозной. С гордостью представляю вам...
RenForge
Сколько себя помню, я всегда испытывал страсть к локализации разного рода произведений, будь то дубляж, перевод программного обеспечения, веб-сайтов, видеоигр, контента/документации и прочего, однако не обременённый даром голоса, или талантом к изучению иностранных языков, я всё искал свою нишу в этом ремесле с целью принести пользу обществу.
Так родилась идея.
По традиции, если лень читать, то сразу можете перейти в репозиторий проекта на GitHub.
Архитектура
Перед тем, как переходить к описанию функционала софтины, очень кратко пробежимся по душной части внутреннего устройства. Программа написана на программной платформе Tauri 2.0. На фронтэнде Vue 3 (фреймворк JS) и Vite, бэкэнд использует Rust. Также для распаковки архивов .rpa и декомпиляции .rpyc были использованы актуальные версии unrpa и unrpyc, которые я запечатал в бинарники и заставил делать самую сложную работу, лол.
Функционал
Идея приложения заключается в том, чтобы максимально изолировать переводчика от общения с Ren'Py SDK и сырыми игровыми файлами. Идеальным сценарием пользовательского опыта программы является случай, когда юзер за всю работу над проектом не увидит ни одной строчки кода. Ах, если бы всё было так просто...
Дашборд
Запустив экзешник, и выбрав корневую папку игры, юзер видит Дашборд.
Подробнее разберёмся в том, что мы здесь видим:
Шапка
Слева направо видим кнопки:
- Настройки - в выпадающей модалке можем выбрать цветовую тему приложения, язык интерфейса (RU/EN) и выбор языка на который мы будем переводить игру (влияет на имя создаваемой директории перевода и промт для нейросети (о ней позже)).
- Инструкция по эксплуатации.
- Вкладки "Текст", "Изображения" и "Аудио"
- Кнопка "Выбрать папку"
Структура файлов игры в формате графа (работает на библиотеке Vue Flow).
В графе отображаются все найденные в папке game/ файлы формата .rpa, .rpyc и .rpy, отсортированные по блокам так-же, как они расположены в самых директориях игры.
- Кнопка "Распаковать и Вскрыть всё" инициирует работу unrpa и unrpyc, которые раскрутят все найденные .rpa и .rpyc до .rpy с которыми мы сможем комфортно работать.
- Кнопка "Сброс" расставит блоки в графе по стандартной сетке.
- Сами блоки тоже интерактивны, нажав на серые имена файлов мы сможем посмотреть на исходные коды этих .rpy, а синие и жёлтые иконки при нажатии отправят нас в резервный генератор, о котором позже.
Колонка перевода
Справа от графа видим колонку с доступными для перевода текстовыми файлами. Они появятся там после того, как мы распакуем файлы и нажмём на кнопку "Сгенерировать переводы". Их мы генерируем с помощью нативных функций движка игры, вшитых в .exe, Ren'Py сам анализирует, выбирает и верстает доступные .rpy, ловко, да? В колонке видим следующие функции:
- Внедрить патч - создаёт в корне проекта скрипт, который форсит использование именно нашего перевода, оригинальные файлы при этом не редактируются. Применяемый патч форсит тот перевод, при изготовлении которого он был сделан (помнит только один язык одновременно и перезаписывается), если делаем несколько, патчим для каждого отдельно.
- Шрифты - открывает модалку Лечить шрифты, если при запуске под патчем игра вместо перевода показала ненавистные всем "▯▯▯▯", отмечаем чекбокс и патчим ещё раз. По умолчанию применится стандартный беспонтовый DejaVu Sans, но вы можете загрузить свой шрифт в формате .tiff.
- Чекбоксы, скрытие и прогресс-бары - чисто визуальные фишки, прогресс бары отображают прогресс перевода, чекбокс подсвечивает файл зелёным, а скрытие, неожиданно, скрывает файл.
Редактор перевода
Это сердце программы, нажав на кнопку "Перевод" в правой колонке мы попадаем сюда. Что здесь есть?
- Основную площадь редактора занимают строки текста, которые Pen'Py вытащил для нас. Здесь всё до безумия просто, сверяемся с эталоном (строки сверху), пишем перевод (поле ввода снизу). Присутствует цветовая индикация (зелёный, красный, желтый) и проверка синтаксиса (если мы во время перевода сотрём необходимые тэги по типу {size=35}{i}, то редактор отметит это как ошибку и не даст сохранить файл).
- Левый и правый сайд-бары - Слева видим список строк с цветовой индикацией по аналогии с редактором, клик по любой строке в этом списке перенесёт нас к соответствующей строке в редакторе, также в нём можно скрыть уже переведённые строки для удобства навигации в больших файлах. Справа простенький глоссарий. Туда можно внести имена персонажей, специфические термины и предпочтительные переводы к ним. Глоссарий тянется в промт нейросети, а также подсвечивает внесённые слова и фразы в строках.
- Автоматизация - я уже дважды упомянул нейросети, так что пора-бы о них рассказать. Сразу разочарую, от интеграции API крупных LLM я пока отказался, но осуществил две другие прикольные фичи:
- В модалке "Ассистент" мы можем выбирать между интеграцией локальной LLM и пакетным переводом при помощи Copy-Paste. В первом случае вы качаете себе на комп модельку при помощи Ollama, подключаете её и переводите текст. Стоит отметить, что качество и производительность перевода этим методом будет зависеть от мощности вашей ЭВМ и модельки, которую вы скачаете. На моей околотоповой сборке qwen 2.5 выдал довольно посредственные результаты, думайте. Второй вариант - выбрать диапазон строк, скопировать и вставить в какую-нибудь браузерную ИИ, прога увенчает список промтом и вам останется только скопировать ответ нейронки в окошко.
- По кнопкам "Экспорт" и "Импорт" вы сможете загрузить в прогу, или выгрузить файл себе на комп в формате .CSV, или .JSON.
Резервный генератор
Хотя я предпочитаю называть его НЕСТАБИЛЬНЫМ ГЕНЕРАТОРОМ.
Экспериментальная функция, обусловленная ненадёжностью работы стандартного генератора Ren'Py. Дело в том, что разраб-разрабу рознь и кастомная верстка скриптов, ошибки, и прочий человеческий фактор иногда приводит к тому, что не все нужные для перевода файлы создаются движком, или уже сгенерированные каким-то образом являются невалидными. Этот редактор инициируется синими и желтыми значками в графе и позволяет вручную (или полуавтоматически) сгенерировать файл перевода, просто выбрав нужные строки, которые подсветит программа.
Как это работает? Написанный мною парсер, используя регулярки подсвечивает экранированные двойными кавычками строки и выдаёт им один из трёх статусов:
- Синий - хороший кандидат, вероятно текст для перевода
- Желтый - возможно кандидат для перевода, подозрение на логику
- Серый - вероятнее всего технические строки
"Автоподготовка" автоматически выберет только синие строки.
"Сгенерировать файл" сверстает выбранные строки и отправит в директорию перевода.
Функция имеет статус экспериментальной из-за большой вероятности ошибиться при её использовании, что приведёт к тому, что игра не станет "хавать" самопальный файл.
Изображения
Помните вкладки "Текст", "Изображения" и "Аудио" из шапки проги? Пришло время поговорить о них.
Здесь всё довольно просто. При необходимости перевести элементы интерфейса, или надписи на задниках мы переходим в эту вкладку, выгружаем нужную картинку в наш редактор, и помещаем отредактированное изображение обратно в ту-же карточку, откуда брали, прога правильно её назовёт и поместит в директорию перевода.
Аудио
Примерно тот-же принцип действия, что и для изображений, но плюсом к аудио я добавил транслитерацию. Прога тянет из файлов строки, привязанные к аудиофайлам и выводит текст под плеером. Это будет полезно для дубляжа.
Итог
Спасибо, что дочитали до этого момента. На самом деле даже не знаю что написать в этом блоке. Инструмент ещё довольно сырой, ненадежный и его универсальность оставляет желать лучшего, но я не собираюсь останавливаться на достигнутом. Тесты и доработки продолжатся, и со временим, я надеюсь, мой инструмент можно будет назвать по настоящему крутым. Вот ещё раз ссылка на GitHub.
Хорошего дня и до свидания!