Мультимовна підтримка (Multiple Language Support)

Зміст

Цей рецепт пояснює, як додати підтримку кількох мов у грі, створеній на движку Ren'Py. Така підтримка дозволяє змінювати шрифти та меню перекладів залежно від вибраної користувачем мови. Також ми запропонуємо дві стратегії перекладу тексту у грі.

Вибір мови за замовчуванням (Selecting a Default Language) [ред.]

Наступний код визначатиме мову, яка використовується за замовчуванням у грі. Ця мова буде використовуватися для відображення меню вибору мови під час старту движка.

Цей код встановить мову за промовчанням, позначену якenglish. Він також зберігає поточний вибір мови, незалежно від того, яке значення міститься в змінній lang, тому вона може отримати доступ до коду блоку ініціалізації.

Меню вибору мови (Language Chooser) [ред.]

Це меню дозволяє користувачеві вибрати мову перекладу. Нижче наведено код простого меню, в якому кожен його пункт встановлює для змінної persistent.lang відповідне значення для мови, що вибирається. Зазначений код відображає меню, потім перезавантажує двигун і перезапускає блок ініціалізації.

Зауважте, що це просто звичайний Ren'Py код, і тому тут можна змінювати команду scene для відображення іншого зображення.

Так як ми хочемо, щоб користувач міг змінювати мову з головного меню, ми додамо пункт меню у вираз config.main_menu:

Нарешті, ми можемо захотіти автоматично відобразити меню вибору мови під час запуску гри. Це можна зробити за допомогою умовного стрибка до міткиlanguage_chooserзsplashscreen, використовуючи наступний код:

Ініціалізація, яка залежить від обраної мови (Language-Dependent Initialization) [ред.]

Змінна lang може бути використана під часініціалізації для зміни стилів, зображень, конфігураційних змінних та інших налаштувань відповідно до вибраної мови.

Такий трюк може бути використаний усередині блоків init python:

Він також може бути застосований усередині блоків ініціалізації для перевизначення зображень:

Процес перекладу тексту скрипта (Translating the Script) [ред.]

Тут представлено два підходи до перекладу тексту:

Перший підхід передбачає наявність власного блоку кожної мови, тоді як другий прямо протилежний першому.

Переклад методом Multi-path (Multi-Path Translation) [ред.]

Ключовим у перекладі таким методом є відгалуження основного тексту на блоки, перекладені відповідними мовами, що мають кожну унікальну мітку. Такий поділ найкраще зробити в операторі start, який може виглядати так:

Зауважте, що переклад методом Multi-path дозволяє використовувати персонажів (у нашому випадку – оповідача) і в тому, і в іншому тексті перекладу.

Обмеження даного методу полягає в тому, що за його допомогою неможливо завантажити збереження гри у різних мовах. Для обходу цього обмеження ми зберігаємо значення змінної lang у змінній game_lang при запуску нової гри. Потім, використовуючи службову мітку after_load, ми проходимо перевірку відповідності мов та повідомляємо помилку, якщо вони не співпадають.

Переклад методом In-Line (In-line translation) [ред.]

Цей метод реалізується шляхом визначення персонажів при відображенні тексту на екрані тільки в тому випадку, якщо вибрана ця мова.

Текст скрипта подається рядками перекладеного тексту для кожної мови:

Розписаний метод підтримує перемикання мов.Недоліком є ​​суттєва необхідність прописувати рядок тексту в скрипті для кожного персонажа всіх мов, що використовуються.