Библиотеки: klocmod — Kozalo's Localization Module
03.11.2018


Пошёл ты, 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.