首页 文章

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

提问于
浏览
3

我可以通过如下定义的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更好的方法,通过重写翻译标签regexes本地用于jinja2模板来提取翻译字符串?

2 回答

  • 1

    稍作修改就可以了 . 基本配方如下,您可能需要添加/修改更多以满足您的需求 .

    $ ~ > 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 .

  • 2

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

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

相关问题