3

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

从 django.conf 导入设置
从 django.core.exceptions 导入 ImproperlyConfigured
从 django.http 导入 HttpResponse
从 django.template 导入 TemplateDoesNotExist,上下文
from django.utils 导入翻译
从 itertools 导入链
从 jinja2 导入 FileSystemLoader,环境
从 jinja2 导入节点
从 jinja2.ext 导入扩展
从 django.conf 导入设置

将 jinja_filters 导入为 jf
导入回溯

从 django.utils.translation 导入 gettext,ngettext

类 DjangoTranslator(对象):

    def __init__(self):
        self.gettext = 获取文本
        self.ngettext = ngettext

类 DjangoEnvironment(环境):

    def get_translator(self, context):
        返回 DjangoTranslator()


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

如果 global_exts 中的“jinja2.ext.i18n”:
        env.install_gettext_translations(翻译)

def render_to_response(filename, context={}, context_instance=Context({}), mimetype=default_mimetype):
    模板 = env.get_template(文件名)
    对于 context_instance.dicts 中的 d:
        context.update(d)
    context.update({'settings':settings})
    渲染 = template.render(**context)
    返回 HttpResponse(渲染,mimetype=mimetype)

但不能让 django 为 jinja2 模板提取翻译字符串。

似乎 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$""")
复数re = re.compile(r"""^\s*plural$""")
constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""")

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

4

2 回答 2

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 2010 年 1 月 20 日星期三 05:07:46
+++ myproject/utils/translation/trans_real.py 2010 年 1 月 20 日星期三 04:51:39
@@ -435,6 +435,9 @@
 endblock_re = re.compile(r"""^\s*endblocktrans$""")
 复数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 模板化(源代码):
     """
@@ -451,7 +454,7 @@
     对于 Lexer(src, None).tokenize() 中的 t:
         如果转:
             如果 t.token_type == TOKEN_BLOCK:
- endbmatch = endblock_re.match(t.contents)
+ endbmatch = jinja_endblock_re.match(t.contents)
                 复数匹配=复数重新匹配(t.contents)
                 如果结束匹配:
                     如果是复数:
@@ -485,7 +488,7 @@
         别的:
             如果 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)
                 如果匹配:
                     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 2010 年 1 月 20 日星期三 05:08:37
+++ main/management/commands/makemessages.py 2010 年 1 月 20 日星期三 05:28:41
@@ -56,7 +56,7 @@
     别的:
         settings.configure(USE_I18N = True)

- 从 django.utils.translation 导入模板
+ 从 myproject.utils.translation 导入模板化

     如果 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 替换为您用于模板名称的任何扩展名。

于 2010-01-20T03:39:10.597 回答
1

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

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

于 2010-02-27T05:34:31.643 回答