1. ホーム
  2. python

[解決済み] ugettext_lazy はどのような場合に使用するのですか?

2022-04-24 14:48:29

質問

ugettextの使用について質問があります。 ugettext_lazy を翻訳に使用します。 私は、モデルにおいて、私は ugettext_lazy 一方、ビューでは ugettext です。 しかし、他の場所、私が使うべきは ugettext_lazy もあるのでしょうか?フォームの定義はどうでしょうか? 両者にパフォーマンスの違いはあるのでしょうか?

編集する そしてもうひとつ。時々、代わりに ugettext_lazy , ugettext_noop が使用されます。ドキュメントにあるように ugettext_noop の文字列は、翻訳対象としてマークされ、ユーザーに表示される前に可能な限り最新のタイミングで翻訳されます。 ugettext_lazy を行うのでしょうか?モデルやフォームにどちらを使うべきか、まだ決めかねています。

どのように解決するのですか?

ugettext() vs. ugettext_lazy()

フォームやモデルなどの定義には ugettext_lazy なぜなら、この定義のコードは一度だけ実行されるからです (大抵は 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))