3

我正在使用 Python 和 Flask 微框架编写一个 Web 应用程序。该应用程序将支持多种语言,我现在正在尝试决定如何编写启用 i18n 的 html 模板。我的模板引擎是 Jinja2(尽管在我的项目中还很早,我可以在必要时切换到其他东西)。

让我首先展示一个带有 gettext 标签的模板的示例部分:

{% if error %}<div class="error">{{ _(error) }}</div>{% endif %}
<h1>{{ _("Hello, World!") }}</h1>

在此模板中,应用程序需要知道如何翻译两种字符串:

  1. 在模板上下文中仅在运行时才知道的动态字符串(error字符串)
  2. 随时已知的静态字符串("Hello, World!"字符串)

第一种情况很容易处理。该字符串在运行时传递给 gettext 引擎以获取翻译版本。那里没有问题。

虽然可以以相同的方式处理第二种情况,但我的印象是必须有一种更有效的方式来处理这些静态字符串。我为 gettext、Babel 或 Jinja2 阅读的文档中没有提到任何关于优化静态字符串的翻译,每次需要渲染模板时都必须搜索和定位这些字符串。

我认为很有意义的一种方法是将每个模板预渲染为一组特定于语言的子模板,其中每个子模板都解析了静态字符串,只留下动态文本部分供 gettext 在运行时处理.

因此,例如,如果我想支持英语和西班牙语,我上面的模板将由某个工具离线处理,该工具将生成两个将被写入模板缓存的子模板:

模板-en.html:

{% if error %}<div class="error">{{ _(error) }}</div>{% endif %}
<h1>Hello, World!</h1>

模板-es.html:

{% if error %}<div class="error">{{ _(error) }}</div>{% endif %}
<h1>¡Hola, Mundo!</h1>

然后在运行时,模板引擎需要检查缓存中是否有针对所请求语言环境的特定子模板,如果找到,则渲染速度会快得多。

是否有任何框架、工具、模板引擎等实现了这样的功能?

或者有没有其他方法可以避免一遍又一遍地在翻译数据库中搜索相同的小文本片段的开销?

4

2 回答 2

1

您是否测量过这种“优化”对整个请求-响应周期的影响?如果你能看到任何有意义的加速,我会感到非常惊讶,尤其是在使用已知速度非常快的模板语言时,比如 Jinja2。

作为一般规则:在衡量优化的潜在收益之前永远不要优化。在这方面,直觉通常是完全错误的。当优化在代码、开发或部署中引入复杂性时尤其如此——总是衡量它是否值得麻烦。

dict在优化数据库查询或缓存昂贵的操作(查找,gettext基本上是,根本不昂贵)方面,您可能会取得更大的成功。

于 2012-04-30T06:08:47.543 回答
0

你这样做是错的。你永远不应该 I18Nize 变量(你的第一种类型),只有静态文本(你的第二种类型)。您需要 I18Nize 可以使用的字符串,而error不是变量本身。

并且应该在消息目录(gettext)级别进行优化,而不是在您的代码中。

于 2012-04-30T05:45:04.740 回答