Мультиязыковая поддержка (Multiple Language Support)
Этот рецепт разъясняет, как добавить поддержку нескольких языков в игре, созданной на движке Ren'Py. Такая поддержка позволяет изменять шрифты и меню переводов в зависимости от выбранного пользователем языка. Также мы предложим две стратегии перевода текста в игре.
Выбор языка по-умолчанию (Selecting a Default Language)[править | править код]
Следующий код будет определять язык, используемый в игре по умолчанию. Этот язык будет использоваться для отображения меню выбора языка при старте движка.
init -3 python:
if persistent.lang is None:
persistent.lang = "english"
lang = persistent.lang
Этот код установит язык по-умолчанию, обозначенный как english. Он также хранит текущий выбор языка вне зависимости от того, какое значение содержится в переменной lang, поэтому она может получить доступ к коду блока инициализации.
Меню выбора языка (Language Chooser)[править | править код]
Это меню позволяет пользователю выбрать язык перевода. Ниже представлен код простого меню, в котором каждый его пункт устанавливает для переменной persistent.lang соответствующее значение для выбираемого языка. Указанный код отображает меню, затем перезагружает движок и перезапускает блок инициализации.
label language_chooser:
scene black
menu:
"{font=DejaVuSans.ttf}English{/font}":
$ persistent.lang = "english"
"{font=mikachan.ttf}Русский{/font}":
$ persistent.lang = "russian"
$ renpy.utter_restart()
Заметьте, что это просто обычный Ren'Py код, и поэтому здесь допустимо изменять команду scene для отображения другого изображения.
Так как, мы хотим, чтобы пользователь мог изменять язык из главного меню, мы добавим пункт меню в выражение config.main_menu:
init python:
config.main_menu.insert(3, (u'Language', "Language_chooser", "True"))
Наконец, мы можем захотеть автоматически отобразить меню выбора языка при запуске игры. Это можно сделать с помощью условного прыжка к метке language_chooser из splashscreen, используя следующий код:
label splashscreen:
if not persistent.choose_lang:
$ persistent.choose_lang = True
jump language_chooser
return
Инициализация, зависящая от выбранного языка (Language-Dependent Initialization)[править | править код]
Переменная lang может быть использована во время инициализации для изменения стилей, изображений, конфигурационных переменных и прочих настроек в соответствии с выбранным языком.
Такой трюк может быть использован внутри блоков init python:
init python:
if lang == "english"
style.default.font = "DejaVuSans.ttf"
e = Character("Elieen")
# ...
elif lang == "russian"
style.default.font = "mikachan.ttf"
e = Character("Эйлин")
# ...
Он также может быть применен внутри блоков инициализации для переопределения изображений:
init:
if lang == "english":
image bg city = "city_en.jpg"
elif lang == "russian"
image bg city = "city_ru.jpg"
Процесс перевода текста скрипта (Translating the Script)[править | править код]
Здесь представлено два подхода к переводу текста скрипта:
- метод Multi-path.
- метод In-line.
Первый подход предполагает наличие собственного блока для каждого используемого языка, в то время как второй прямо противоположен первому.
Перевод методом Multi-path (Multi-Path Translation)[править | править код]
Ключевым в переводе таким методом является ответвление основного текста на блоки, переведенные на соответствующие языки, имеющие каждый уникальную метку. Такое разделение лучше всего сделать в операторе start, который может выглядеть так:
label start:
$ game_lang = lang
if lang = "english":
jump start_en
else:
jump start_ru
label start_en:
"It was a dark and stormy night ..."
e "But we're inside, so it's okay."
# ...
label start_ru:
"Это была темная и неспокойная ночь ..."
e "Но мы были внутри помещения, поэтому все нормально."
# ...
Заметьте, что перевод методом Multi-path позволяет использовать персонажей (в нашем случае - рассказчика) и в том, и в другом тексте перевода.
Ограничение данного метода заключается в том, что с его помощью невозможно загрузить сохранения игры в различных языках. Для обхода этого ограничения, мы сохраняем значение переменной lang в переменной game_lang при запуске новой игры. Затем, используя служебную метку after_load, мы проходим проверку соответствия языков и сообщаем ошибку, если они не совпадают.
label after_load:
if lang == game_lang:
return
if lang == "english":
"The language of the save file is not the current selected language."
elif lang == "russian":
"Язык сохраненного файла не является выбранным языком"
$ renpy.full_restart()
Перевод методом In-Line (In-line translation)[править | править код]
Этот метод реализовывается путем определения персонажей, при отображении текста на экране, только в том случае, если выбран данный язык.
init python:
en = Character(None, condition='lang == "english"')
ru = Character(None. condition='lang == "russian"')
en_e = Character("Eileen", condition == 'lang == "english"')
ru_e = Character(u"Эйлин", condition == 'lang == "russian"')
Текст скрипта подается строками переведенного текста для каждого используемого языка:
label start:
en "I was a dark and stormy night ..."
ru "Это была темная и неспокойная ночь ..."
en_e "But we're inside, so it's okay."
ru_e "Но мы были внутри помещения, поэтому все нормально."
# ...
Расписанный метод поддерживает переключение языков. Недостатком является существенная необходимость прописывать строку текста в скрипте для каждого персонажа всех используемых языков.
Источник[править | править код]
Статья "Multiple Language Support" на английском языке
На главную страницу | Книга рецептов Энциклопедии Ren'Py | Книга рецептов Ren'Py | Вернуться к началу статьи |