From f5c6c574ada26ec0b2766f5ca20bb2b5b7393ec5 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 19 Apr 2010 07:34:46 +0000 Subject: Dip a toe in the i18n waters. --- repoze/bfg/i18n.py | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 repoze/bfg/i18n.py (limited to 'repoze/bfg/i18n.py') diff --git a/repoze/bfg/i18n.py b/repoze/bfg/i18n.py new file mode 100644 index 000000000..bc0ae4423 --- /dev/null +++ b/repoze/bfg/i18n.py @@ -0,0 +1,87 @@ +from zope.interface import implements +from zope.interface import classProvides + +from repoze.bfg.interfaces import ITranslator +from repoze.bfg.interfaces import ITranslatorFactory +from repoze.bfg.threadlocal import get_current_registry +from repoze.bfg.threadlocal import get_current_request + +def get_translator(request): + try: + reg = request.registry + except AttributeError: + reg = get_current_registry() + + if reg is None: # pragma: no cover + return None # only in insane circumstances + + translator = getattr(request, '_bfg_translator', None) + + if translator is False: + return None + + if translator is None: + translator_factory = reg.queryUtility(ITranslatorFactory) + if translator_factory is None: + request_value = False + else: + translator = translator_factory(request) + request_value = translator + try: + request._bfg_translator = request_value + except AttributeError: # pragma: no cover + pass # it's only a cache + + return translator + +class InterpolationOnlyTranslator(object): + classProvides(ITranslatorFactory) + implements(ITranslator) + def __init__(self, request): + self.request = request + + def __call__(self, message): + mapping = getattr(message, 'mapping', {}) #should be a TranslationString + return message % mapping + +class TranslationString(unicode): + __slots__ = ('msgid', 'domain', 'mapping') + def __new__(cls, text, msgid=None, domain=None, mapping=None): + self = unicode.__new__(cls, text) + if msgid is None: + msgid = unicode(text) + self.msgid = msgid + self.domain = domain + self.mapping = mapping or {} + return self + + def __reduce__(self): + return self.__class__, self.__getstate__() + + def __getstate__(self): + return unicode(self), self.msgid, self.domain, self.mapping + +def chameleon_translate(text, domain=None, mapping=None, context=None, + target_language=None, default=None): + if text is None: + return None + translator = None + request = get_current_request() + if request is not None: + request.chameleon_target_language = target_language + translator = get_translator(request) + if default is None: + default = text + if mapping is None: + mapping = {} + if translator is None: + return unicode(default) % mapping + if not isinstance(text, TranslationString): + text = TranslationString(default, msgid=text, domain=domain, + mapping=mapping) + return translator(text) + + + + + -- cgit v1.2.3