经过多次尝试,我认为解决方案是:
- 在 settings.py 中将“django.middleware.locale.LocaleMiddleware”添加到 MIDDLEWARE(注意at the documentation 解释的顺序)
MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
...
- 还要在 settings.py 中 LANGUAGE_CODE 之后添加 LANGUAGES 常量,它必须包含默认语言
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 的默认表单验证消息的翻译,而不需要 custom validators。