|
|
@@ -1,4 +1,5 @@
|
|
|
|
import builtins
|
|
|
|
import builtins
|
|
|
|
|
|
|
|
import textwrap
|
|
|
|
from collections import defaultdict
|
|
|
|
from collections import defaultdict
|
|
|
|
|
|
|
|
|
|
|
|
import json5
|
|
|
|
import json5
|
|
|
@@ -12,17 +13,39 @@ except ImportError:
|
|
|
|
log = logger.bind(module="i18n", prefix="init")
|
|
|
|
log = logger.bind(module="i18n", prefix="init")
|
|
|
|
log_load = logger.bind(module="i18n", prefix="load")
|
|
|
|
log_load = logger.bind(module="i18n", prefix="load")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
str_funcs = {attr for attr in dir(str)}
|
|
|
|
|
|
|
|
str_funcs.add('__func__')
|
|
|
|
|
|
|
|
str_funcs.remove('__init__')
|
|
|
|
|
|
|
|
str_funcs.remove('__len__')
|
|
|
|
|
|
|
|
str_funcs.remove('__hash__')
|
|
|
|
|
|
|
|
str_funcs.remove('__add__')
|
|
|
|
|
|
|
|
str_funcs.remove('__str__')
|
|
|
|
|
|
|
|
str_funcs.remove('__repr__')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NestedAccessor:
|
|
|
|
class NestedAccessor:
|
|
|
|
def __init__(self, parent, key_chain):
|
|
|
|
def __init__(self, parent, key_chain):
|
|
|
|
self.parent: "I18N" = parent
|
|
|
|
self.parent: "I18N" = parent
|
|
|
|
self.key_chain = key_chain
|
|
|
|
self.key_chain = key_chain
|
|
|
|
|
|
|
|
self.__name__ = f'\r<{".".join(key_chain)}>'.upper()
|
|
|
|
|
|
|
|
# self.__func__ = self.key_chain
|
|
|
|
|
|
|
|
|
|
|
|
def __getattr__(self, item):
|
|
|
|
def __getattr__(self, item):
|
|
|
|
if item.startswith("__"): # Проверяем системные атрибуты
|
|
|
|
# Если нет метода, то возвращаем str
|
|
|
|
raise AttributeError(f"'{item}' is not accessible")
|
|
|
|
key = ".".join((*self.key_chain, item))
|
|
|
|
|
|
|
|
if key in self.parent.locale:
|
|
|
|
|
|
|
|
if "{" not in self.parent.locale[key]:
|
|
|
|
|
|
|
|
return self.parent.get_phrase(key)
|
|
|
|
|
|
|
|
if item in str_funcs:
|
|
|
|
|
|
|
|
return getattr(self(), item)
|
|
|
|
return NestedAccessor(self.parent, self.key_chain + [item])
|
|
|
|
return NestedAccessor(self.parent, self.key_chain + [item])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __len__(self):
|
|
|
|
|
|
|
|
return len(self())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __hash__(self):
|
|
|
|
|
|
|
|
return hash(self())
|
|
|
|
|
|
|
|
|
|
|
|
def __call__(self, **kwargs):
|
|
|
|
def __call__(self, **kwargs):
|
|
|
|
key = ".".join(self.key_chain)
|
|
|
|
key = ".".join(self.key_chain)
|
|
|
|
return self.parent.get_phrase(key, **kwargs)
|
|
|
|
return self.parent.get_phrase(key, **kwargs)
|
|
|
@@ -96,7 +119,7 @@ class I18N:
|
|
|
|
phrase = self._locale.get(key)
|
|
|
|
phrase = self._locale.get(key)
|
|
|
|
if not phrase:
|
|
|
|
if not phrase:
|
|
|
|
return f"<{key.upper()}>"
|
|
|
|
return f"<{key.upper()}>"
|
|
|
|
return phrase.format_map(defaultdict(lambda: '<unknown>', kwargs))
|
|
|
|
return textwrap.dedent(phrase.format_map(defaultdict(lambda: '<unknown>', kwargs)))
|
|
|
|
|
|
|
|
|
|
|
|
def __getattr__(self, item):
|
|
|
|
def __getattr__(self, item):
|
|
|
|
key = item.replace("_", ".") # заменяем _ на . для удобства
|
|
|
|
key = item.replace("_", ".") # заменяем _ на . для удобства
|
|
|
|