Перевод игр на Ren’Py
Внимание! Я не гуру перевода. В этой статье я собрал всё, что знаю про переводы на Ren’Py после нескольких переведённых игр для тех, кому интересно или кто сам хочет что-нибудь перевести. Замечания и дополнения приветствуются. Пользуйтесь на здоровье и делитесь качественными переводами 🙂
Основы
Распакуйте архив. В нём лежит файл UnRen.bat
Зачем нужен UnRen.bat (необязательная инфа):
Порой не хочется продираться через всю игру только для того, чтобы получить все сцены, и в конечном итоге упустить некоторые из них. Здесь пригодится опция 1 (Extract RPA packages), она позволяет извлечь все рендеры, анимации (и другие файлы) из пакетов rpa и непосредственно посмотреть их.
Опция 2 (Decompile rpyc files) предназначена для людей, которые хотят расшифровать скрипты. Обычно это делается, если хочется посмотреть код игры и найти переменные, которые могут помочь «обмануть» игру. Чтобы отредактировать эти переменные во время игры, нужно выбрать опцию 3, чтобы включить консоль для ввода кодов во время игры.
3) Запустите UnRen.bat. Выберите опцию 1. После завершения её работы нажмите ещё раз 1, чтобы вернуться в меню. Теперь выберите опцию 2.
Папка fonts. Здесь лежат файлы шрифтов. Какой за что отвечает можно посмотреть в файле gui.rpy:
Часто в своей игре разработчик использует шрифт, который не поддерживает кириллицу. И после перевода в игре «квадратики» вместо букв. Чтобы это исправить, заходим в gui.rpy и смотрим какой шрифт нужно заменить. Находим в интернете понравившийся нам кириллический шрифт. Меняем имя (вместе с расширением) скачанного шрифта на тот, который нужно заменить. Кидаем в папку fonts и перезаписываем.
В images — рендеры, анимации и другие различные картинки
В music или sounds — музыка и звуковые эффекты
В saves — сохранения и persistent-файл. Persistent несёт информацию о persistent-переменных, которые обычно используются для хранения информации об открытых наградах и сценах. Поэтому, когда вам нужно открыть все сцены в игре, вам нужен не сейв, а persistent-файл! 🙂
Структура папок отличается от игры к игре. Часто есть папка phone, если в новелле есть телефон.
.rpy – файлы проекта Ren’Py
.rpyc – зашифрованные файлы скриптов
script.rpy — обычно здесь лежит весь сценарий, но разработчики часто добавляют новые по Эпизодам или Главам, поэтому, кроме script.rpy, вы можете увидеть Chapter2.rpy или Day5.rpy
Файлы .rpy — это те, которые нужно переводить. Файлы .rpyc нужно удалять после каждого перевода, чтобы перезаписать данные. — Только, если переводить «в лоб» ( про этот метод читайте ниже)
Авто перевод игр на renpy
Script for automatic translation Renpy games.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Скрипт для автоматического. ну ладно, полуавтоматического перевода renpy игр через гуглтранслейт. 🙂 Работает под Windows на python 3.7, на других версиях и ОС не проверял. Для работы требуется textblob https://textblob.readthedocs.org
Для начала нужно получить файлы для перевода. Для этого окне renpy жмем на «Создать переводы». Вводим имя папки на латинице, например rus. В папке game движок создаст папку tl с нужными файлами.
Добавляем в главное меню выбор языка игры. Для этого в файл screens.rpy вставляем эти строки.
Если на предыдущем шаге папку для переводов вы назвали не rus, а как-то po_drugomu, то измените Language(«rus») на Language(«po_drugomu») Для примера можно посмотреть файл screens.rpy из обучающей игры, если сомневаетесь куда именно вставить этот код.
Создаем временную папку, например D:\tmp (русских букв в пути быть не должно) Копируем туда скрипт renpy_translator.py и папку tl. Запускаем командную строку, переходим во временную папку и запускаем скрипт. python3 renpy_translator.py
Скрипт создаст папку transl. В папке transl будут лежать переведенные файлы,
Копируем файлы из папки transl в папку game/tl Запускаем проект. Смотрим на лист ошибок 🙂 Скорее всего они будут, особенно, если игра большая. Гуглтранслейт иногда переносит точку за кавычки «. Или добавляет пробелы в экранированные \ » кавычки \ «» Всё предусмотреть у меня не получилось, и такие ошибки надо исправлять руками.
Да, игра должна быть разархивирована. Если игра в архиве, то инструкции по распаковке можно найти тут https://github.com/Shizmob/rpatool Если шрифт, указанный в игре не содержит кирилицу, и вместо русского текста у вас квадраты то в файле options.rpy замените шрифты на кирилические. Например constan.ttf
Поддерживается перевод на любые языки, которые поддерживает гуглтранслейт. Для этого в коде скрипта надо заменить (to=’ru’) на нужную пару языков. Инструкции тут: https://textblob.readthedocs.org/en/dev/quickstart.html#translation-and-language-detection
UPDATE 05.04.2019 При создании файлов перевода в Renpy, убедитесь, что опция Generate empty strings for translations НЕ выбрана. Ощибок стало меньше, но до идеала далеко.
После перевода нужно проверить результат. Вот такие вещи надо исправить
Полезные регулярки для правки переведенного текста:
Версия 2.9.3
(Нажать сюда, чтобы развернуть)
Копируем Translator3000.rpa в папку game в директории игры, для которой нужен перевод.
Запускаем игру и, после запуска, закрываем.
Открываем файл _translator3000_setting.json, появившийся в директории игры.
Меняем параметры на необходимые, заменяя значение null:
Для имитации человеческого фактора, реальное количество обращений будет рандомизировано в диапазоне:
Значение по умолчанию равно 100.
Использовать эту опцию только на свой страх и риск, т.к. возможен бан со стороны сервиса, при слишком большом количестве последовательных обращений и подозрении на факт автоматизации запросов.
Так же, вместо кода языка, можно указать наименование на английском языке:
Запускаем игру и пользуемся.
Launch Guide in English.
(Click here to open)
Copy Translator3000.rpa to the game folder in the directory of the game you want to translate.
Start the game and close it, after starting.
Open the file _translator3000_setting.json that appeared in the game directory.
Change the parameters to the required ones, replacing the value null:
To simulate the human factor, the real number of requests will be randomized in the range:
The default value is 100.
Use this option only at your own risk, because it is possible to block by the service, if the number of consecutive requests is too large and it is suspected of automating requests.
Also, instead of the language code, you can specify a common name in English:
Start the game and use it.
If there are native speakers of other languages who are willing to help translate this instruction into their language, I will be happy to add their translations. Thank you!
Перевод (Translation)
Содержание
Ren’Py включает обширную основу для перевода визуальных новелл.
Существует четыре основных типа вещей, которые можно перевести:
Диалог Можно перевести основной диалог скрипта, включая положение для разделения, объединения, пропуска и изменения порядка строк. Меню и строки интерфейса Можно перевести весь текст интерфейса. Изображения и файлы Сюда можно включить различные изображения и другие файлы, которые используются при выборе языка. Стили Можно настроить стили в зависимости от языка, чтобы игра автоматически переключалась на шрифт, соответствующий выбранному языку.
В настоящее время поддержка перевода Ren’Py сосредоточена на санкционированных переводах, когда создатели игры либо выпускают скрипты игры для переводчика, либо сами создают шаблоны перевода. Поддержка неофициальных переводов более ограничена.
Основные и дополнительные языки (Primary and Alternate Languages) [ править ]
Ren’Py ожидает, что каждая игра будет написана на одном основном языке. Он называется языком None, независимо от того, какой это язык на самом деле. Например, если игра была написана на английском языке, то английский будет языком None.
Если выбран язык None, большая часть функций перевода Ren’Py перевода отключена.
На альтернативные языки ссылаются по именам, которые могут удваиваться как идентификаторы в Python (начинаются с буквы или символа подчеркивания, за которыми следуют буквы, цифры и подчеркивания).
Создание файлов перевода (Generating Translation Files) [ править ]
Файлы перевода находятся в папках под подпапкой «tl» в директории игры. Например, если вы создаёте перевод обучающего проекта, например на французский, файлы перевода будут помещен в tutorial/game/tl/french.
Для каждого файла скрипта игры будет создан один файл перевода. Также будет создан файл common.rpy, содержащий переводы строк, которые являются общими для всех игр, созданных с помощью Ren’Py.
Перевод диалога (Translating Dialogue) [ править ]
Так как Ren’Py является движком для создания визуальных новелл, мы ожидаем, что большая часть перевода затронет диалог. Ren’Py включает гибкую структуру, которая позволяет разделять, объединять, перестраивать и полностью пропускать диалог.
◇ Единицы перевода [ править ]
Основная единица перевода – блок из нуля или более переводимых операторов, за которым может следовать один оператор say. Переводимые операторы – операторы voice и nvl. Для примера возьмём следующую игру:
Код разбит на несколько единиц перевода. Каждой единице присваивается идентификатор, который генерируется на основе метки, предшествующей единице перевода и операторам внутри неё. Если нескольким единицам будет присвоен один и тот же номер перевода, порядковый номер для второй и последующих единиц будет различаться.
В примере, приведенном выше, первой сгенерированной единице присваивается идентификатор start_636ae3f5 и она содержит оператор:
Вторая единица получает идентификатор start_bd1ad9e1m и содержит:
Третья единица имеет идентификатор start_9e949aac и содержит:
Эти единицы перевода создаются Ren’Py автоматически при загрузке игрового скрипта.
◇ Оператор translate [ править ]
При создании переводов для языка, Ren’Py создаст оператор translate, соответствующий каждой единице перевода. При переводе вышеупомянутого кода, Ren’Py создаст:
Это можно перевести, отредактировав сгенерированные файлы. Готовый перевод может выглядеть так:
При обнаружении блока в основном скрипте, Ren’Py проверяет, существует ли оператор translate, соответствующий этому блоку. Если да, то Ren’Py выполняет оператор translate вместо переведенного блока, показывая пользователю перевод.
◇ Более сложные переводы [ править ]
Операторы translate не должны включать переводы, соответствующие языку оригинала один в один. Например, можно разделить длинную строку:
Или оператор можно удалить, заменив его на оператор pass:
Кроме того, можно запускать недиалоговые операторы, такие как условные конструкции или Python. Например, мы можем перевести:
◇ Советы [ править ]
Будьте очень осторожны при изменении переведенного диалога, особенно когда этот диалог повторяется в нескольких местах внутри метки. В некоторых случаях может возникнуть необходимость напрямую присвоить идентификатор перевода, используя оператор, например:
Хотя блоки перевода могут включать код на языке Python, этот код не должен иметь побочных эффектов, видимых за пределами блока. Это связано с тем, что при смене языков перезапускается блок перевода, что приводит к многократному возникновению побочных эффектов.
Переводы меню и строк (Menu and String Translations) [ править ]
В дополнение к диалогу, Ren’Py способен переводить текст, содержащийся в меню и других строках. Перевод интерфейса – взаимно однозначная замена. Везде, где строка найдена, она будет заменена на одну замену.
При создании переводов Ren’Py проверять файлы скриптов на наличие меню и строк, заключенных в функцию _(). Затем Ren’Py помещает строки в блок translate strings. Например, если у нас есть следующий скрипт:
Ren’Py сгенерирует следующий код:
Который затем может быть переведен, как:
Переводы строк также применяются к диалоговым строкам, которые не переводятся как диалог.
Если одна и та же строка используется в нескольких местах кода, её можно выделить с помощью текстового тега <#. >. Несмотря на то, что строки отображаются одинаково, Ren’Py рассматривает все эти отдельные строки для перевода:
Оператор translate strings также можно использовать для перевода языка None. Это может быть использовано для перевода пользовательского интерфейса Ren’Py, когда игра написана на языке, отличном от английского.
◇ Возможность замены перевода [ править ]
◇ Извлечение и объединение переводов строк [ править ]
Перевод строк можно извлечь из одного проекта и переместить в другой. Это многоэтапный процесс:
Есть несколько вариантов, которые управляют процессом объединения:
Заменить существующие переводы Когда пункт выбран, это приведёт к замене уже существующих нетривиальных переводов (те из них, которые не являются пустой или исходной строкой). По умолчанию объединение не будет перезаписывать уже существующие нетривиальные переводы. Обратить языки Меняет строки перед объединением. Это может пригодиться, например, для созданию русско-английского перевода с помощью набора англо-русских переводов.
Переводы изображений и файлов (Image and File Translations) [ править ]
При переводе игры может потребоваться заменить файл оригинала на версию перевода. Например, если изображение содержит текст, возможно, имеет смысл заменить его на версию изображения, где текст переведён на другой язык.
Ren’Py решает эту проблему, путём поиска изображения в папке перевода. Например, если используется французский язык и загружено изображение library.png, Ren’Py будет использовать «game/tl/french/library.png», отдавая ей предпочтение перед «game/library.png».
Переводы стилей (Style Translations) [ править ]
При переводе игры может потребоваться изменить стили, особенно связанные со шрифтами. Ren’Py обрабатывает это с помощью блоков translate style и translate python. Эти блоки могут изменять языковые переменные и стили. Например:
При активации языка (либо в начале игры, или после смены языка), Ren’Py сбрасывает стили с их содержанием в конце фазы инициализации. Затем он запускает все блоки translate style и translate python, связанные с текущим языком, гарантируя при этом, что блоки, фигурирующие в файле ранее, выполняются в первую очередь. Наконец, он восстанавливает стили, позволяя изменениям вступить в силу.
Язык по умолчанию (Default Language) [ править ]
Язык по умолчанию выбирается следующим способом:
Перевод действия, функций и переменных (Translation Actions, Functions, and Variables) [ править ]
Основным способом переключения языков является action Language.
Languagee (language) Изменяет язык игры на указанный в language. language Строка, задающая язык, на который необходимо перевести, либо значение None, чтобы по умолчанию использовать язык скрипта игры.
action Language можно использовать для добавления в настройки возможности выбрать язык. Например:
Есть две функции, связанные с переводом:
renpy.change_language (language, force=False)
Изменяет текущий язык на указанный в language, который может быть строкой или значением None, чтобы использовать язык по умолчанию.
Возвращает набор известных языков. Не предусматривает язык по умолчанию при значении None.
Кроме того, существует несколько функций, связанных с переводом строк::
_ (s) (Одинарное подчёркивание) Возвращает s без изменений. Ren’Py просканирует строки, заключенные в эту функцию, и добавит их в список переводимых строк. Строки не будут переведены, пока они не будут показаны. __ (s) (Двойное подчёркивание) Возвращает s, сразу же переведенную на текущий язык. Строки, заключенные в эту функцию, будут добавлены в список переводимых строк. Обратите внимание, что строка может быть дважды переведена, если она совпадает с переводом строки при его отображении. _p (s) Переформатирует строку и помечает её как переводимую. Строка будет переведена при отображении отображаемого текста. Это сделано в целях определения многострочного использования в строках, а именно:
Переформатирование выполняется путём разбиения текста на строки, удаления пробелов в начале и конце каждой строки. Пустые строки удаляются в конце. Когда есть пустая строка, она вставляется в отдельные абзацы. Тег
разрывает строку, но не добавляет пустую.
Это может быть использовано в переводе строки с использованием конструкции:
Существует две языковые переменные. Одна из них – переменная config.language, которая применяется для изменения языка игры, установленного по умолчанию.
_preferences.language Наименование текущего языка или значение None, если используется язык по умолчанию Её следует рассматривать, как переменную только для чтения. Для изменения языка вызовите renpy.change_language().
Несанкционированные переводы (Unsanctioned Translations) [ править ]
Ren’Py включает небольшую поддержку для создания переводов без активного содействия создателей игры. Эта поддержка заключается в возможности автоматического создания файла перевода строк из всех строк в игре. Поскольку переводы строк используются для непереведенного диалога, данная технология делает возможным перевод игры.
Для создания файла перевода строк, выполните следующие действия:
Это обновит файл «game/tl/language/strings.rpy» с шаблоном перевода, содержащим все строки в нём.
Если игра не поддерживает смену языка, может быть целесообразно использовать блок init python для установки переменной config.language на нужном языке.
Наряду с использованием переводов строк для диалога, несанкционированные переводчики могут быть заинтересованы в использовании описанных выше методов для перевода изображений и стилей.
Перевод игр на движках по типу RPG maker Часть 1
Доброго времени суток.
Некоторое время назад мне очень понравилась одна игра, сделанная на движке RPG maker.
Несмотря на то, что это была настоящая RPG, текст и сюжет играли там очень важную роль. Роль, без которой я бы даже не взглянул на эту игру.
Это были прекрасные тысячи слов, десятки часов повествования, диалогов и прочего. Но исключительно на английском языке. Я был очень огорчен когда осознал, что эта игра никогда не получит хоть какого то распространения в нашей стране. Мне не с кем будет обсудить эту игру и поделиться впечатлениями, которые так тронули меня. Никто не станет браться за перевод игры длинной 50+ часов и с сильным уклоном в сюжет, как минимум в ближайшее время. Которая к тому же находится всё ещё в разработке. Может пройдут годы или это вообще никогда не случится.
Однако, с тех пор, где то внутри моей головы зрела идея, что популярность этой игры была бы немного шире, будь у неё перевод на наш, русский язык. А может она просто настолько мне понравилась.
Что привело меня к изучению способов и программ для исполнения задуманного. На этом вступление заканчивается и я перехожу к, собственно, теме поста. Мой опыт в плане работы с переводом игр крайне субъективен, но я постараюсь разложить всё по полочкам.
Первое, что нужно сделать, это с помощью программы RPG Maker Decrypter извлечь данные игры из файла типа RGSS Encrypted Archive. Звучит сложнее, чем делается. Находим файл:
Далее открываем программу и извлекаем данные, по большому счёту это работает по принципу обычного архива но со своими особенностями. После извлечения файлов, необходимо так же сгенерировать файл проекта, через который будет происходить редактирование. То есть если игра сделана на vx ace, то нужно выбрать соответствующий вариант из трёх. Вариантов этой программы много, но суть их в значительной степени идентична.
И в итоге получится вот такой небольшой набор из файла проекта и папок с данными:
Теперь вам необходима сама программа RPG Maker vx Ace или её родственник что бы начать процесс редактирования данных, нажав файл проекта. Выглядеть это будет приблизительно так:
Сам по себе процесс не сложен. Первым делом выбираем локацию из меню слева. Теперь в центре у нас будет локация с квадратами, которые обозначают события. Два раза нажав на выбранный квадрат, появляются все события которые ассоциируются с этим конкретным местом или персонажем. Открыв редактирование текста, можно будет без труда и вреда для скриптов изменить текст. Только тот текст, что игрок увидит на экране при активирование соответствующего скрипту диалога например. Таким образом, можно перевести любое скриптованное событие.
В случае с разделом Common Events ситуация чуть сложнее, там нужно будет искать текст в среде огромного количества скриптов и чем более игра комплексная, тем сложнее найти то, что нужно перевести. Но принцип практически тот же что и при переводе событий на карте локаций, особых проблем быть не должно.
Собственно, вот вы и начинающий переводчик игр, сделанных на RPG Maker, поздравляю.
Решите вы это делать для души или ради приобщения собратьев к какой то определенной игре, делайте без сомнений, я в вас верю!
Тем не менее, при большом количестве плюсов:
Простота, устойчивость к косорукости.
Приятно работать, сравнительно удобно. Пока не с чем сравнивать.
Подходит для любого, новичка или опытного переводчика.
Крайне сложная реализации для игр находящихся в постоянной разработке, по этой причине я отбросил этот вариант как не подходящий конкретно мне.
Работа с файлами игры напрямую и их изменение = получение новой игры, а не новой локализации. Кто знает, кроме вас, что вы могли сделать с игрой во время перевода? Оставили ли всё как было кроме текста?
Очень сложно найти весь текст требующий перевода, не пропустить хоть один малозаметный квадрат или скрипт с текстом. Нет никаких поблажек, каждая фраза, каждое слово должны быть найдены вручную.
Надеюсь вам было интересно и, чему я буду очень рад, воспользуетесь полученной информацией когда ни будь.
Во второй части я расскажу про абсолютно альтернативный этому вариант. У которого тоже есть свои плюсы и минусы, а так же иной функционал.









