模板代码中的国际化

2018-03-31  本文已影响25人  大爷的二舅

Django模板中的翻译使用了两个模板标签,与Python代码中的语法略有不同。 为了让您的模板可以访问这些代码,请将{%load i18n%}放在模板的顶部。 与所有模板标签一样,该标签需要加载到所有使用翻译的模板中,甚至包括那些已经加载了i18n标签的模板。

反模板标签

{%trans%}模板标记会翻译一个常量字符串(用单引号或双引号括起来)或可变内容:

<title>{% trans "This is the title."
%}</title>
<title>{% trans myvar %}</title>

如果noop选项存在,变量查找仍然会发生,但转换会被跳过。 在将来需要翻译的内容残留时,这非常有用:

<title>{% trans "myvar" noop %}</title>

如果模板变量(myvar above)被传递给标签,标签将首先在运行时将这个变量解析为字符串,然后在消息目录中查找该字符串。

无法在{%trans%}中混合字符串内的模板变量。 如果您的翻译需要带变量的字符串(占位符),请改为使用{%blocktrans%}。 如果您想检索翻译的字符串而不显示它,可以使用以下语法:

{% trans "This is the title" as the_title %}

在实践中,您将使用它来获取在多个地方使用的字符串,或者应该将其用作其他模板标记或过滤器的参数:

{% trans "starting point" as start %}
{% trans "end point" as end %}
{% trans "La Grande Boucle" as race %}

<h1>
  <a href="/" title="{% blocktrans %}Back to '{{ race }}'
homepage{% endblocktrans %}">{{ race }}</a>
</h1>
<p>
{% for stage in tour_stages %}
    {% cycle start end %}: {{ stage }}{% if forloop.counter|divisibleby:2 %}<br />{% \
else %}, {% endif %}
{% endfor %}
</p>

{%trans%}还使用context关键字支持上下文标记:

{% trans "May" context "month name" %}
blocktrans模板标签

blocktrans标记允许您通过使用占位符来标记由文字和可变内容组成的复杂句子:

{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}

要翻译模板表达式 - 比如访问对象属性或使用模板过滤器 - 您需要将表达式绑定到局部变量以在翻译块中使用。 例子:

{% blocktrans with amount=article.price %}
That will cost $ {{ amount }}.
{% endblocktrans %}

{% blocktrans with myvar=value|filter %}
This will have {{ myvar }} inside.
{% endblocktrans %}

您可以在一个blocktrans标记中使用多个表达式:

{% blocktrans with book_t=book|title author_t=author|title %}
This is {{ book_t }} by {{ author_t }}
{% endblocktrans %}

前面更详细的格式仍然受支持:

{% blocktrans with book|title as book_t and author|title as author_t %}

其他块标记(例如{%for%}或{%if%})不允许在blocktrans标记内。

如果解决其中一个块参数失败,通过使用deactivate_all()函数临时禁用当前活动的语言,块转换将回退到默认语言。

这个标签也提供了多元化。 要使用它:

例如:

{% blocktrans count counter=list|length %}
  There is only one {{ name }} object.
  {% plural %}
  There are {{ counter }} {{ name }} objects.
  {% endblocktrans %}

一个更复杂到例子:

 {% blocktrans with amount=article.price count years=i.length %}
  That will cost $ {{ amount }} per year.
  {% plural %}
  That will cost $ {{ amount }} per {{ years }} years.
  {% endblocktrans %}

当除了计数器值之外还使用多元化特征并将值绑定到局部变量时,请记住,blocktrans构造会在内部转换为ungettext调用。 这意味着应用与ungettext变量相同的注释。

反向URL查找无法在块转换中执行,应该预先检索(并存储):

{% url 'path.to.view' arg arg2 as the_url %}
{% blocktrans %}
This is a URL: {{ the_url }}
{% endblocktrans %}

{%blocktrans%}也使用context关键字支持上下文:

{% blocktrans with name=user.username context "greeting" %}
Hi {{ name }}{% endblocktrans %}

另一个功能{%blocktrans%}支持的是修剪选项。 此选项将从{%blocktrans%}标记的内容的开头和结尾删除换行符,替换行首和末尾的空白,并将所有行合并为一个空格字符以将它们分开。

