summaryrefslogtreecommitdiff
path: root/repoze/bfg/i18n.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2010-04-19 07:34:46 +0000
committerChris McDonough <chrism@agendaless.com>2010-04-19 07:34:46 +0000
commitf5c6c574ada26ec0b2766f5ca20bb2b5b7393ec5 (patch)
treefdc3eba986d4e598b3455e8402f30c9a3fcc3e69 /repoze/bfg/i18n.py
parent334f4a7fff13b27d5c2be0bbe75d1507a534cbe0 (diff)
downloadpyramid-f5c6c574ada26ec0b2766f5ca20bb2b5b7393ec5.tar.gz
pyramid-f5c6c574ada26ec0b2766f5ca20bb2b5b7393ec5.tar.bz2
pyramid-f5c6c574ada26ec0b2766f5ca20bb2b5b7393ec5.zip
Dip a toe in the i18n waters.
Diffstat (limited to 'repoze/bfg/i18n.py')
-rw-r--r--repoze/bfg/i18n.py87
1 files changed, 87 insertions, 0 deletions
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)
+
+
+
+
+