2010-01-19 76 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