いつugettext_lazyを使用すればよいですか?


141

ugettextの使用とugettext_lazy翻訳について質問があります。ugettext_lazyビューではugettextを使用しながら、モデルではを使用する必要があることを学びました。しかし、私が使うべき他の場所はありますかugettext_lazyますか?フォーム定義はどうですか?それらの間にパフォーマンスの違いはありますか?

編集: そしてもう1つ。時には、代わりにugettext_lazyugettext_noop使用されています。ドキュメンテーションが言うように、ugettext_noop文字列は翻訳のためにマークされ、ユーザーに表示する前に可能な限り最新の瞬間に翻訳されますが、私はここで少し混乱しています、それは何をするのと似ていugettext_lazyませんか?モデルとフォームでどちらを使用するかを決めるのはまだ難しいです。

回答:


196

ugettext()ugettext_lazy()

フォームやモデルなどのugettext_lazy定義では、この定義のコードは1回だけ実行されるため(ほとんどがdjangoの起動時に)、使用する必要があります。ugettext_lazy文字列を遅延して翻訳します。つまり、モデルの属性の名前にアクセスするたびに、文字列が新しく翻訳されます。これは、djangoが起動してからこのモデルをさまざまな言語で表示している可能性があるため、完全に意味があります。

ビューおよび同様の関数呼び出しでugettextは、ビューが呼び出されるたびに問題なく使用できます。ugettextたびに新しく実行されるため、常に要求に合った適切な変換が得られます。

について ugettext_noop()

以下のようブライス翻訳のための抽出として、彼の答えに、この機能マーク文字列を指摘したが、未翻訳の文字列を返しません。これは、翻訳済みと未翻訳の2つの場所で文字列を使用する場合に便利です。次の例を参照してください。

import logging
from django.http import HttpResponse
from django.utils.translation import ugettext as _, ugettext_noop as _noop

def view(request):
    msg = _noop("An error has occurred")
    logging.error(msg)
    return HttpResponse(_(msg))

15
私の意見では、これはDjangoのドキュメントでの説明よりも理解しやすいです。@Bernhardに感謝します。
Utku、2012

14
ありがとう!"" .replace、文字列連結などの文字列を期待するものに渡す場合など、ugettext_lazyを使用しない場合について説明することも役立ちます。これらの場合、遅延プロキシオブジェクトは機能しません。それ以外の場合、この回答は、常にugettext_lazyを使用するだけで安全であることを意味します。
mrooney 2013

4
@mrooneyこれらのケースは重要ではありません。間違った言語の翻訳を黙って返すのではなく、エラーが発生するからです。また、 ""。replaceをugettext_lazyで使用することもできます。結果に対してstr()を呼び出すだけで済みます。
fabspro 2014年

1
なしの場合、msg = "An error has occurred"; logging.error(msg);return HttpResponse(_(msg))? why need _noop については?どう_noopですか?
WeizhongTu 2016

1
翻訳は変数に対して機能します。繰り返しますが、これは同じドキュメントの_noopです。なぜですか?
WeizhongTu 2016


5

遅延バージョンは文字列ではなくプロキシオブジェクトを返し、状況によっては期待どおりに動作しません。例えば:

def get(self, request, format=None):
   search_str = request.GET.get('search', '')
   data = self.search(search_str)
   lst = []
   lst.append({'name': ugettext_lazy('Client'), 'result': data})
   return HttpResponse(json.dumps(lst), content_type='application/json')

最後の行はlstオブジェクトをJSONにシリアル化しようとし、「クライアント」の文字列の代わりにプロキシオブジェクトがあるため、失敗します。プロキシオブジェクトはjsonにシリアル化できません。


2
このような場合はugettextを使用してください。
sudip
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.