Django模板中的_()或{% trans %}有什么区别?

55
在Django模板中,您可以使用{{ _("Hello World") }}{% trans "Hello World" %}来标记要翻译的字符串。在文档中,“官方”方法似乎是{% trans %}标签,但也提到了_()语法一次这些方法除了语法之外有什么不同,为什么应该优先选择其中一个?
一个区别是显然不能在标签和过滤器中使用{% trans %}。但这是否意味着我可以随处使用_(),例如{{ _("String") }}?它可以工作,并且看起来比在独立字符串中使用{% trans "String" %}和在标签和过滤器中使用_()更清洁和一致。
2个回答

63

所以从Django 1.5开始,技术上似乎没有区别。模板引擎在两种情况下内部标记要翻译的变量(通过设置其translate属性):

稍后,当变量被resolved时,如果看到translate属性,Django会将其包装在ugettextpgettext中。

但是,从源代码可以看出,有一些灵活性考虑支持{% trans %}标签:

  • 你可以使用{% trans "String" noop %},将需要翻译的字符串放入.po文件中,但在渲染时不会实际翻译输出(变量没有内部的translate属性,也没有ugettext调用);
  • 你可以指定消息上下文*,例如{% trans "May" context "verb" %}
  • 你可以将翻译后的消息放入变量中以备后用*,例如{% trans "String" as translated_string %}

* 自Django 1.4起。

如果我漏掉了什么,请随时纠正我或发布更好的答案。


1

trans模板标签调用了ugettext()函数。在Django中,_()ugettext()的别名。这在Django文档中有详细介绍。


4
我知道在Python代码中,按照惯例使用_()作为ugettext()的别名,但在模板中不是这样。由于我们都不会在模板中添加类似于from django.utils.translation import ugettext as _的内容,因此不清楚下划线的工作原理。 - Anton Strogonoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接