background:このビューは、支払いサービスが裏で支払い結果をpingするときに呼び出されます。その後、支払いを確認するために適切な言語でメールを送信する必要があります。支払いサーバーからリクエストに言語コードを戻すことができます。それをDjangoのi18nシステムと一緒に使用して、どの言語でメールを送信するかを決定したいと思います。
したがって、ビュー内からDjangoアプリの言語を設定する必要があります。そして、テンプレートのレンダリングとメール送信をすべて一度に行います。
設定request.session['Django_language'] = lang
は、テスト中にのみ次のビューに影響します。
他の方法はありますか?
乾杯、
男
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)
は重要なビットです。
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
ユーザーモデルに言語を保存し、このカスタムミドルウェア Django-user-language-middleware を使用することを検討できます。
これにより、_user.language
_フィールドで選択した言語を見ることでDjangoアプリを簡単に翻訳できます。また、ユーザーの言語設定をいつでも知ることができます。
使用法:
ユーザーモデルに言語フィールドを追加します。
_class User(auth_base.AbstractBaseUser, auth.PermissionsMixin):
# ...
language = models.CharField(max_length=10,
choices=settings.LANGUAGES,
default=settings.LANGUAGE_CODE)
_
Pipからミドルウェアをインストールします。
_pip install Django-user-language-middleware
_
それを設定のミドルウェアクラスリストに追加して、リクエストをリッスンします。
_MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10
...
'user_language_middleware.UserLanguageMiddleware',
...
]
_
これが将来この質問に答える人々に役立つことを願っています。
特定のビューに特定の言語を適用したいが、ブラウザの言語設定で残りのビューの言語を選択したい場合があります。ビューコードで言語を変更する方法を理解していませんが、簡単なミドルウェアを実装することでこれを行うことができます
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
...
)
エレガントなソリューションではありませんが、機能します。
何らかの理由で言語の翻訳された文字列を取得したい場合は、 デコレータとしてoverride
を使用 のようにします。
from Django.utils import translation
from Django.utils.translation import ugettext as _
with translation.override(language):
welcome = _('welcome')
request.LANGUAGE_CODE if LocaleMiddlewareアクティブ
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
クラスベースのビューでは、これは機能するはずです:
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
もともと本当だったものではなく。