扩展

最后更新于:2022-04-01 04:04:22

下面的几节涵盖了可能被应用启用的 Jinja2 内置的扩展。应用也可以提供进一步 的扩展,但这不会在此描述。会有独立的文档来解释那种情况下的扩展。 ### i18n[](http://docs.jinkan.org/docs/jinja2/templates.html#i18n "Permalink to this headline") 如果启用来 i18n 扩展,可以把模板中的部分标记为可译的。标记一个段为可译的,可 以使用 trans: ~~~ <p>{% trans %}Hello {{ user }}!{% endtrans %}</p> ~~~ 要翻译一个模板表达式——比如使用模板过滤器或访问对象的属性——你需要绑定表达式到 一个名称来在翻译块中使用: ~~~ <p>{% trans user=user.username %}Hello {{ user }}!{% endtrans %}</p> ~~~ 如果你需要在 trans 标签中绑定一个以上的表达式,用逗号来分割( , ): ~~~ {% trans book_title=book.title, author=author.name %} This is {{ book_title }} by {{ author }} {% endtrans %} ~~~ 在翻译块中不允许使用语句,只能使用变量标签。 为表示复数,在 trans 和 endtrans 之间用 pluralize 标签同时指定单数和复 数形式: ~~~ {% trans count=list|length %} There is {{ count }} {{ name }} object. {% pluralize %} There are {{ count }} {{ name }} objects. {% endtrans %} ~~~ 默认情况下块中的第一个变量用于决定使用单数还是复数。如果这不奏效,你可以指定 用于复数的名称作为 pluralize 的参数: ~~~ {% trans ..., user_count=users|length %}... {% pluralize user_count %}...{% endtrans %} ~~~ 也可以翻译表达式中的字符串。为此,有三个函数: _ gettext: 翻译一个单数字符串 - ngettext: 翻译一个复数字符串 - _: gettext 的别名 例如你可以容易地这样打印一个已翻译的字符串: ~~~ {{ _('Hello World!') }} ~~~ 你可以使用 format 过滤器来使用占位符: ~~~ {{ _('Hello %(user)s!')|format(user=user.username) }} ~~~ 因为其它语言可能不会用同样的顺序使用词汇,要使用多个占位符,应始终用字符 串参数传给 format 。 Changed in version 2.5. 如果激活了新样式的 gettext 调用( [*新样式 Gettext*](http://docs.jinkan.org/docs/jinja2/extensions.html#newstyle-gettext) ),使用占位符 会更加简单: ~~~ {{ gettext('Hello World!') }} {{ gettext('Hello %(name)s!', name='World') }} {{ ngettext('%(num)d apple', '%(num)d apples', apples|count) }} ~~~ 注意 ngettext 函数的格式化字符串自动接受 num 参数作为计数作为附加的 常规参数。 ### 表达式语句[](http://docs.jinkan.org/docs/jinja2/templates.html#id39 "Permalink to this headline") 如果加载了表达式语句扩展,一个名为 do 的扩展即可用。它工作几乎如同常规的变量 表达式( {{ ... }} ),只是它不打印任何东西。这可以用于修改列表: ~~~ {% do navigation.append('a string') %} ~~~ ### 循环控制[](http://docs.jinkan.org/docs/jinja2/templates.html#id40 "Permalink to this headline") 如果应用启用来 [*循环控制*](http://docs.jinkan.org/docs/jinja2/extensions.html#loopcontrols-extension) ,则可以在循环中使用 break 和 continue 。到达 break 时,循环终止。到达 continue 时,当前处理会终止并 从下一次迭代继续。 这个循环每两项跳过一次: ~~~ {% for user in users %} {%- if loop.index is even %}{% continue %}{% endif %} ... {% endfor %} ~~~ 同样,这个循环 10 次迭代之后会终止处理: ~~~ {% for user in users %} {%- if loop.index >= 10 %}{% break %}{% endif %} {%- endfor %} ~~~ ### With 语句[](http://docs.jinkan.org/docs/jinja2/templates.html#with "Permalink to this headline") New in version 2.3. 如果应用启用了 [*With 语句*](http://docs.jinkan.org/docs/jinja2/extensions.html#with-extension) ,将允许在模板中使用 with 关键 字。这使得创建一个新的内作用域。这个作用域中的变量在外部是不可见的。 With 用法简介: ~~~ {% with %} {% set foo = 42 %} {{ foo }} foo is 42 here {% endwith %} foo is not visible here any longer ~~~ 因为在作用域的开始设置变量很常见,你可以在 with 语句里这么做。下面的两 个例子是等价的: ~~~ {% with foo = 42 %} {{ foo }} {% endwith %} {% with %} {% set foo = 42 %} {{ foo }} {% endwith %} ~~~
';