English 中文(简体)
Getting translation strings for jinja2 templates integrated with django 1.x?
原标题:

I can use jinj2 templates with django via render_to_response defined as below

from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.http import HttpResponse
from django.template import TemplateDoesNotExist, Context
from django.utils import translation
from itertools import chain
from jinja2 import FileSystemLoader, Environment
from jinja2 import nodes
from jinja2.ext import Extension 
from django.conf import settings

import jinja_filters as jf
import traceback

from django.utils.translation import gettext, ngettext

class DjangoTranslator(object):

    def __init__(self):
        self.gettext = gettext
        self.ngettext = ngettext

class DjangoEnvironment(Environment):

    def get_translator(self, context):
        return DjangoTranslator()


template_dirs = getattr(settings, TEMPLATE_DIRS )
default_mimetype = getattr(settings,  DEFAULT_CONTENT_TYPE )
global_exts = getattr(settings,  JINJA_EXTENSIONS , ())
env = DjangoEnvironment(autoescape=False, loader=FileSystemLoader(template_dirs, encoding="utf-8"), extensions=global_exts)
env.filters.update({ myescape :jf.myescape})

if  jinja2.ext.i18n  in global_exts:
        env.install_gettext_translations(translation)

def render_to_response(filename, context={}, context_instance=Context({}), mimetype=default_mimetype):
    template = env.get_template(filename)
    for d in context_instance.dicts:
        context.update(d)
    context.update({ settings :settings})
    rendered = template.render(**context)
    return HttpResponse(rendered, mimetype=mimetype)

but cannot make django extract translation strings for jinja2 templates.

seems that the lines below in django/utils/translation/trans_real.py make it possible for makemessages command to parse django templates for i18n via templatize@trans_real.py

inline_re = re.compile(r"""^s*transs+((?:".*?")|(?: .*? ))s*""")
block_re = re.compile(r"""^s*blocktrans(?:s+|$)""")
endblock_re = re.compile(r"""^s*endblocktrans$""")
plural_re = re.compile(r"""^s*plural$""")
constant_re = re.compile(r"""_(((?:".*?")|(?: .*? )))""")

is there a nicer way than modifying the makemessages.py by rewriting translation tags regexes for local use on jinja2 templates to extract translation strings?

问题回答

A little modification made it for me.. Base recipe is as follows, you might need to add/modify some more to fit your needs.

$ ~ > cp $DJANGO_PATH/utils/translation/ myproject/utils/ -a

and make the modifications given below:

$ ~ > diff $DJANGO_PATH/utils/translation/trans_real.py myproject/utils/translation/trans_real.py  -u

--- utils/translation/trans_real.py     Wed Jan 20 05:07:46 2010
+++ myproject/utils/translation/trans_real.py    Wed Jan 20 04:51:39 2010
@@ -435,6 +435,9 @@
 endblock_re = re.compile(r"""^s*endblocktrans$""")
 plural_re = re.compile(r"""^s*plural$""")
 constant_re = re.compile(r"""_(((?:".*?")|(?: .*? )))""")

+jinja_block_re = re.compile(r"""^s*trans(?:s+|$)""")
+jinja_endblock_re = re.compile(r"""^s*endtrans$""")

 def templatize(src):
     """
@@ -451,7 +454,7 @@
     for t in Lexer(src, None).tokenize():
         if intrans:
             if t.token_type == TOKEN_BLOCK:
-                endbmatch = endblock_re.match(t.contents)
+                endbmatch = jinja_endblock_re.match(t.contents)
                 pluralmatch = plural_re.match(t.contents)
                 if endbmatch:
                     if inplural:
@@ -485,7 +488,7 @@
         else:
             if t.token_type == TOKEN_BLOCK:
                 imatch = inline_re.match(t.contents)
-                bmatch = block_re.match(t.contents)
+                bmatch = jinja_block_re.match(t.contents)
                 cmatches = constant_re.findall(t.contents)
                 if imatch:
                     g = imatch.group(1)


$ ~ > cp $DJANGO_PATH/core/management/commands/makemessages.py myproject/myapp/management/commands/ 


$ ~/myproject/ > diff  $DJANGO_PATH/core/management/commands/makemessages.py main/management/commands/makemessages.py -u
--- /usr/lib/python2.5/site-packages/django/core/management/commands/makemessages.py    Wed Jan 20 05:08:37 2010
+++ main/management/commands/makemessages.py    Wed Jan 20 05:28:41 2010
@@ -56,7 +56,7 @@
     else:
         settings.configure(USE_I18N = True)

-    from django.utils.translation import templatize
+    from myproject.utils.translation import templatize

     if os.path.isdir(os.path.join( conf ,  locale )):
         localedir = os.path.abspath(os.path.join( conf ,  locale ))


then calling make messages as follows does the trick

$ ~/myproject/ > ./manage.py mymakemessages -l $LANGUAGE -e .jinja -v 2

my templates are named as templ_name.jinja, you ll need to replace .jinja in the command above with whatever extension you use for your template names.

I ve added support for this to Coffin, based on this approach:

http://github.com/miracle2k/coffin/commit/ba1a8a510b05074731d383e0dc1f7c21c67ff728





相关问题
How does gettext handle dynamic content?

In php (or maybe gettext in general), what does gettext do when it sees a variable to dynamic content? I have 2 cases in mind. 1) Let s say I have <?=$user1?> poked John <?=$user2?>. ...

Explain the Need for Mutexes in Locales, Please

Reading the question Why doesn’t C++ STL support atoi(const string& ) like functions?, I encountered a comment which warned that GCC (at least) has a bug that can slow down multi-threaded ...

How does Vistalizer work

How does Vistalizer manage to override the language limit in Windows Vista Home edition. Which api s does it use to allow installation of Multiple language packages.

Localized exceptions (within a Struts2 app)

I am developing a Struts 2 application with support for multiple languages. If one of the domain objects needs to throw an exception, how can it do so in such a way that the error message is no ...

Rails Globalize plugin help

Has anyone gotten the Globalize plugin to work Rails 2.3.2 or later? If so, could you direct me to some useful info?

热门标签