这对缩进{%blocktrans%}标签的内容非常有用,而不会使缩进字符最终位于PO文件的相应条目中,这使翻译过程变得更加简单。

例如,以下{%blocktrans%}标记:

{% blocktrans trimmed %}
  First sentence.
  Second paragraph.
{% endblocktrans %}

将导致输入“First sentence. Second paragraph.”。 在PO文件中,与“\n First sentence.\n Second sentence.\n”相比较,如果没有指定修剪选项。

传递给标签和过滤器的字符串文字
您可以使用熟悉的_()语法将字符串文字作为参数传递给标记和过滤器:

{% some_tag _("Page not found") value|yesno:_("yes,no") %}

在这种情况下,标签和过滤器都会看到翻译的字符串,因此他们不需要知道翻译。

在此示例中,翻译基础结构将传递字符串“是,否”,而不是单个字符串“是”和“否”。 翻译后的字符串需要包含逗号,以便过滤器解析代码知道如何分解参数。 例如,德国翻译可能会将字符串“是,否”翻译为“ja,nein”(保持逗号不变)。

模板中的译员评论
就像使用Python代码一样,可以使用注释来指定这些翻译笔记,可以使用注释标记:

{% comment %}Translators: View verb{% endcomment %}
{% trans "View" %}

{% comment %}Translators: Short intro blurb{% endcomment %}
<p>{% blocktrans %}
    A multiline translatable literal.
   {% endblocktrans %}
</p>

或者使用{#...#}单行注释构造:

{# Translators: Label of a button that triggers search #}
<button type="submit">{% trans "Go" %}</button>

{# Translators: This is a text of the base template #}
{% blocktrans %}Ambiguous translatable block of text{% endblocktrans %}

为了完整起见,这些是结果.po文件的相应片段:

#. Translators: View verb
# path/to/template/file.html:10
msgid "View"
msgstr ""

#. Translators: Short intro blurb
# path/to/template/file.html:13
msgid ""
"A multiline translatable"
"literal."
msgstr ""

# ...

#. Translators: Label of a button that triggers search
# path/to/template/file.html:100
msgid "Go"
msgstr ""

#. Translators: This is a text of the base template
# path/to/template/file.html:103
msgid "Ambiguous translatable block of text"
msgstr ""

在模板中切换语言
如果您想在模板中选择一种语言,则可以使用语言模板标签:

{% load i18n %}

{% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} -->
<p>{% trans "Welcome to our page" %}</p>

{% language 'en' %}

    {% get_current_language as LANGUAGE_CODE %}
    <!-- Current language: {{ LANGUAGE_CODE }} -->
    <p>{% trans "Welcome to our page" %}</p>

{% endlanguage %}

尽管欢迎来到我们页面的第一次使用当前语言,但第二次将始终使用英语。

其他标签
这些标签还需要{%load i18n%}。

如果您启用了django.template.context_processors.i18n上下文处理器,则每个RequestContext都可以访问上面定义的LANGUAGES,LANGUAGE_CODE和LANGUAGE_BIDI。

新项目默认情况下,i18n上下文处理器未启用。

您还可以使用提供的模板标签和过滤器来检索有关任何可用语言的信息。 要获取关于单一语言的信息,请使用{%get_language_info%}标记:

{% get_language_info for LANGUAGE_CODE as lang %}
{% get_language_info for "pl" as lang %}

然后你可以访问这些信息:

Language code: {{ lang.code }}<br />
Name of language: {{ lang.name_local }}<br />
Name in English: {{ lang.name }}<br />
Bi-directional: {{ lang.bidi }}

您还可以使用{%get_language_info_list%}模板标记来检索语言列表的信息(例如,在LANGUAGES中指定的活动语言)。 有关如何使用{%get_language_info_list%}显示语言选择器的示例,请参阅关于set_language重定向视图的部分。

除了元组的LANGUAGES样式列表外,{%get_language_info_list%}还支持简单的语言代码列表。 如果你在你看来这样做:

context = {'available_languages': ['en', 'es', 'fr']}
return render(request, 'mytemplate.html', context)

您可以遍历模板中的这些语言:

{% get_language_info_list for available_languages as langs %}
{% for lang in langs %} ... {% endfor %}

为了方便,还有简单的过滤器可用:

上一篇 下一篇

猜你喜欢

热点阅读