模板中的翻译

要在模板中启用翻译,你必须加载 i18n 库。

{% load i18n %}

使用 trans 模板标签进行基本翻译。

{% trans "Some translatable text" %}
{# equivalent to python `ugettext("Some translatable text")` #}

trans 模板标签支持上下文:

{% trans "May" context "month" %}
{# equivalent to python `pgettext("May", "month")` #}

要在翻译字符串中包含占位符,请参阅:

_("My name is {first_name} {last_name}").format(first_name="John", last_name="Doe")

你将必须使用 blocktrans 模板标记:

{% blocktrans with first_name="John" last_name="Doe" %}
  My name is {{ first_name }} {{ last_name }}
{% endblocktrans %}

当然不是 JohnDoe,你可以有变量和过滤器:

{% blocktrans with first_name=user.first_name last_name=user.last_name|title %}
  My name is {{ first_name }} {{ last_name }}
{% endblocktrans %}

如果 first_namelast_name 已经在你的上下文中,你甚至可以省略 with 子句:

{% blocktrans %}My name is {{ first_name }} {{ last_name }}{% endblocktrans %}

但是,只能使用顶级上下文变量。这不起作用:

{% blocktrans %}
    My name is {{ user.first_name }} {{ user.last_name }}
{% endblocktrans %}

这主要是因为变量名称在翻译文件中用作占位符。

blocktrans 模板标签也接受复数化。

{% blocktrans count nb=users|length }}
    There is {{ nb }} user.
{% plural %}
    There are {{ nb }} users.
{% endblocktrans %}

最后,无论 i18n 库,你都可以使用 _("") 语法将可翻译字符串传递给模板标记。

{{ site_name|default:_("It works!") }}
{% firstof var1 var2 _("translatable fallback") %}

这是一个神奇的内置 django 模板系统来模仿函数调用语法,但这不是函数调用。_("It works!") 作为字符串'_("It works!")'传递给 default 模板标签,然后解析为可翻译字符串,就像 name 将被解析为变量而 name 将被解析为字符串。