После нескольких попыток я думаю, что решение было:
- Добавьте «django.middleware.locale.LocaleMiddleware» в MIDDLEWARE на settings.py (будьте осторожны с порядком, как объяснено в документации )
MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
...
- Добавьте const LANGUAGES также в settings.py после LANGUAGE_CODE, который должен содержать язык по умолчанию
LANGUAGE_CODE = 'pt-BR'
LANGUAGES = [
('pt-BR', 'Portuguese'),
('en-US', 'English'),
]
- Использовать Django по умолчанию set_language метод - на urls.py добавить следующую строку:
urlpatterns = [
....
url(r'^i18n/', include('django.conf.urls.i18n')),
И, в html-файле с выбором языка,
{% load i18n %}
{% load staticfiles %}
<form action="{% url 'set_language' %}" method="post">{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language" id="curr_lang" class="select2-single" onchange="this.form.submit()">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
<option value="pt-BR" title="Português" {% if LANGUAGE_CODE == 'pt-br' %}selected{% endif %}>{% static 'img/flags/br.png' %}</option>
<option value="en-US" title="English" {% if LANGUAGE_CODE == 'en-us' %}selected{% endif %}>{% static 'img/flags/us.png' %}</option>
</select>
</form>
- В context_processor.py определите функцию (я называю global_env), которая будет запускаться в конце каждого представления. В settings.py добавьте 'your-application-name-here.context_processor.global_env', например
TEMPLATES = [
...
'OPTIONS': {
'context_processors': [
'your-application-name-here.context_processor.global_env',
...
И, в context_processor.py, функция должна иметь
def global_env(request):
from django.utils.translation import activate
curr_lang = request.session[LANGUAGE_SESSION_KEY]
activate(curr_lang)
# More code to render dictionary to views for non-default messages on page
....
Я думаю, что эти шаги завершают перевод сообщений проверки формы по умолчанию от Django без необходимости пользовательских валидаторов .