Fix i18n system
This commit is contained in:
parent
1a0341b3dd
commit
028d51af18
@ -1,3 +1,7 @@
|
|||||||
en:
|
en:
|
||||||
start: "Hello, {message.from_user.full_name}"
|
start: "Hello, {message.from_user.full_name}"
|
||||||
help: "Just simple bot, which greets the user. Use /start"
|
help: "Just simple bot, which greets the user. Use /start"
|
||||||
|
|
||||||
|
ru:
|
||||||
|
start: "Привет, {message.from_user.full_name}"
|
||||||
|
help: "Это простой бот, который приветствует пользователя. Используй /start"
|
||||||
|
|||||||
@ -7,6 +7,6 @@ from .i18n import I18N
|
|||||||
def main():
|
def main():
|
||||||
config = Config()
|
config = Config()
|
||||||
logger = create_logger("mybot", config.LOG_LEVEL)
|
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 = create_bot(config, logger, i18n)
|
||||||
bot.infinity_polling(config.TIMEOUT, config.DROP_PENDING, config.POLLING_TIMEOUT)
|
bot.infinity_polling(config.TIMEOUT, config.DROP_PENDING, config.POLLING_TIMEOUT)
|
||||||
|
|||||||
@ -17,6 +17,7 @@ class Config:
|
|||||||
# i18n
|
# i18n
|
||||||
I18N_PATH: str = os.getenv("I18N_PATH", "i18n.yaml")
|
I18N_PATH: str = os.getenv("I18N_PATH", "i18n.yaml")
|
||||||
I18N_LANG: str = os.getenv("I18N_LANG", "en")
|
I18N_LANG: str = os.getenv("I18N_LANG", "en")
|
||||||
|
I18N_FALLBACK_LANG: str = os.getenv("I18N_FALLBACK_LANG", "en")
|
||||||
|
|
||||||
# state storage
|
# state storage
|
||||||
SS_TYPE: str = os.getenv("SS_TYPE", "memory").lower()
|
SS_TYPE: str = os.getenv("SS_TYPE", "memory").lower()
|
||||||
|
|||||||
@ -5,10 +5,14 @@ from yaml import safe_load
|
|||||||
|
|
||||||
|
|
||||||
class I18N:
|
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.logger = logger
|
||||||
self._path = path
|
self._path = path
|
||||||
self._fallback_lang = fallback_lang
|
self._fallback_lang = fallback_lang
|
||||||
|
self._lang = lang or self.fallback_lang
|
||||||
self._dict = dict()
|
self._dict = dict()
|
||||||
self.load()
|
self.load()
|
||||||
|
|
||||||
@ -20,6 +24,16 @@ class I18N:
|
|||||||
def fallback_lang(self):
|
def fallback_lang(self):
|
||||||
return self._fallback_lang
|
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):
|
def load(self):
|
||||||
self._dict.clear()
|
self._dict.clear()
|
||||||
with open(self._path) as f:
|
with open(self._path) as f:
|
||||||
@ -28,7 +42,7 @@ class I18N:
|
|||||||
raise RuntimeError("I18N file doesn't contain fallback language section")
|
raise RuntimeError("I18N file doesn't contain fallback language section")
|
||||||
|
|
||||||
def get(self, phrase: str, lang: Optional[str] = None):
|
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:
|
if lang not in self._dict:
|
||||||
self.logger.warning(f"Language '{lang}' not found in i18n, using fallback")
|
self.logger.warning(f"Language '{lang}' not found in i18n, using fallback")
|
||||||
lang = self.fallback_lang
|
lang = self.fallback_lang
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user