我有一个多语言应用程序(Django 1.11),具有用于创建新用户的表单。以这种形式,用户发送无效输入时的错误消息必须根据所选语言以葡萄牙语(pt-BR)或英语(en-US)发出。定制验证和用于验证的一些自动Django消息翻译得很好,但是没有以下内容:“密码与用户名太相似”。 “此密码太短。它必须包含至少8个字符。”和“此密码太常见了”。实际上,它们是用葡萄牙语显示的,因为settings.py中的LANGUAGE_CODE是'pt-BR'。
我能够翻译一些自动消息,例如“具有该用户名的用户已存在”。使用django.utils.translation.activate,如以下代码所示。
from django.utils.translation import activate
activate(curr_lang)
但这还不足以转换来自settings.AUTH_PASSWORD_VALIDATORS的验证。我手动将LANGUAGE_CODE从“ pt-BR”更改为“ en-US”,并且只能看到英语消息。翻译这些消息的最佳策略是什么?据我研究,设置LANGUAGE_CODE是不可行的,因为我发现结果建议使用django.utils.translation.activate。预先感谢
答案 0 :(得分:0)
经过几次尝试,我认为解决方法是:
MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
...
LANGUAGE_CODE = 'pt-BR'
LANGUAGES = [
('pt-BR', 'Portuguese'),
('en-US', 'English'),
]
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>
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
....
我认为这些步骤无需使用custom validators就可以完成来自Django的默认表单验证消息的翻译。