morington

Custom Fluent [mod Groosha]

Dec 18th, 2023
774
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.50 KB | None | 0 0
  1. from typing import Optional
  2.  
  3. import structlog
  4. from structlog.stdlib import BoundLogger
  5. from pathlib import Path
  6. from fluent.runtime import FluentLocalization, FluentResourceLoader
  7.  
  8. logger: BoundLogger = structlog.get_logger(__name__)
  9.  
  10.  
  11. class CustomFluentLocalization(FluentLocalization):
  12.     def get_keyboard_localization(self, msg: str) -> Optional[str]:
  13.         for bundle in self._bundles():
  14.             keyboard_localization: dict[Optional[str], Optional[str]] = {
  15.                 bundle.format_pattern(bundle.get_message(key).value)[0]: key
  16.                 for key in bundle._messages.keys()
  17.                 if "keyb" in key
  18.             }
  19.             return keyboard_localization.get(msg, None)
  20.         return None
  21.  
  22.  
  23. class FluentDispenser:
  24.     def __init__(self, default_language: str = "ru"):
  25.         locales_dir: Path = Path(__file__).parent.joinpath("locales")
  26.         self.__loader = FluentResourceLoader(str(locales_dir) + "/{locale}")
  27.         self.__default_language = default_language
  28.         self.languages = dict()
  29.  
  30.         dirs_names = set()
  31.         default_language_dir = None
  32.         for item in locales_dir.iterdir():
  33.             dirs_names.add(item.name)
  34.             if item.name == self.__default_language:
  35.                 default_language_dir = item
  36.  
  37.         if not default_language_dir:
  38.             raise ValueError("FluentDispenser: default language directory not found")
  39.  
  40.         ftl_files_list = [item.name for item in default_language_dir.iterdir() if item.suffix == ".ftl"]
  41.  
  42.         for name in dirs_names:
  43.             if name == default_language:
  44.                 self.languages[name] = CustomFluentLocalization(
  45.                     [self.__default_language], ftl_files_list, self.__loader
  46.                 )
  47.             else:
  48.                 self.languages[name] = CustomFluentLocalization(
  49.                     [name, self.__default_language], ftl_files_list, self.__loader
  50.                 )
  51.  
  52.     @property
  53.     def default_locale(self) -> CustomFluentLocalization:
  54.         return self.languages[self.__default_language]
  55.  
  56.     @property
  57.     def available_languages(self) -> list[str]:
  58.         return list(self.languages.keys())
  59.  
  60.     def get_localization(self, language_code: str) -> CustomFluentLocalization:
  61.         localization: CustomFluentLocalization = self.languages.get(language_code, self.default_locale)
  62.         if language_code not in localization.locales:
  63.             logger.warn("Language not found", language_code=language_code)
  64.         return localization
Advertisement
Add Comment
Please, Sign In to add comment