Рейтинг темы:
  • Голосов: 1 - Средняя оценка: 5. Если голосов меньше 5 оценка не показывается.
  • 1
  • 2
  • 3
  • 4
  • 5
Создание перевода средствами RenPy
#1
Итак, я тут решил разобраться в инструментах для перевода RenPy игр, дабы переводчикам не приходилось менять текст прямо в коде. В итоге самым простым вариантом для нахождения был выбран RenPy smile. Кроме того первая часть думаю подойдет и тем кто пишет код, который потом планирует переводить. В общем поехали.

I. Подготовка игры к переводу.
1. Тут нам понадобиться распакованная игра. Если это чья-то чужая игра то её распаковка может быть нарушением лицензии ;) ну и кроме того описания по распаковке в гугле есть, так что допустим игра ваша и она не запакована.
2. Сразу скажу: текст диалогов,  т.е. тот который говорит кто-то из персонажей, или просто текст идущий в label в "" просто без указания персонажа, а также варианты выбора/ответов выдающиеся через menu -  вытягивается нормально и с ним ничего делать не надо.
3. Текст же выводящийся через функцию text, либо задающийся в переменных как в блоке init, так и в блоках python (если конечно его нужно перевести), следует выделить конструкцией _()
т.е. записи вида:
Код:
text "textA"
a = "textB"
func(c, "textC")
превращаются в:
Код:
text _("textA")
a = _("textB")
func(c, _("textC"))
В принципе расставив в коде всех .rpy файлов конструкцию _( ) вокруг строк не относящихся к диалогам, но требующим перевода, в код нам больше лезть не придется (ну как минимум до выхода новой версии).
upd. Также следуею отметить особенность работы RenPy со "строковыми значениями", ну т.е. текстом взятом в _() - в отличии от диалогового текста эти строки переводятся всегда одинаково и выносятся в файл перевода только один раз. Таким образом если _(идентичная строка) есть в нескольких оригинальных файлах - то в файлах перевода он будет только в одном месте!

II. Вытягивание строк для перевода.
Тут нам понадобится Ren'Py Launcher, с подготовленной в п. I. игрой.
Запускаем его, выбираем игру, и нажимаем пункт «Создать переводы» (p.s. в жизни бы не догадался…) как на рисунке:
[Изображение: https://preview.ibb.co/fsobka/r1.png]

Далее получаем окно:
[Изображение: https://preview.ibb.co/nfyLBF/r2.png]
Тут:
1. Пишем название перевода.
2. Ставим или убираем галочку «Generate empty strings for translations»:
- если галочка стоит: в местах для записи перевода будет пустое место, при частичном переводе будут пропуски.
- если галочка снята: в местах для записи перевода будет записан оригинальный текст, если строку пропустить то она просто будет на начальном языке.
3. Нажимаем пункт «Создать переводы» и ждем пока нам не напишут что все создано.

После этих действий в папке game игры создастся папка tl, а в ней в свою очередь папка с именем указанным как имя перевода. В самой же папке будут .rpy файлы с именами соответствующими оригинальным файлам игры и с текстом для перевода в виде:
Для текстов диалога:
[Изображение: https://preview.ibb.co/gAiWJv/r3a.png]
Или для строк помеченных в п I, а также для пунктов выбора заданных в menu:
[Изображение: https://preview.ibb.co/dhAp5a/r3b.png]
тут:
1. Примечание с местом расположения текста.
2. Ключевое обозначения ренпая для теста.
3. Примечание с оригинальным текстом.
4. Текст который нужно заменить на переведенный (при установленной ранее галочке «Generate empty strings for translations» тут вместо текста будет просто "").

III. Обновление перевода.
Так как полностью готовая игра попадается не часто, то возникает вопрос по дополнению перевода с выходом новой версии. Для этого:
- подготавливаем игру по пункту I.
- копируем в папку game новой версии папку tl с подготовленным ранее переводом.
- запускаем лаунчер, жмем «Создать переводы» с теми же настройками что ранее.
- ждем и получаем новый текст в файлах ниже предыдущего, типа:
[Изображение: https://preview.ibb.co/e8phQa/r4.png]

VI. Применение перевода.
Теперь, когда у нас (допустим) переведен текст еще нужно дать понять игре что выводить нужно не оригинал, а именно перевод.
Для этого в папке game или, что бы не потерять, в папке tl создаем файл с любым именем и расширением .rpy (к примеру options_Ru_lang.rpy), и пишем в нем
Код:
init -55 :
   define config.language = "Ru"
во второй строке обязателен отступ в 4 пробела.
"Ru" – тут указано название языка, которое было указано в окне «Создать переводы». (Если есть желание вернуть родной язык но не удалять папку с переводом, то можно его заменить на "None").

Все, перевод готов, теперь для его передачи достаточно скинуть папку tl (с файлом описанным выше).
При этом тому кто принимает перевод не нужно не только редактировать исходный код по пункту I, но и даже распаковывать игру – все подхватится и без этого)


П.С. да, еще возможен вопрос с заменой картинок, для этого их просто нужно кинуть в \game\tl\[имя перевода]\[оригинальный путь и название]. К примеру \game\tl\Ru\images\backgrounds\menu_quickmenu.jpg

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#2
нужно добавить ссылки на упоминаемый софт

 
Всё по пенису всё до фаллоса
Ответить
#3
А как быть с переменными вида:
Код:
$ Im = Character(u'Имя', color="#2687f4")
Переведенный файл всячески отказывается их видеть  cray

 
Ответить
#4
@4bd4400a,
писать в виде:
Код:
$ Im = Character(_(u'Имя'), color="#2687f4")

т.е. к и писал взять текстовый элемент требующий перевода в: _( )

P.S. кстати ренпи сейчас вроде нормально распознают юникод, по крайней мере в последних версиях ни разу не видел ошибок если забыть указать перед текстом u'

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#5
@94cd7149, Пробовал так. Игра не крашится, но переведенный файл этих слов не видит.

 
Ответить
#6
(09.02.2017, 10:49)13aea73a писал(а): @ntcntl, Пробовал так. Игра не крашится, но переведенный файл этих слов не видит.
В смысле не добавляет в файл перевода или вместо переведенного текста пишет оригинальный? Просто сейчас на новом пустом проекте проверил - всё сработало

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#7
@94cd7149, Вообще не добавляет в файл. Пробовал и через define и с двойными кавычками, и без u. Все равно глухо sad

 
Ответить
#8
ну вот пример где у меня все сработало: https://yadi.sk/d/n29qTea03Deazc
а, еще вспомнил тонкость текст взятый в скобки с подчеркиванием (ну т.е. в _()) в случае если он повторяется несколько раз RenPy пишет только один. Может эта строчка в итоге оказалась в каком-то другом файле?

P.S. @4bd4400a, если всё же получиться разобраться в проблеме - напиши что было, что бы знали ;)

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#9
Можно делать через if
Код:
if preferences.language == "english":

в некоторых случаях так удобнее

 
Ответить
#10
Я хз, вопроса не совсем понял. У меня никакие 'u не нужны.
Нарисовал на коленке::

Свёрнутый текст:
Код:
init python:
   def characters(language):
       global e, e_happy
       if language == 'Ru':
           e = Character('Эйлин', color="#c8ffc8")
           e_happy = Character('Эйлин Радостная', color="#a8ffc8")
       else:
           e = Character('Eleen', color="#c8ffc8")
           e_happy = Character('Eleen happy', color="#a8ffc8")
   



# The game starts here.
label start:
   menu:
       'Русский':
           $ config.language = "Ru"
           $ persistent.lang = None
           $ renpy.change_language('russian')
       'english':
           $ config.language = "english"
           $ persistent.lang = "english"
           $ renpy.change_language('english')
   
   $ characters(config.language)

   
       
   e "Элиин обычная"
   e_happy "Эйлин счастливая"

   return

После чего тыкаем "собрать языки", тыкаем "english", переименовываем что нам надо, и всё работает.
Если у вас русские имена не отображаются, то:
1) Обновите RenPy
2) Добавьте UTF8 я свою ОС
3) Пересядьте на линукс. Там с этим проблем нет.

 
Быть или не быть, вот в чем вопрос.
Достойно ль Смиряться под ударами судьбы,
Иль надо оказать сопротивленье И в смертной схватке с целым морем бед Покончить с ними?
Умереть. Забыться.
Ответить
#11
(09.02.2017, 11:08)ebe3a6c0 писал(а): Может эта строчка в итоге оказалась в каком-то другом файле?

Да, дело было в этом. Это же имя упоминалось в другом месте в виде пункта меня. Перевел в другом месте - перевелось в первом. Спасибо blush


@84b84cde, да, вопроса ты не понял mosking

 
Ответить
#12
@84b84cde, этот u добавляются автоматически и означает, что тип не str, а unicode. u, лично у меня, добавляется вообще ко всем строкам.
Однако, иногда стоит быть внимательным, например, если написать "{0}".format("символы не в ASCII") - будет ошибка. Здесь u"{0}".format(...) делать придется.

