2010-01-19 81 views
2

我可以使用jinj2模板被定义为以下获取与django 1.x集成的jinja2模板的翻译字符串?

 
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) 

选择render_to_response通过Django的,但对于Jinja2的模板不能让Django的提取翻译字符串。

似乎在下面几行的Django/utils的/翻译/ trans_real.py 有可能使makemessages命令通过[email protected]_real.py

 
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"""_\(((?:".*?")|(?:'.*?'))\)""") 

解析Django模板的国际化是有没有更好的方式通过重写翻译标记正则表达式来修改makemessages.py以供在jinja2模板上本地使用以提取翻译字符串?

回答

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


然后调用使信息如下开了窍

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

我的模板被命名为templ_name.jinja,你需要在上面的命令中替换.jinja ,并将其替换为模板名称的扩展名。

+0

我也做了一个包,以减轻Django的 - 神社的整合,与翻译字符串支持。 https://github.com/altunyurt/djtemps – hinoglu 2011-11-04 12:21:29