В клиенте четыре языка: русский, английский, украинский и польский. Скрипту не нужно спрашивать, какой из них выбран, и подставлять строки самому. Вместо готовой строки пишут ключ, а переводы объявляют один раз через lang. Клиент подставит нужный язык, а если игрок сменит его прямо в игре, надписи поменяются вместе с ним.
lang.load({
"ru_ru": {"mymod.speed": "Скорость", "mymod.hi": "Привет, %s"},
"en_us": {"mymod.speed": "Speed", "mymod.hi": "Hi, %s"},
})
mod = Module("MyMod", "Visuals")
speed = Slider(mod, "mymod.speed").min(1).max(10) # в меню будет на языке игрока
client.msg(lang("mymod.hi", "Steve")) # своя строка с подстановкойКлюч, для которого перевода не нашлось, показывается как есть. Это удобно: сразу видно, какой строки не хватает, и скрипт при этом продолжает работать.
Часть надписей клиент прогоняет через переводы на каждой отрисовке. Достаточно назвать их ключом, и больше ничего делать не нужно.
| Что | Какой ключ |
|---|---|
| Имя настройки | то, что ты передал в Slider(mod, "...") |
| Подсказка под настройкой | <имя настройки>.description |
| Значения Mode и Select | то, что ты передал в .add(...) |
| Описание модуля | modules.descriptions.<имя модуля> |
lang.load({
"ru_ru": {
"mymod.speed": "Скорость",
"mymod.speed.description": "Насколько быстро крутится анимация",
"mymod.mode": "Режим",
"mymod.mode.soft": "Мягкий",
"modules.descriptions.mymod": "Мой первый модуль",
},
"en_us": {
"mymod.speed": "Speed",
"mymod.speed.description": "How fast the animation spins",
"mymod.mode": "Mode",
"mymod.mode.soft": "Soft",
"modules.descriptions.mymod": "My first module",
},
})
mod = Module("MyMod", "Visuals")
speed = Slider(mod, "mymod.speed").min(1).max(10)
mode = Mode(mod, "mymod.mode").add("mymod.mode.soft")Заодно ключ решает старую беду: имя настройки это её адрес в конфиге. Переименовал Скорость в Скорость анимации, и сохранённое у игрока значение потерялось. С ключом видимая надпись меняется в переводах, а адрес в конфиге остаётся прежним.
Когда строк много, их держат в json рядом со скриптом. Верхний уровень это коды языков. Путь считается от папки со скриптами, и вместо него можно дать ссылку.
{
"ru_ru": {
"mymod.speed": "Скорость",
"mymod.hi": "Привет, %s"
},
"en_us": {
"mymod.speed": "Speed",
"mymod.hi": "Hi, %s"
}
}lang.load_file("lang.json")
lang.load_file("https://site.ru/mymod/lang.json") # можно и ссылкойВ строку можно вставлять значения: %s для любого, %d для целого числа, %.1f для дробного. Порядок подстановок одинаков во всех языках.
lang.load({
"ru_ru": {"mymod.killed": "Убит %s, осталось %d"},
"en_us": {"mymod.killed": "Killed %s, %d left"},
})
client.msg(lang("mymod.killed", "Steve", 3))Для слов, которые меняются по числу, есть lang.plural. В русском, украинском и польском форм три, в английском две, и клиент выбирает нужную по текущему языку.
n = 5
client.msg("%d %s" % (n, lang.plural(n, "игрок", "игрока", "игроков"))) # 5 игроковНадписи, которые клиент рисует сам, обновятся без твоего участия. Пересобрать нужно только те строки, которые скрипт перевёл один раз и положил в переменную. Для этого есть событие language_changed.
title = lang("mymod.title")
@events.language_changed
def on_language(event):
global title
title = lang("mymod.title")
client.msg("язык теперь " + event.getCode())Текущий язык можно спросить и напрямую: lang.current() вернёт ru_ru, en_us, uk_ua или pl_pl.
| Метод | Описание |
|---|---|
lang("mymod.key") | Перевод ключа для текущего языка |
lang("mymod.key", value, ...) | То же с подстановками %s, %d, %.1f |
lang.load({"ru_ru": {...}, "en_us": {...}}) | Объявить переводы сразу для нескольких языков |
lang.add("ru_ru", {...}) | Переводы одного языка |
lang.load_file("lang.json") | Переводы из json-файла или по ссылке |
lang.current() | Язык клиента прямо сейчас |
lang.has("mymod.key") | Есть ли перевод: свой или клиентский |
lang.plural(n, "игрок", "игрока", "игроков") | Форма слова по числу |
lang.clear() | Снять переводы этого скрипта |