diff --git a/src/Translate/Translate.py b/src/Translate/Translate.py new file mode 100644 index 00000000..9c25eb33 --- /dev/null +++ b/src/Translate/Translate.py @@ -0,0 +1,106 @@ +import os +import json +import logging +import inspect +import re + +from Config import config + +translates = [] + +class Translate(dict): + def __init__(self, lang_dir=None, lang=None): + if not lang_dir: + lang_dir = "src/Translate/languages/" + if not lang: + lang = config.language + self.lang = lang + self.lang_dir = lang_dir + self.setLanguage(lang) + + if config.debug: + # Auto reload FileRequest on change + from Debug import DebugReloader + DebugReloader(self.load) + + translates.append(self) + + def setLanguage(self, lang): + self.lang = lang + self.lang_file = self.lang_dir + "%s.json" % lang + self.load() + + def __repr__(self): + return "" % self.lang + + def load(self): + if os.path.isfile(self.lang_file): + data = json.load(open(self.lang_file)) + logging.debug("Loaded translate file: %s (%s entries)" % (self.lang_file, len(data))) + dict.__init__(self, data) + else: + data = {} + dict.__init__(self, data) + self.clear() + logging.debug("Translate file not exists: %s" % self.lang_file) + + def format(self, s, kwargs, nested=False): + kwargs["_"] = self + if nested: + return s.format(**kwargs).format(**kwargs) + else: + return s.format(**kwargs) + + def formatLocals(self, s, nested=False): + kwargs = inspect.currentframe().f_back.f_locals + return self.format(s, kwargs, nested=nested) + + def __call__(self, s, kwargs=None, nested=False): + if kwargs: + return self.format(s, kwargs, nested=nested) + else: + kwargs = inspect.currentframe().f_back.f_locals + return self.format(s, kwargs, nested=nested) + + def __missing__(self, key): + return key + + def pluralize(self, value, single, multi): + if value > 1: + return self[single].format(value) + else: + return self[multi].format(value) + + def translateData(self, data, translate_table=None, mode="js"): + if not translate_table: + translate_table = self + + data = data.decode("utf8") + + patterns = [] + for key, val in translate_table.items(): + if key.startswith("_("): # Problematic string: only match if called between _(" ") function + key = key.replace("_(", "").replace(")", "").replace(", ", '", "') + translate_table[key] = "|" + val + patterns.append(re.escape(key)) + + def replacer(match): + target = translate_table[match.group(1)] + if mode == "js": + if target and target[0] == "|": # Strict string match + if match.string[match.start() - 2] == "_": # Only if the match if called between _(" ") function + return '"' + target[1:] + '"' + else: + return '"' + match.group(1) + '"' + return '"' + target + '"' + else: + return match.group(0)[0] + target + match.group(0)[-1] + + if mode == "html": + pattern = '[">](' + "|".join(patterns) + ')["<]' + else: + pattern = '"(' + "|".join(patterns) + ')"' + data = re.sub(pattern, replacer, data) + return data.encode("utf8") + +translate = Translate() diff --git a/src/Translate/__init__.py b/src/Translate/__init__.py new file mode 100644 index 00000000..40f34063 --- /dev/null +++ b/src/Translate/__init__.py @@ -0,0 +1 @@ +from Translate import * \ No newline at end of file