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