#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 (), и следует ли его туда вводить.