установить язык в представлении Django - PullRequest
49 голосов
/ 25 февраля 2010

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

Поэтому мне нужно установить языкмое приложение Django изнутри зрения.А затем выполняю рендеринг и отправку по шаблону всего за один раз.

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

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

Ура,

Парень

Ответы [ 8 ]

78 голосов
/ 25 февраля 2010

Цитировать детали из промежуточного программного обеспечения Джанго (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) - важный бит.

12 голосов
/ 23 октября 2012

Не забудьте также добавить deactivate в 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 голосов
/ 10 апреля 2018

Вы можете сохранить язык в пользовательской модели и использовать это специальное промежуточное ПО django-user-language-middleware .

Это позволяет легко переводить ваше приложение Django, посмотрев на выбранный язык в поле user.language, и вы всегда сможете узнать языковые предпочтения любого пользователя.

Использование:

  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 голосов
/ 10 октября 2011

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

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

Не элегантное решение, но оно работает.

2 голосов
/ 11 мая 2017

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

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

with translation.override(language):
    welcome = _('welcome')
2 голосов
/ 08 декабря 2010

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

1 голос
/ 08 июня 2017

Если вы используете 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
0 голосов
/ 11 декабря 2017

Для представлений на основе классов это должно работать:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...