获取与django 1.x集成的jinja2模板的翻译字符串?

时间:2010-01-19 02:44:31

标签: django internationalization translation jinja2 xgettext

我可以通过如下定义的render_to_response将django与jinj2模板一起使用

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)

但无法为jinja2模板制作django提取翻译字符串。

似乎是django / utils / translation / trans_real.py中的以下行 makemessages命令可以通过templatize@trans_real.py来解析i18n的django模板

inline_re = re.compile(r"""^\s*trans\s+((?:".*?")|(?:'.*?'))\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"""_\(((?:".*?")|(?:'.*?'))\)""")

有没有比修改makemessages.py更好的方法,重写翻译标签正则表达式,以便在jinja2模板上本地使用以提取翻译字符串?

2 个答案:

答案 0 :(得分:2)

对我来说有点修改..基本配方如下, 您可能需要添加/修改更多以满足您的需求。

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

并进行以下修改:

$ ~ > 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'))


然后按如下方式调用make消息就可以了解

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

我的模板名为templ_name.jinja,您需要替换.jinja 在上面的命令中,使用您用于模板名称的任何扩展名。

答案 1 :(得分:1)

基于这种方法,我已经加入了对Coffin的支持:

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