File size: 2,837 Bytes
be3098f
026189f
 
 
ea7f80a
be3098f
 
 
 
c46d195
be3098f
 
 
 
 
c46d195
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
026189f
ea7f80a
026189f
d669394
026189f
 
 
 
 
ea7f80a
 
 
 
 
 
 
026189f
 
 
d669394
026189f
d669394
026189f
 
ea7f80a
be3098f
 
ea7f80a
 
 
d669394
 
 
ea7f80a
d669394
026189f
d669394
be3098f
 
d178a8d
 
be3098f
026189f
 
 
 
 
 
 
 
 
 
 
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import sys
from os import listdir, path
from typing import Any, Dict, List, Union

from pyUltroid import udB, LOGS
try:
    from google_trans_new import google_translator
    Trs = google_translator()
except ImportError:
    LOGS.error("'google_trans_new' not installed!")
    Trs = None

try:
    from yaml import safe_load
except ModuleNotFoundError:

    def _get_value(stri):
        try:
            value = eval(stri.strip())
        except Exception as er:
            LOGS.debug(er)
            value = stri.strip()
        return value

    def safe_load(file, *args, **kwargs):
        read = file.readlines()
        out = {}
        for line in read:
            if ":" in line: # Ignores Empty & Invalid lines
                spli = line.split(":", maxsplit=1)
                key = spli[0].strip()
                value = _get_value(spli[1])
                out.update({key: value or []})
            elif "-" in line:
                spli = line.split("-", maxsplit=1)
                where = out[list(out.keys())[-1]]
                if isinstance(where, list):
                    value = _get_value(spli[1])
                    if value:
                        where.append(value)
        return out

language = [udB.get_key("language") or "en"]
languages = {}

strings_folder = path.join(path.dirname(path.realpath(__file__)), "strings")

for file in listdir(strings_folder):
    if file.endswith(".yml"):
        code = file[:-4]
        try:
            languages[code] = safe_load(
                open(path.join(strings_folder, file), encoding="UTF-8"),
            )
        except Exception as er:
            LOGS.info(f"Error in {file[:-4]} language file")
            LOGS.exception(er)


def get_string(key: str) -> Any:
    lang = language[0]
    try:
        return languages[lang][key]
    except KeyError:
        try:
            en_ = languages["en"][key]
            if not Trs:
                return en_
            tr = Trs.translate(en_, lang_tgt=lang).replace("\ N", "\n")
            if en_.count("{}") != tr.count("{}"):
                tr = en_
            if languages.get(lang):
                languages[lang][key] = tr
            else:
                languages.update({lang: {key: tr}})
            return tr
        except KeyError:
            return f"Warning: could not load any string with the key `{key}`"
        except TypeError:
            pass
        except Exception as er:
            LOGS.exception(er)
        return languages["en"].get(key) or f"Failed to load language string '{key}'"


def get_languages() -> Dict[str, Union[str, List[str]]]:
    return {
        code: {
            "name": languages[code]["name"],
            "natively": languages[code]["natively"],
            "authors": languages[code]["authors"],
        }
        for code in languages
    }