Как установить язык для всей сессии после входа в систему в Django

#django #internationalization #translation #django-login

Вопрос:

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

Для этого я определил следующее:

В settings.py файл добавьте промежуточное программное обеспечение:

'django.middleware.locale.LocaleMiddleware',

 MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
 

Также добавьте средство визуализации контекста:
'django.template.context_processors.i18n'

И я определил свои 3 языка:

 LANGUAGE_CODE = 'es'

LANGUAGES = [
    ('es' _('Spanish')),
    ('en', _ ('English')),
    ('it', _ ('Italian')),
] 

 

Таково мое мнение:

 class LoginFormView(FormView):
    form_class = UserLoginForm
    template_name = 'login.html'
    success_url = reverse_lazy('index')

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return HttpResponseRedirect(self.success_url)
        return super().dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        login(self.request, form.get_user())
        user_language = self.request.POST.get('language', None)
        translation.activate(user_language)
        self.request.session['django_language'] = user_language
        self.request.session[translation.LANGUAGE_SESSION_KEY] = user_language
        return HttpResponseRedirect(self.success_url)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Iniciar sesión'
        return context
 

Несмотря на это, язык после входа в систему не меняется и всегда остается на испанском языке.

Все шаблоны имеют тег:

 {% load i18n %}
 

I also tried to force the language change by placing a button in the navigation bar, in order to test if the translation works and is indeed working well:

 <button type="button" class="btn-shadow p-1 btn btn-primary btn-sm">
  {% include 'change_language.html' %}
  <i class="fa text-white fa-calendar pr-1 pl-1"></i>
</button>
 

change_language.html

  {% load i18n %}
    <form action="/i18n/setlang/" method="post" style="display: inline;">
    {% csrf_token %}
      <div style="display: inline;">
        <select name="language" onchange="javascript:form.submit()">
          {% for lang in LANGUAGES %}
            <option value="{{ lang.0 }}"{% ifequal LANGUAGE_CODE lang.0 %} selected="selected"{% endifequal %}>{{ lang.1 }}</option>
          {% endfor %}
        </select>
      </div>
    </form>
 

Поэтому я не знаю, верен ли код, который я помещаю в form_valid (), и следует ли его туда вводить.