2011-09-21 11 views
36

Djangoテンプレートでは、翻訳する文字列には{{ _("Hello World") }}または{% trans "Hello World" %}のいずれかを使用できます。ドキュメントでは、 "公式の"アプローチは{% trans %}タグのようですが、_()という構文もあわせてonceと記載されています。_()または{%trans%}はDjangoテンプレートにありますか?

これらのアプローチが(構文を除いて)とどのように異なっているのですか。

タグとフィルタでは明らかに{% trans %}を使用できない点が違います。しかし、{{ _("String") }}のようにどこでも_()を使うことができますか?スタンドアロンの文字列で{% trans "String" %}を使用し、タグとフィルタを使用して_()を使用するよりもはるかにクリーンで安定しています。

答えて

42

したがって、Django 1.5の場合と技術的には違いはないようです。テンプレートエンジンは、内部の2つの場合に(そのtranslate属性を設定することで)翻訳のための変数をマーク:

  • を変数の名前が_(で始まり、で終わる場合は、{% trans VAR %}TranslateNodeを参照)、または
  • を行うとき)Variable.__init__参照)。変数がresolvedされているとき、それはtranslate属性を見れば

その後、Djangoはugettextまたはpgettextでそれをラップします。しかし

、ソースコードからわかるように、そこに {% trans %}タグの賛成である程度の柔軟性の考慮事項です:

  • あなたは.poファイルへの変換のための文字列を入れます{% trans "String" noop %}を行うことができますが、しかし、ウォンは、レンダリング時に実際に出力を変換しません(変数に内部translate属性なし、ugettext呼び出しなし)。
  • メッセージコンテキスト*を指定することができます({% trans "May" context "verb" %}など)。
  • のように、後で*のように翻訳メッセージを変数に入れることができます。

* Django 1.4以降。

何かが見つからない場合は、私を修正してください。

+1

+1これをチェックするにはソースに行く。 –

1

transテンプレートタグは、ugettext()関数を呼び出します。 Djangoで_()は、ugettext()の別名です。 これはdjango docsに記載されています。

+2

私は、 '_()'は慣例として、Pythonコード_では 'ugettext()'のエイリアスとして使用されていますが、テンプレートでは使用されていないことを知っています。そして、テンプレートに 'django.utils.translation import ugettext from _'のようなものを置かないので、アンダースコアがどのくらい正確に動作するかは不明です。 – Tony

関連する問題