[Checkins] SVN: megrok.jinja/trunk/src/megrok/jinja/extensions.py It use zope.cachedescriptors.method.cachedIn to avoid the getUtility method call for each translation in a given template.

Santiago Videla santiago.videla at gmail.com
Mon Apr 6 22:22:24 EDT 2009


Log message for revision 98959:
  It use zope.cachedescriptors.method.cachedIn to avoid the getUtility method call for each translation in a given template.
  
  

Changed:
  U   megrok.jinja/trunk/src/megrok/jinja/extensions.py

-=-
Modified: megrok.jinja/trunk/src/megrok/jinja/extensions.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/extensions.py	2009-04-07 01:33:07 UTC (rev 98958)
+++ megrok.jinja/trunk/src/megrok/jinja/extensions.py	2009-04-07 02:22:24 UTC (rev 98959)
@@ -17,6 +17,7 @@
 from jinja2.utils import contextfunction
 from zope.component import getUtility
 from zope.i18n.interfaces import ITranslationDomain, IUserPreferredLanguages
+from zope.cachedescriptors import method
 
 class DomainNotDefined(Exception):
     def __str__(self):
@@ -25,19 +26,6 @@
     Use {% set i18n_domain='your-domain' %} in the top of your template."""
 
 @contextfunction
-def translator(context, msg):
-    request = context.resolve('view').request
-    domain = context.resolve('i18n_domain')
-    if not domain:
-        raise DomainNotDefined
-
-    langs = IUserPreferredLanguages(request).getPreferredLanguages()
-
-    translation_domain = getUtility(ITranslationDomain, domain)
-
-    return translation_domain.translate(msg, target_language=langs[0])
-
- at contextfunction
 def _translator_alias(context, string):
     return context.resolve('gettext')(context, string)
 
@@ -65,8 +53,28 @@
         We override this method to use a different translator
         allowing dynamic domains using zope.i18n machinery.
         """
-        self.environment.globals.update(gettext=translator)
+        self.environment.globals.update(gettext=self.translator)
 
+    @method.cachedIn('_cache')
+    def trans_domain(self, domain):
+        """
+        Domains names are cached in order to avoid
+        the getUtility call for each translation in the template.
+        """
+        return getUtility(ITranslationDomain, domain)
+
+    @contextfunction
+    def translator(self, context, msg):
+        request = context.resolve('view').request
+        domain = context.resolve('i18n_domain')
+        if not domain:
+            raise DomainNotDefined
+
+        langs = IUserPreferredLanguages(request).getPreferredLanguages()
+
+        return self.trans_domain(domain).translate(msg,
+                                                   target_language=langs[0])
+
     def _make_node(self, singular, plural, variables, plural_expr):
         """
         This method it's called from the `parser` defined in



More information about the Checkins mailing list