Fix i18n system

This commit is contained in:
Ilya Bezrukov 2024-07-21 02:40:49 +03:00
parent 1a0341b3dd
commit 028d51af18
4 changed files with 22 additions and 3 deletions

View File

@ -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"

View File

@ -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)

View File

@ -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()

View File

@ -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