3

Python と Flask マイクロフレームワークを使用して Web アプリケーションを作成しています。このアプリケーションは複数の言語をサポートする予定です。現在、i18n 対応の HTML テンプレートを作成する方法を決定しようとしています。私のテンプレート エンジンは Jinja2 です (ただし、必要に応じて他のものに切り替えることができるプロジェクトの初期段階です)。

gettext タグを含むテンプレートの一部の例を示すことから始めましょう。

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

このテンプレートには、アプリケーションが翻訳方法を知る必要がある 2 種類の文字列があります。

  1. テンプレートのコンテキストで実行時にのみ認識される動的文字列 (error文字列)
  2. いつでも既知の静的文字列 ("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>

次に、実行時にテンプレート エンジンは、要求されたロケールの特定のサブテンプレートがキャッシュで利用可能かどうかを確認する必要があります。見つかった場合は、レンダリングがはるかに高速になります。

このようなものを実装するフレームワーク、ツール、テンプレート エンジンなどはありますか?

または、翻訳データベースで同じテキストの小さなスニペットを何度も何度も検索するオーバーヘッドを回避する他の方法はありますか?

4

2 に答える 2

1

このような「最適化」が要求と応答のサイクル全体に与える影響を測定しましたか? 特に、Jinja2 のように非常に高速であることが既に知られているテンプレート言語を使用する場合に、何らかの意味のある速度向上が見られるとしたら、私は非常に驚かれることでしょう。

原則として、最適化の潜在的な利益を測定する前に最適化しないでください。この分野では、しばしば直感が完全に間違っています。これは、最適化によってコード、開発、または展開が複雑になる場合に特に当てはまります。手間をかける価値があるかどうかを常に測定してください。

おそらく、データベース クエリの最適化や高価な操作のキャッシュを検討する方が成功するでしょう (dictルックアップは、gettext基本的にはまったく高価ではありません)。

于 2012-04-30T06:08:47.543 に答える
0

あなたはそれを間違っています。I18Nize 変数 (最初のタイプ) は絶対に使用せず、静的テキスト (2 番目のタイプ)のみを使用してください。error変数自体ではなく、で使用できる文字列を I18Nize する必要があります。

また、最適化は、コード内ではなく、メッセージ カタログ (gettext) レベルで行う必要があります。

于 2012-04-30T05:45:04.740 に答える