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

Posted

技术标签:

【中文标题】获取与 django 1.x 集成的 jinja2 模板的翻译字符串?【英文标题】:Getting translation strings for jinja2 templates integrated with django 1.x? 【发布时间】:2011-01-06 15:17:45 【问题描述】:

我可以通过如下定义的 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 模板上本地使用以提取翻译字符串?

【问题讨论】:

【参考方案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 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 在上面的命令中,使用您为模板名称使用的任何扩展名。

【讨论】:

我还制作了一个包来简化 django - jinja 集成,支持翻译字符串。 github.com/altunyurt/djtemps【参考方案2】:

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

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

【讨论】:

以上是关于获取与 django 1.x 集成的 jinja2 模板的翻译字符串?的主要内容,如果未能解决你的问题,请参考以下文章

django -- 自定义jinja2 tag

带有缓存加载器的 Jinja2 与 django 模板 - 性能比较如何?

在 Jinja2 模板引擎中使用 django-widget-tweaks

将 Django 的 AllAuth 与 Jinja2 一起使用?

仿Django框架-基于wsgiref模块和jinja2模块写一个简单的框架 主流框架简介 动静态网页 Python虚拟环境

Django框架简介,wsgiref 与 jinja2 模块