i18n 扩展

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

**Import name:** jinja2.ext.i18n Jinja2 当前只附带一个扩展,就是 i18n 扩展。它可以与 [gettext](http://docs.python.org/dev/library/gettext) 或 [babel](http://babel.edgewall.org/) 联合使用。如果启用了 i18n 扩展, Jinja2 提供了 trans 语句来标记被其包裹的 字符串为可翻译的,并调用 gettext 。 在启用虚拟的 _ 函数后,之后的 gettext 调用会被添加到环境的全局变量。那么 一个国际化的应用应该不仅在全局,以及在每次渲染中在命名空间中提供至少一个 gettext 或可选的ngettext 函数。 ### 环境方法[](http://docs.jinkan.org/docs/jinja2/extensions.html#id3 "Permalink to this headline") 在启用这个扩展后,环境提供下面的额外方法: jinja2.Environment.install_gettext_translations(*translations*, *newstyle=False*)[](http://docs.jinkan.org/docs/jinja2/extensions.html#jinja2.Environment.install_gettext_translations "Permalink to this definition") 在该环境中全局安装翻译。提供的翻译对象要至少实现 uggettext 和 ungettext 。gettext.NullTranslations 和 gettext.GNUTranslations 类和 [Babel](http://babel.edgewall.org/)‘s 的 Translations 类也被支持。 Changed in version 2.5: 添加了新样式的 gettext jinja2.Environment.install_null_translations(*newstyle=False*)[](http://docs.jinkan.org/docs/jinja2/extensions.html#jinja2.Environment.install_null_translations "Permalink to this definition") 安装虚拟的 gettext 函数。这在你想使应用为国际化做准备但还不想实现完整的 国际化系统时很有用。 Changed in version 2.5: 添加了新样式的 gettext jinja2.Environment.install_gettext_callables(*gettext*, *ngettext*,*newstyle=False*)[](http://docs.jinkan.org/docs/jinja2/extensions.html#jinja2.Environment.install_gettext_callables "Permalink to this definition") 在环境中把给出的 gettext 和 ngettext 可调用量安装为全局变量。它们 应该表现得几乎与标准库中的 gettext.ugettext() 和 gettext.ungettext() 函数相同。 如果激活了 新样式 ,可调用量被包装为新样式的可调用量一样工作。更多 信息见 [*新样式 Gettext*](http://docs.jinkan.org/docs/jinja2/extensions.html#newstyle-gettext) 。 New in version 2.5. jinja2.Environment.uninstall_gettext_translations()[](http://docs.jinkan.org/docs/jinja2/extensions.html#jinja2.Environment.uninstall_gettext_translations "Permalink to this definition") 再次卸载翻译。 jinja2.Environment.extract_translations(*source*)[](http://docs.jinkan.org/docs/jinja2/extensions.html#jinja2.Environment.extract_translations "Permalink to this definition") 从给定的模板或源中提取本地化字符串。 对找到的每一个字符串,这个函数生产一个 (lineno, function, message ) 元组,在这里: * lineno 是这个字符串所在行的行号。 * function 是 gettext 函数使用的名称(如果字符串是从内嵌的 Python 代码中抽取的)。 * message 是字符串本身(一个 unicode 对象,在函数有多个字符串参数 时是一个unicode 对象的元组)。 如果安装了 [Babel](http://babel.edgewall.org/) , [*Babel 集成*](http://docs.jinkan.org/docs/jinja2/integration.html#babel-integration) 可以用来为 babel 抽取字符串。 对于一个对多种语言可用而对所有用户给出同一种的语言的 web 应用(例如一个法国社 区安全了一个多种语言的论坛软件)可能会一次性加载翻译并且在环境生成时把翻译方 法添加到环境上: ~~~ translations = get_gettext_translations() env = Environment(extensions=['jinja2.ext.i18n']) env.install_gettext_translations(translations) ~~~ get_get_translations 函数会返回当前配置的翻译器。(比如使用 gettext.find ) 模板设计者的 i18n 扩展使用在 [*模板文档*](http://docs.jinkan.org/docs/jinja2/templates.html#i18n-in-templates) 中有描述。 ### 新样式 Gettext[](http://docs.jinkan.org/docs/jinja2/extensions.html#newstyle-gettext "Permalink to this headline") New in version 2.5. 从版本 2.5 开始你可以使用新样式的 gettext 调用。这些的启发源于 trac 的内部 gettext 函数并且完全被 babel 抽取工具支持。如果你不使用 Babel 的抽取工具, 它可能不会像其它抽取工具预期的那样工作。 标准 gettext 调用和新样式的 gettext 调用有什么区别?通常,它们要输入的东西 更少,出错率更低。并且如果在自动转义环境中使用它们,它们也能更好地支持自动 转义。这里是一些新老样式调用的差异: 标准 gettext: ~~~ {{ gettext('Hello World!') }} {{ gettext('Hello %(name)s!')|format(name='World') }} {{ ngettext('%(num)d apple', '%(num)d apples', apples|count)|format( num=apples|count )}} ~~~ 新样式看起来是这样: ~~~ {{ gettext('Hello World!') }} {{ gettext('Hello %(name)s!', name='World') }} {{ ngettext('%(num)d apple', '%(num)d apples', apples|count) }} ~~~ 新样式 gettext 的优势是你需要输入的更少,并且命名占位符是强制的。后者看起 来似乎是缺陷,但解决了当翻译者不能切换两个占位符的位置时经常勉励的一大堆 麻烦。使用新样式的 gettext ,所有的格式化字符串看起来都一样。 除此之外,在新样式 gettext 中,如果没有使用占位符,字符串格式化也会被使用, 这使得所有的字符串表现一致。最后,不仅是新样式的 gettext 调用可以妥善地为 解决了许多转义相关问题的自动转义标记字符串,许多模板也在使用自动转义时体验 了多次。
';