web-dev-qa-db-ja.com

Djangoビュー内で言語を設定

background:このビューは、支払いサービスが裏で支払い結果をpingするときに呼び出されます。その後、支払いを確認するために適切な言語でメールを送信する必要があります。支払いサーバーからリクエストに言語コードを戻すことができます。それをDjangoのi18nシステムと一緒に使用して、どの言語でメールを送信するかを決定したいと思います。

したがって、ビュー内からDjangoアプリの言語を設定する必要があります。そして、テンプレートのレンダリングとメール送信をすべて一度に行います。

設定request.session['Django_language'] = langは、テスト中にのみ次のビューに影響します。

他の方法はありますか?

乾杯、

49
Guy Bowden

Djangoのロケールミドルウェア(_Django.middleware.locale.LocaleMiddleware_)の一部を引用するには:

_from Django.utils import translation

class LocaleMiddleware(object):
    """
    This is a very simple middleware that parses a request
    and decides what translation object to install in the current
    thread context. This allows pages to be dynamically
    translated to the language the user desires (if the language
    is available, of course).
    """

    def process_request(self, request):
        language = translation.get_language_from_request(request)
        translation.activate(language)
        request.LANGUAGE_CODE = translation.get_language()
_

translation.activate(language)は重要なビットです。

79
stefanw

Process_responseにもdeactivateを追加してください。そうしないと、異なるスレッドで問題が発生します。

from Django.utils import translation

class LocaleMiddleware(object):
    """
    This is a very simple middleware that parses a request
    and decides what translation object to install in the current
    thread context. This allows pages to be dynamically
    translated to the language the user desires (if the language
    is available, of course).
    """

    def process_request(self, request):
        language = translation.get_language_from_request(request)
        translation.activate(language)
        request.LANGUAGE_CODE = translation.get_language()

    def process_response(self, request, response):
        translation.deactivate()
        return response
12
webjunkie

ユーザーモデルに言語を保存し、このカスタムミドルウェア Django-user-language-middleware を使用することを検討できます。

これにより、_user.language_フィールドで選択した言語を見ることでDjangoアプリを簡単に翻訳できます。また、ユーザーの言語設定をいつでも知ることができます。

使用法:

  1. ユーザーモデルに言語フィールドを追加します。

    _class User(auth_base.AbstractBaseUser, auth.PermissionsMixin):
        # ...
        language = models.CharField(max_length=10,
                                    choices=settings.LANGUAGES,
                                    default=settings.LANGUAGE_CODE)
    _
  2. Pipからミドルウェアをインストールします。

    _pip install Django-user-language-middleware_

  3. それを設定のミドルウェアクラスリストに追加して、リクエストをリッスンします。

    _MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
        ...
        'user_language_middleware.UserLanguageMiddleware',
        ...
    ]
    _

これが将来この質問に答える人々に役立つことを願っています。

3
Laura Barluzzi

特定のビューに特定の言語を適用したいが、ブラウザの言語設定で残りのビューの言語を選択したい場合があります。ビューコードで言語を変更する方法を理解していませんが、簡単なミドルウェアを実装することでこれを行うことができます

lang_based_on_url_middleware.py:

from Django.utils import translation

# Dictionary of urls that should use special language regardless of language set in browser
#   key = url
#   val = language code
special_cases = {
    '/this/is/some/url/' : 'dk',
    '/his/is/another/special/case' : 'de',
                 }

class LangBasedOnUrlMiddleware(object):
    def process_request(self, request):
        if request.path_info in special_cases:
            lang = special_cases[request.path_info]
            translation.activate(lang)
            request.LANGUAGE_CODE = lang

Settings.pyで:

MIDDLEWARE_CLASSES = (
    ...
    'Django.middleware.locale.LocaleMiddleware',
    'inner.lang_based_on_url_middleware.LangBasedOnUrlMiddleware', # remember that the order of LocaleMiddleware and LangBasedOnUrlMiddleware matters
    ...
)

エレガントなソリューションではありませんが、機能します。

3
Helgi Borg

何らかの理由で言語の翻訳された文字列を取得したい場合は、 デコレータとしてoverrideを使用 のようにします。

from Django.utils import translation
from Django.utils.translation import ugettext as _

with translation.override(language):
    welcome = _('welcome')
2
Flimm

request.LANGUAGE_CODE if LocaleMiddlewareアクティブ

2
DenisKolodin

Django 1.10以降を使用している場合、カスタムミドルウェアの新しい構文があります。

from Django.utils import translation

class LocaleMiddleware(object):

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):

        language_code = 'en' #TODO, your logic

        translation.activate(language_code)

        response = self.get_response(request)

        translation.deactivate()

        return response
1
Patrik Beck

クラスベースのビューでは、これは機能するはずです:

class YourView(SomeBuiltInView):
def get(self, request, *args, **kwargs):
    setattr(request, 'LANGUAGE_CODE', 'YOUR_LANGUAGE_CODE')
    return super().get(self, request, *args, **kwargs)

基本的には、ビューレンダラーにリクエストがYOUR_LANGUAGE_CODEもともと本当だったものではなく。

0
emihir0