xteam-urbot / strings /strings.py
Devesh Pal
Ultroid v0.5 Updates
c46d195
raw
history blame
2.84 kB
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
}