Мультиязыковая поддержка (Multiple Language Support)

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску

Этот рецепт разъясняет, как добавить поддержку нескольких языков в игре, созданной на движке 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 Вернуться к началу статьи