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