diff roundup/cgi/TranslationService.py @ 2556:297dedb7226e

TranslationService for Roundup templates
author Alexander Smishlajev <a1s@users.sourceforge.net>
date Sun, 11 Jul 2004 14:17:17 +0000
parents
children aa0316a1b2aa
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/roundup/cgi/TranslationService.py	Sun Jul 11 14:17:17 2004 +0000
@@ -0,0 +1,110 @@
+# TranslationService for Roundup templates
+#
+# This module is free software, you may redistribute it
+# and/or modify under the same terms as Python.
+#
+# This module provides National Language Support
+# for Roundup templating - much like roundup.i18n
+# module for Roundup command line interface.
+# The only difference is that translator objects
+# returned by get_translation() have one additional
+# method which is used by TAL engines:
+#
+#   translate(domain, msgid, mapping, context, target_language, default)
+#
+
+__version__ = "$Revision: 1.1 $"[11:-2]
+__date__ = "$Date: 2004-07-11 14:17:17 $"[7:-2]
+
+from roundup import i18n
+from roundup.cgi.PageTemplates import Expressions, PathIterator, TALES
+from roundup.cgi.TAL import TALInterpreter
+
+### Translation classes
+
+class TranslationServiceMixin:
+
+    OUTPUT_ENCODING = "utf-8"
+
+    def translate(self, domain, msgid, mapping=None,
+        context=None, target_language=None, default=None
+    ):
+        _msg = self.gettext(msgid)
+        #print ("TRANSLATE", msgid, _msg, mapping, context)
+        _msg = TALInterpreter.interpolate(_msg, mapping)
+        return _msg
+
+    def gettext(self, msgid):
+        return self.ugettext(msgid).encode(self.OUTPUT_ENCODING)
+
+    def ngettext(self, singular, plural, number):
+        return self.ungettext(singular, plural, number).encode(
+            self.OUTPUT_ENCODING)
+
+class TranslationService(TranslationServiceMixin, i18n.RoundupTranslations):
+    pass
+
+class NullTranslationService(TranslationServiceMixin,
+    i18n.RoundupNullTranslations
+):
+    pass
+
+### TAL patching
+#
+# Template Attribute Language (TAL) uses only global translation service,
+# which is not thread-safe.  We will use context variable 'i18n'
+# to access request-dependent transalation service (with domain
+# and target language set during initializations of the roundup
+# client interface.
+#
+
+class Context(TALES.Context):
+
+    def __init__(self, compiler, contexts):
+        TALES.Context.__init__(self, compiler, contexts)
+        if not self.contexts.get('i18n', None):
+            # if the context contains no TranslationService,
+            # create default one
+            self.contexts['i18n'] = get_translation()
+        self.i18n = self.contexts['i18n']
+
+    def translate(self, domain, msgid, mapping=None,
+                  context=None, target_language=None, default=None):
+        if context is None:
+            context = self.contexts.get('here')
+        return self.i18n.translate(domain, msgid,
+            mapping=mapping, context=context, default=default,
+            target_language=target_language)
+
+class Engine(TALES.Engine):
+
+    def getContext(self, contexts=None, **kwcontexts):
+        if contexts is not None:
+            if kwcontexts:
+                kwcontexts.update(contexts)
+            else:
+                kwcontexts = contexts
+        return Context(self, kwcontexts)
+
+# patching TAL like this is a dirty hack,
+# but i see no other way to specify different Context class
+Expressions._engine = Engine(PathIterator.Iterator)
+Expressions.installHandlers(Expressions._engine)
+
+### main API function
+
+def get_translation(language=None, domain=i18n.DOMAIN,
+    translation_class=TranslationService,
+    null_translation_class=NullTranslationService
+):
+    """Return Translation object for given language and domain
+
+    Arguments 'translation_class' and 'null_translation_class'
+    specify the classes that are instantiated for existing
+    and non-existing translations, respectively.
+    """
+    return i18n.get_translation(language=language, domain=domain,
+        translation_class=translation_class,
+        null_translation_class=null_translation_class)
+
+# vim: set et sts=4 sw=4 :

Roundup Issue Tracker: http://roundup-tracker.org/