web-dev-qa-db-ja.com

_()または{%trans%} in Django templates?

Djangoテンプレートでは、{{ _("Hello World") }}または_{% trans "Hello World" %}_のいずれかを使用して、文字列を翻訳対象としてマークできます。ドキュメントでは、「公式」アプローチは- _{% trans %}_ タグですが、_()構文も記載されています once

これらのアプローチの違い(構文を除く)、なぜ一方が他方よりも望ましいのでしょうか?

1つの違いは、タグとフィルターで_{% trans %}_を使用できないことは明らかです。しかし、それは、_()のように、どこでも{{ _("String") }}を使用できるということですか?動作し、スタンドアロン文字列で_{% trans "String" %}_を使用し、タグとフィルターで_()を使用するよりもずっときれいで一貫性があります。

40

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

  • _{% trans VAR %}_を実行する場合( TranslateNode を参照)、または
  • 変数の名前が__(_で始まり、_)_で終わる場合( _Variable.__init___ を参照)。

後で、変数が 解決済み である場合、Djangoは、ugettext属性が見つかった場合、pgettextまたはtranslateでラップします。

ただし、ソースコードからわかるように、_{% trans %}_タグを優先する柔軟性の考慮事項がいくつかあります。

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

* Django 1.4。

何かが足りない場合は、お気軽に修正するか、より良い回答を投稿してください。

46

Transテンプレートタグは、ugettext()関数を呼び出します。 In Django_()ugettext()これは Django docs で説明されています。

1
gagamil