import os
import gettext
import functools
import threading
__all__ = ["web_payments_translation_path", "set_language", "get_language", "Translation", "translation"]
web_payments_translation_path = os.path.join(os.path.dirname(__file__), "locale")
class _TLocal(threading.local):
def __init__(self, **kwargs):
super().__init__()
for key, val in kwargs.items():
setattr(self, key, val)
_tlocal = _TLocal(current_language="en")
[docs]def set_language(language):
'''
Set language.
Default implementation can be overwritten.
Note: if get_language is overwritten this method should be also overwritten
or not used
Note: loading with django overwrites this method if not initialized
:param str language: language to set to
'''
_tlocal.current_language = language
[docs]def get_language():
'''
Get language. For translations.
Default implementation can be overwritten.
Note: if set_language is overwritten this method should be also overwritten
Note: loading with django overwrites this method if not initialized
'''
return _tlocal.current_language
class _lazy_constant(object):
def __init__(self, func, *args, **kwargs):
if not callable(func):
instance_path, func_name = func
module_path, instance_path = instance_path.rsplit(".", 1)
module = __import__(
str(module_path), globals(), locals(), [str(instance_path)])
instance_ = getattr(module, instance_path)
func = getattr(instance_, func_name)
self.func = functools.partial(func, *args, **kwargs)
# skip partial, provide func
functools.update_wrapper(self, func)
def deconstruct(self):
selfname = ".".join([_lazy_constant.__module__, _lazy_constant.__qualname__])
args = [(self.func.func.__self__.instance_path, self.func.func.__qualname__.split(".", 1)[1])]
# python 3.4 compatibility
for arg in self.func.args:
args.append(arg)
return (selfname, args, self.func.keywords)
def __getattribute__(self, item):
if item in ("func", "__dict__", "__init__", "deconstruct"):
return super().__getattribute__(item)
return self.func().__getattribute__(item)
def __eq__(self, obj): return self.func().__eq__(obj)
def __ne__(self, obj): return self.func().__ne__(obj)
def __lt__(self, obj): return self.func().__lt__(obj)
def __le__(self, obj): return self.func().__le__(obj)
def __gt__(self, obj): return self.func().__gt__(obj)
def __ge__(self, obj): return self.func().__ge__(obj)
def __iter__(self): return self.func().__iter__()
def __len__(self): return self.func().__len__()
def __str__(self): return self.func()
def __repr__(self): return "'%s'" % self.func()
[docs]class Translation(object):
fallback = None
domain = None
instance_path = None
translation_path = None
def __init__(self, instance_path, translation_path, domain="web_payments", fallback=None):
self.translation_path = translation_path
self.instance_path = instance_path
self.domain = domain
if fallback:
self.fallback = fallback
else:
self.fallback = []
@functools.lru_cache(typed=True)
def _trans(self, lang):
if lang:
return gettext.translation("web_payments", self.translation_path, [lang]+self.fallback, fallback=True)
return gettext.translation("web_payments", self.translation_path, self.fallback, fallback=True)
[docs] def trans(self, cur_lang=None):
if not cur_lang:
cur_lang = get_language()
return self._trans(cur_lang)
[docs] def gettext(self, msg, cur_lang=None):
return self.trans(cur_lang).gettext(msg)
[docs] def ngettext(self, msg, msgplural, n, cur_lang=None):
return self.trans(cur_lang).ngettext(msg, msgplural, n)
[docs] def gettext_lazy(self, msg, cur_lang=None):
return _lazy_constant(self.gettext, msg, cur_lang)
[docs] def ngettext_lazy(self, msg, msgplural, n, cur_lang=None):
return _lazy_constant(self.ngettext, msg, msgplural, n, cur_lang)
translation = Translation("web_payments.translation.translation", web_payments_translation_path, domain="web_payments")