我正在使用 Python 和 Flask 微框架编写网络应用程序。该应用程序将支持多种语言,我现在正试图决定如何编写支持 i18n 的 html 模板。我的模板引擎是 Jinja2(尽管它在我的项目中还很早,如果需要我可以切换到其他引擎)。
让我首先展示带有 gettext 标签的模板的示例部分:
{% if error %}<div class="error">{{ _(error) }}</div>{% endif %}
<h1>{{ _("Hello, World!") }}</h1>
在这个模板中,应用程序需要知道如何翻译两种字符串:
- 只有在运行时才能知道模板上下文中的动态字符串(
error
字符串) - 随时已知的静态字符串(
“Hello, World!”
字符串)
第一种情况很容易处理。该字符串在运行时传递给 gettext 引擎以获取翻译后的版本。没有问题。
虽然第二种情况可以用同样的方式处理,但我的印象是必须有一种更有效的方式来处理这些静态字符串。我阅读的有关 gettext、Babel 或 Jinja2 的文档都没有提到任何关于优化静态字符串的翻译的内容,每次需要呈现模板时都必须搜索和定位这些字符串。
我认为很有意义的一种方法是将每个模板预渲染到一组特定于语言的子模板中,其中每个子模板都解析了静态字符串,只留下 gettext 的动态文本部分在运行时处理。
因此,例如,如果我想支持英语和西类牙语,我上面的模板将由一些工具离线处理,该工具将生成两个将写入模板缓存的子模板:
template-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>
然后在运行时,模板引擎需要检查缓存中是否存在所请求区域设置的特定子模板,如果找到,则渲染速度会快得多。
是否有任何框架、工具、模板引擎等可以实现这样的功能?
或者是否有任何其他方法可以避免在翻译数据库中一遍又一遍地搜索相同的小文本片段的开销?
最佳答案
您是否衡量过这种“优化”对整个请求-响应周期的影响?如果您看到任何有意义的加速,我会感到非常惊讶,尤其是在使用已知速度非常快的模板语言时,例如 Jinja2。
一般规则:在衡量优化的潜在 yield 之前,切勿进行优化。在这方面,直觉往往是完全错误的。当优化在代码、开发或部署中引入复杂性时尤其如此 - 始终衡量它是否值得麻烦。
您可能会更成功地研究优化数据库查询或缓存昂贵的操作(dict
查找,gettext
基本上是,根本不昂贵) .
关于python - 国际化 html 模板的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10378975/