From 028d51af189f0f559c2c1aa74b17ccfcfb0c53e8 Mon Sep 17 00:00:00 2001 From: Ilya Bezrukov Date: Sun, 21 Jul 2024 02:40:49 +0300 Subject: [PATCH] Fix i18n system --- i18n.yaml | 4 ++++ mybot/__init__.py | 2 +- mybot/config.py | 1 + mybot/i18n.py | 18 ++++++++++++++++-- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/i18n.yaml b/i18n.yaml index 785afaf..7c852d7 100644 --- a/i18n.yaml +++ b/i18n.yaml @@ -1,3 +1,7 @@ en: start: "Hello, {message.from_user.full_name}" help: "Just simple bot, which greets the user. Use /start" + +ru: + start: "Привет, {message.from_user.full_name}" + help: "Это простой бот, который приветствует пользователя. Используй /start" diff --git a/mybot/__init__.py b/mybot/__init__.py index 7534ce3..971c3bf 100644 --- a/mybot/__init__.py +++ b/mybot/__init__.py @@ -7,6 +7,6 @@ from .i18n import I18N def main(): config = Config() logger = create_logger("mybot", config.LOG_LEVEL) - i18n = I18N(logger, config.I18N_PATH) + i18n = I18N(logger, config.I18N_PATH, config.I18N_LANG, config.I18N_FALLBACK_LANG) bot = create_bot(config, logger, i18n) bot.infinity_polling(config.TIMEOUT, config.DROP_PENDING, config.POLLING_TIMEOUT) diff --git a/mybot/config.py b/mybot/config.py index 7bb22bc..409d455 100644 --- a/mybot/config.py +++ b/mybot/config.py @@ -17,6 +17,7 @@ class Config: # i18n I18N_PATH: str = os.getenv("I18N_PATH", "i18n.yaml") I18N_LANG: str = os.getenv("I18N_LANG", "en") + I18N_FALLBACK_LANG: str = os.getenv("I18N_FALLBACK_LANG", "en") # state storage SS_TYPE: str = os.getenv("SS_TYPE", "memory").lower() diff --git a/mybot/i18n.py b/mybot/i18n.py index 226b79f..9684ec5 100644 --- a/mybot/i18n.py +++ b/mybot/i18n.py @@ -5,10 +5,14 @@ from yaml import safe_load class I18N: - def __init__(self, logger: logging.Logger, path="i18n.yaml", fallback_lang="en"): + def __init__(self, logger: logging.Logger, + path: str = "i18n.yaml", + lang: Optional[str] = None, + fallback_lang: str = "en"): self.logger = logger self._path = path self._fallback_lang = fallback_lang + self._lang = lang or self.fallback_lang self._dict = dict() self.load() @@ -20,6 +24,16 @@ class I18N: def fallback_lang(self): return self._fallback_lang + def set_lang(self, lang: Optional[str] = None): + if lang in self._dict: + self._lang = lang + else: + self._lang = self.fallback_lang + + @property + def lang(self): + return self._lang + def load(self): self._dict.clear() with open(self._path) as f: @@ -28,7 +42,7 @@ class I18N: raise RuntimeError("I18N file doesn't contain fallback language section") def get(self, phrase: str, lang: Optional[str] = None): - lang = lang or self.fallback_lang + lang = lang or self.lang if lang not in self._dict: self.logger.warning(f"Language '{lang}' not found in i18n, using fallback") lang = self.fallback_lang