forked from IAHispano/Applio
-
Notifications
You must be signed in to change notification settings - Fork 7
/
i18n.py
63 lines (52 loc) · 2.06 KB
/
i18n.py
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
import json
def load_language_list(language):
try:
with open(f"./i18n/{language}.json", "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
raise FileNotFoundError(
f"Failed to load language file for {language}. Check if the correct .json file exists."
)
class I18nAuto:
"""
A class used for internationalization using JSON language files.
Examples
--------
i18n = I18nAuto()
i18n.print()
Using Language: en_US
"""
def __init__(self, language=None):
from locale import getdefaultlocale
language = language or getdefaultlocale()[0]
# Check if a specific language variant exists, e.g., 'es_ES'
if self._language_exists(language):
self.language = language
else:
# If not, check if there is a language with the first two characters
# matching, e.g., 'es_' for 'es_ES'.
lang_prefix = language[:2]
for available_language in self._get_available_languages():
if available_language.startswith(lang_prefix):
self.language = available_language
break
else:
# If no match found, default to 'en_US'.
self.language = 'en_US'
self.language_map = load_language_list(self.language)
@staticmethod
def _get_available_languages():
from os import listdir
from os.path import isfile, join
language_files = [f for f in listdir("./i18n/") if isfile(join("./i18n/", f))]
return [lang.replace(".json", "") for lang in language_files]
@staticmethod
def _language_exists(language):
from os.path import exists
return exists(f"./i18n/{language}.json")
def __call__(self, key):
"""Returns the translation of the given key if it exists, else returns the key itself."""
return self.language_map.get(key, key)
def print(self):
"""Prints the language currently in use."""
print(f"Using Language: {self.language}")