我正在使用 Python 和 Flask 微框架编写一个 Web 应用程序。该应用程序将支持多种语言,我现在正在尝试决定如何编写启用 i18n 的 html 模板。我的模板引擎是 Jinja2(尽管在我的项目中还很早,我可以在必要时切换到其他东西)。
让我首先展示一个带有 gettext 标签的模板的示例部分:
{% if error %}<div class="error">{{ _(error) }}</div>{% endif %}
<h1>{{ _("Hello, World!") }}</h1>
在此模板中,应用程序需要知道如何翻译两种字符串:
- 在模板上下文中仅在运行时才知道的动态字符串(
error
字符串) - 随时已知的静态字符串(
"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>
然后在运行时,模板引擎需要检查缓存中是否有针对所请求语言环境的特定子模板,如果找到,则渲染速度会快得多。
是否有任何框架、工具、模板引擎等实现了这样的功能?
或者有没有其他方法可以避免一遍又一遍地在翻译数据库中搜索相同的小文本片段的开销?