Spaces:
Paused
Paused
| from functools import reduce | |
| from glob import glob | |
| from operator import getitem | |
| from os import path | |
| from threading import RLock | |
| from traceback import format_exc | |
| from pyrogram.types import CallbackQuery | |
| from yaml import FullLoader | |
| from yaml import load as load_yml | |
| from Powers import ENABLED_LOCALES, LOGGER | |
| from Powers.database.lang_db import Langs | |
| # Initialise | |
| LANG_LOCK = RLock() | |
| def cache_localizations(files): | |
| """Get all translated strings from files.""" | |
| ldict = {lang: {} for lang in ENABLED_LOCALES} | |
| for file in files: | |
| lang_name = (file.split(path.sep)[1]).replace(".yml", "") | |
| lang_data = load_yml(open(file, encoding="utf-8"), Loader=FullLoader) | |
| ldict[lang_name] = lang_data | |
| return ldict | |
| # Get all translation files | |
| lang_files = [] | |
| for locale in ENABLED_LOCALES: | |
| lang_files += glob(path.join("locales", f"{locale}.yml")) | |
| lang_dict = cache_localizations(lang_files) | |
| def tlang(m, user_msg): | |
| """Main function for getting the string of preferred language.""" | |
| with LANG_LOCK: | |
| default_lang = "en" | |
| m_args = user_msg.split(".") # Split in a list | |
| # Get Chat | |
| if isinstance(m, CallbackQuery): | |
| m = m.message | |
| # Get language of user from database, default = 'en' (English) | |
| try: | |
| lang = Langs(m.chat.id).get_lang() | |
| except Exception as ef: | |
| LOGGER.error(f"Lang Error: {ef}") | |
| lang = default_lang | |
| LOGGER.error(format_exc()) | |
| # Raise exception if lang_code not found | |
| if lang not in ENABLED_LOCALES: | |
| LOGGER.error("Non-enabled locale used by user!") | |
| lang = default_lang | |
| # Get lang | |
| m_args.insert(0, lang) | |
| m_args.insert(1, "strings") | |
| try: | |
| txt = reduce(getitem, m_args, lang_dict) | |
| except KeyError: | |
| m_args.pop(0) | |
| m_args.insert(0, default_lang) | |
| txt = reduce(getitem, m_args, lang_dict) | |
| LOGGER.error(format_exc()) | |
| return txt | |