Сори за оффтоп

 
Ответить
#13
(09.02.2017, 11:27)13aea73a писал(а): Да, дело было в этом. Это же имя упоминалось в другом месте в виде пункта меня.
Ага, ясно, обновил значится стартовый пост что бы там было это предупреждение.

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#14
Хаюшки, столкнулся я значит со следующей проблемой
есть у меня код
Код:
image text_image = LiveComposite((700, 73), (3,0), ImageReference("information"),
                    (3,30), Text(__("Здесь какой-то русский текст"), style="tips_bottom"))
есть файл перевода
Код:
old "Здесь какой-то русский текст"
    new "Some russian text"
но вот после смены языка я по прежнему вижу русский вариант.
Я предполагаю, что это из-за того, что image в renpy генерятся до определения языка..
Есть ли какой-то метод обойти эту проблему?
Или я просто что-то делаю не так?

 
Открыт к предложениям проектов по python\renpy
Ответить
#15
@90748021, возможно, для стандартного переводчика это слишком умно. Попробуй просто через if две картинки указывать, одну для русского, вторую для буржуйского. Как в девятом сообщении.

 
Ответить
#16
(16.02.2017, 15:12)cfdcd85a писал(а): @90748021, возможно, для стандартного переводчика это слишком умно. Попробуй просто через if две картинки указывать, одну для русского, вторую для буржуйского. Как в девятом сообщении.

Да, я видел что есть возможность double init сделать. Но крайне хотелось бы этого избежать(

 
Открыт к предложениям проектов по python\renpy
Ответить
#17
(16.02.2017, 14:49)e44a1cb9 писал(а): есть у меня код
Код:
image text_image = LiveComposite((700, 73), (3,0), ImageReference("information"),
                    (3,30), Text(__("Здесь какой-то русский текст"), style="tips_bottom"))
Нужно иниту где объявляется данный имаге присвоить значение выше нуля, ну т.е. писать что-то в формате:
Код:
init 1:
    image text_image = LiveComposite((700, 73), (3,0), ImageReference("information"),
                    (3,30), Text(__("Здесь какой-то русский текст"), style="tips_bottom"))

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#18
(16.02.2017, 15:47)ebe3a6c0 писал(а):
(16.02.2017, 14:49)e44a1cb9 писал(а): есть у меня код
Код:
image text_image = LiveComposite((700, 73), (3,0), ImageReference("information"),
                    (3,30), Text(__("Здесь какой-то русский текст"), style="tips_bottom"))
Нужно иниту где объявляется данный имаге присвоить значение выше нуля, ну т.е. писать что-то в формате:
Код:
init 1:
   image text_image = LiveComposite((700, 73), (3,0), ImageReference("information"),
                   (3,30), Text(__("Здесь какой-то русский текст"), style="tips_bottom"))

Решение работает, но не до конца. Если язык был изменен после старта игры - то tooltip язык не меняет.
Пока нарисовал "костыль" с двойной инициализацией и допилил выбор этих изображений в зависимости от языка.

 
Открыт к предложениям проектов по python\renpy
Ответить
#19
(24.01.2017, 18:21)ebe3a6c0 писал(а): Все, перевод готов, теперь для его передачи достаточно скинуть папку tl (с файлом описанным выше).
При этом тому кто принимает перевод не нужно не только редактировать исходный код по пункту I, но и даже распаковывать игру – все подхватится и без этого)

У меня получилась вот такая ситуация. Сделал всё как написано, но в итоге выдало ошибку. Кто подскажет, что за ошибка?


Скачал по новой оригинал игры кинул в неё папку с переводом, тоже самое. Пока не построил дистрибутив всё время игра выдавала ошибку. Кинул в дистр. перевод игра пошла. Оригинал отказался принимать перевод. В другой игре всё прошло на ура, как написано в гайде.

 
Небо, а не женщина, делает из мальчиков МУЖЧИН !!!
[Изображение: https://image.ibb.co/jhSpbQ/879745205_136x136_98x98.jpg]
Ответить
#20
@c1c592bf, буквальный перевод ошибки "таблица ascii не знает нескольких символов." но ошибка указывает не на файл игры а на файл движка, так что там что угодно может быть.

 
Ответить
#21
ntcntl, у меня такая проблема, после того как вытащил из rpa все файлы rpyc, и создании перевода, в папке перевода появляется только файл common.rpy и common.rpyc. Что я делаю не так, такое ощущение как будто бы RenPy не видит эти файлы

 
Ответить
#22
(20.04.2017, 06:56)65228d0b писал(а): ntcntl, у меня такая проблема, после того как вытащил из rpa все файлы rpyc, и создании перевода, в папке перевода появляется только файл common.rpy и common.rpyc. Что я делаю не так, такое ощущение как будто бы RenPy не видит эти файлы

Файлы rpyc это уже скомпилированный вариант, их нужно декомпилировать *.rpy (где-то на просторах гугла я подобное видел), а потом уже с rpy файлов создавать перевод.

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#23
Привет, народ. Столкнулся с проблемой, RenPy не читает кириллицу. Решение вроде нашел, но проще весь код переписать. Может кто знает решение попроще?

 
Ответить
#24
Требуется помощь. При вытягивании строк для перевода не вытаскивается интерактивное меню.
Например вот это:
Код:
be "What should I do now?"
           "I should go to sleep.":
               hide image "arriving4"
               with fade
               jump sleep
           "I should take a shower.":
               hide image "arriving4"
               with fade
               jump shower
Сам вопрос вытягивается, а варианты ответа нет:
Код:
# be "What should I do now?" nointeract
   be "Чем мне заняться сейчас?" nointeract
Пробовал ставить _(), не помогает.
Помогите начинающему

 
Ответить
#25
(27.05.2017, 15:21)123149ab писал(а): Требуется помощь. При вытягивании строк для перевода не вытаскивается интерактивное меню.
У меня интерактивное меню в конце всего текста. Т.е. в самом низу. Если ты конечно вытаскиваешь текст через создать перевод.

 
Небо, а не женщина, делает из мальчиков МУЖЧИН !!!
[Изображение: https://image.ibb.co/jhSpbQ/879745205_136x136_98x98.jpg]
Ответить
#26
(27.05.2017, 16:36)9fec0050 писал(а):
(27.05.2017, 15:21)123149ab писал(а): Требуется помощь. При вытягивании строк для перевода не вытаскивается интерактивное меню.
У меня интерактивное меню в конце всего текста. Т.е. в самом низу. Если ты конечно вытаскиваешь текст через создать перевод.

Аллилуйа! Спасибо. Пол дня из-за невнимательности потерял

 
Ответить
#27
(27.05.2017, 19:02)123149ab писал(а): Аллилуйа! Спасибо. Пол дня из-за невнимательности потерял
Не за что!

 
Небо, а не женщина, делает из мальчиков МУЖЧИН !!!
[Изображение: https://image.ibb.co/jhSpbQ/879745205_136x136_98x98.jpg]
Ответить
#28
(27.05.2017, 19:02)123149ab писал(а): Аллилуйа! Спасибо. Пол дня из-за невнимательности потерял
Сразу еще один момент: если есть одинаковые ответы в нескольких меню или в иных местах что ренпи понимает как "строки" и помещает вниз, то в файлах для перевода оно будет только в одном файле. Ну т.е. если есть к примеру несколько раз ответ "Ок", то переводится он один раз, а в другие места автоматически копирует с первого.

 
Бороться и искать.
Найти и... перепрятать.
Ответить
#29
Это хорошо, удобно.
Неудобно то, что порой фразы переводятся не по порядку или как в моем случае. С моим знанием англ (со словарем), мне удобней видеть все в контексте, чтобы понять смысл происходящего. А так приходится постоянно серфить игру..
Но за спасибо за уточнение

 
Ответить
#30
(28.05.2017, 05:19)123149ab писал(а): Неудобно то, что порой фразы переводятся не по порядку или как в моем случае.

Текст до меню выбора идёт по порядку.

(28.05.2017, 05:19)123149ab писал(а): А так приходится постоянно серфить игру..

Для чего. Проще промотать текст до строки выбора диалога или действия . К примеру.

Свёрнутый текст:

Меню выбора диалога. С номером строки 22

[Изображение: https://preview.ibb.co/def8ha/1.jpg]

Ищем где она. т.е. между 21 и 24. Значит тут будет этот выбор


[Изображение: https://preview.ibb.co/mCBnav/2.jpg]


 
Небо, а не женщина, делает из мальчиков МУЖЧИН !!!
[Изображение: https://image.ibb.co/jhSpbQ/879745205_136x136_98x98.jpg]
Ответить


Переход:


Просматривают эту тему: 1 Гость(ей)