Django模板中的_()或{%trans%}?
在Django模板中,可以使用{{ _("Hello World") }}
或{% trans "Hello World" %}
来标记要翻译的string。 在文档中,“官方”方法似乎是{% trans %}
标记,但是_()
语法也被提及过一次 。
这些方法如何不同 (语法除外),为什么应该是一个更好的而不是另一个呢?
一个区别是,你显然不能使用带有标签和filter的{% trans %}
。 但这是否意味着我可以在任何地方使用_()
,如{{ _("String") }}
? 它的工作原理看起来比使用独立string的{% trans "String" %}
和使用标签和filter的_()
更清晰和更一致。
所以看起来从Django 1.5开始在技术上没有什么区别。 模板引擎在两种情况下在内部标记用于翻译的variables(通过设置其translate
属性):
- 当你做
{% trans VAR %}
(参见TranslateNode
)或者 - 如果一个variables的名字以
_(
开始_(
以及结束于)
(参见Variable.__init__
)。
稍后,当variables正在被parsing时 ,Django会使用ugettext
或pgettext
包装它,如果它看到translate
属性。
但是,从源代码可以看出,有一些灵活性考虑支持{% trans %}
标记:
- 你可以做
{% trans "String" noop %}
,它将翻译的string放到.po文件中,但是在渲染时不会翻译输出(variables没有内部translate
属性,没有ugettext
调用)。 - 你可以指定消息上下文* ,如
{% trans "May" context "verb" %}
; - 你可以把翻译的消息放到variables中供以后使用* ,如
{% trans "String" as translated_string %}
。
*从Django 1.4开始。
请随时纠正我或张贴更好的答案,以防万一我失去了什么。
trans模板标签调用ugettext()函数。 在Django中_()是ugettext()的别名。 这在django文档中有介绍 。