Python と Flask マイクロフレームワークを使用して Web アプリケーションを作成しています。このアプリケーションは複数の言語をサポートする予定です。現在、i18n 対応の HTML テンプレートを作成する方法を決定しようとしています。私のテンプレート エンジンは Jinja2 です (ただし、必要に応じて他のものに切り替えることができるプロジェクトの初期段階です)。
gettext タグを含むテンプレートの一部の例を示すことから始めましょう。
{% if error %}<div class="error">{{ _(error) }}</div>{% endif %}
<h1>{{ _("Hello, World!") }}</h1>
このテンプレートには、アプリケーションが翻訳方法を知る必要がある 2 種類の文字列があります。
- テンプレートのコンテキストで実行時にのみ認識される動的文字列 (
error
文字列) - いつでも既知の静的文字列 (
"Hello, World!"
文字列)
最初のケースは扱いやすいです。文字列は実行時に gettext エンジンに渡され、翻訳されたバージョンが取得されます。そこに問題はありません。
2 番目のケースは同じ方法で処理できますが、これらの静的文字列を処理するためのより効率的な方法が必要であるというのが私の印象です。gettext、Babel、または Jinja2 について私が読んだドキュメントには、テンプレートをレンダリングする必要があるたびに検索して配置する必要がある静的文字列の翻訳の最適化については何も言及されていません。
私が非常に理にかなっていると思うアプローチは、各テンプレートを言語固有のサブテンプレートのセットに事前にレンダリングすることです。各サブテンプレートには静的文字列が解決されており、gettext が実行時に処理する動的テキスト セクションのみが残されます。 .
たとえば、英語とスペイン語をサポートしたい場合、上記のテンプレートは、テンプレート キャッシュに書き込まれる 2 つのサブテンプレートを生成するツールによってオフラインで処理されます。
テンプレート 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>
次に、実行時にテンプレート エンジンは、要求されたロケールの特定のサブテンプレートがキャッシュで利用可能かどうかを確認する必要があります。見つかった場合は、レンダリングがはるかに高速になります。
このようなものを実装するフレームワーク、ツール、テンプレート エンジンなどはありますか?
または、翻訳データベースで同じテキストの小さなスニペットを何度も何度も検索するオーバーヘッドを回避する他の方法はありますか?