Spaces:
Sleeping
Sleeping
File size: 2,035 Bytes
ca4eb6d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
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
|