Пошёл ты, gettext! Я не хочу париться с компиляцией строк в бинарники!
Модуль предоставляет очень простой и неоптимальный способ перевода скриптов, ботов или приложений. В простоте его сила: всё что нужно для создания различных наборов фраз под несколько языков — это скормить библиотеке JSON-, YAML- или INI-файл (или даже dict
). После этого остаётся только получить объект словаря для конкретного языка и извлекать из него фразы по ключам.
В принципе, конечному пользователю нужно знать только про класс LocalizationContainer
с его статическим методом from_file()
, который читает файл по переданному ему пути и возвращает фабрику локализаций. Хотя инстанциировать её можно и через конструктор с помощью готового dict
'а. Затем получить словарь фраз (объект одного из потомков класса LanguageDictionary
) можно по коду языка с помощью метода get_lang()
. Ещё один вариант — это метод get_language()
, который отдельно принимает коды языка и страны.
Поскольку описание может быть несколько туманным и непонятным, то далее будут представлены примеры файлов локализации в различных форматах и код, демонстрирующий использование модуля. Также ознакомиться с его работой можно на конкретном примере в виде кода бота @textUtilsBot.
Установка:
# базовая истановка
pip install klocmod
# или с поддержкой YAML-файлов
pip install klocmod[YAML]
JSON (сперва язык):
{
"en": {
"yes": "yes",
"no": "no"
},
"ru-RU": {
"yes": "да",
"no": "нет"
}
}
JSON (сперва фраза):
{
"yes": {
"en": "yes",
"ru-RU": "да"
},
"no": {
"en": "no",
"ru-RU": "нет"
}
}
INI:
[DEFAULT]
yes = yes
no = no
[ru-RU]
yes = да
no = нет
YAML (требуется библиотека PyYAML):
# сперва язык
en:
yes: yes
no: no
ru-RU:
yes: да
no: нет
---
# сперва фраза
yes:
en: yes
ru-RU: да
no:
en: no
ru-RU: нет
Пример кода:
from klocmod import LocalizationsContainer
localizations = LocalizationsContainer.from_file("localization.json")
ru = localizations.get_lang("ru")
# или
en = localizations.get_lang() # получить язык по умолчанию
# затем
print(ru['yes']) # вывод: да
# альтернативные варианты получить конкретную фразу:
localizations.get_phrase("ru-RU", "no")
localizations['ru-RU']['no']
Более подробную информацию можно прочитать в документации (в кои-то веки полноценная документация, сгенерированная Sphinx'ом!). Правда, на английском языке.
Ну и в конце на всякий случай ещё раз напомню, что данный пакет вырос из модуля botutils.multilang, который я упоминал буквально в каждой публикации из цикла статей про ботов в Telegram.