Подтвердить что ты не робот

Задать язык в представлении django

фон: Вид вызывается, когда служба платежей возвращает результат платежа за кулисами - после чего мне нужно отправить электронное письмо на правильном языке для подтверждения платежа и так далее. Я могу вернуть код языка в запросе с платежного сервера и хотел бы использовать его вместе с системами Django i18n, чтобы определить, на каком языке отправить мой адрес электронной почты.

Поэтому мне нужно установить язык моего приложения django из представления. А затем сделайте мой рендеринг и отправку по электронной почте всего за один раз.

настройка request.session['django_language'] = lang влияет только на следующее представление, когда я тестирую.

Есть ли другой способ сделать это?

Приветствия,

Гай

4b9b3361

Ответ 1

Чтобы процитировать части из Django Locale Middleware (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) - важный бит.

Ответ 2

Обязательно добавьте деактивировать в process_response, иначе у вас будут проблемы с разными потоками.

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

Ответ 3

Иногда вы хотите принудительно использовать определенный язык для данного представления, но пусть настройки языка браузера выбирают язык для остальных видов. Я не понял, как изменить язык в коде просмотра, но вы можете сделать это, внедряя простую промежуточную версию

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
    ...
)

Не изящное решение, но оно работает.

Ответ 4

request.LANGUAGE_CODE, если активирован LocaleMiddleware

Ответ 5

Если вы хотите просто получить переведенные строки для языка по любой причине, вы можете использовать override в качестве декоратора следующим образом:

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

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

Ответ 6

Если вы используете 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

Ответ 7

С учетом класса, это должно работать:

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, а не из того, что изначально было истинным.