Advertisement
xlebpushek

i18n.py

Feb 5th, 2023
961
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.79 KB | None | 0 0
  1. from typing import Any, Dict, Optional
  2.  
  3. from aiogram import Dispatcher
  4. from aiogram.types import TelegramObject, User
  5. from aiogram.utils.i18n import I18n
  6. from aiogram.utils.i18n import I18nMiddleware as BaseI18nMiddleware
  7. from babel import Locale, UnknownLocaleError
  8.  
  9. from src.configs.env import I18N_DEFAULT_LOCALE, I18N_DOMAIN, I18N_LOCALES_PATH
  10. from src.database import db
  11. from src.models.user import UserModel
  12.  
  13.  
  14. class I18nMiddleware(BaseI18nMiddleware):
  15.   def get_internal_locale(self, language_code: str):
  16.     if language_code and language_code in self.i18n.available_locales:
  17.       return language_code
  18.  
  19.   def get_external_locale(self, user_id: str):
  20.     user: UserModel = db.users.find_one({"user_id": user_id})
  21.  
  22.     if user and user.settings.language_code and user.settings.language_code in self.i18n.available_locales:
  23.       return user.settings.language_code
  24.  
  25.   async def get_locale(self, event: TelegramObject, data: Dict[str, Any]) -> str:
  26.     user: Optional[User] = data.get("event_from_user", None)
  27.  
  28.     if user is None:
  29.       return self.i18n.default_locale
  30.  
  31.     internal_locale = self.get_internal_locale(user.language_code)
  32.     print("internal_locale:", internal_locale)  # ! en
  33.     external_locale = self.get_external_locale(user.id)
  34.     print("external_locale:", external_locale)  # ! None
  35.  
  36.     locale = external_locale if external_locale else internal_locale
  37.  
  38.     try:
  39.       locale = Locale.parse(locale, sep="-")
  40.       print("locale:", locale)  # ! en
  41.     except UnknownLocaleError:
  42.       return self.i18n.default_locale
  43.  
  44.  
  45. def setup(dispatcher: Dispatcher):
  46.   i18n = I18n(path=I18N_LOCALES_PATH,
  47.               default_locale=I18N_DEFAULT_LOCALE, domain=I18N_DOMAIN)
  48.   i18nMiddleware = I18nMiddleware(i18n=i18n)
  49.  
  50.   return dispatcher.message.middleware(i18nMiddleware)
  51.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement