【问题标题】:How to translate validations from AUTH_PASSWORD_VALIDATORS in UserCreationForm如何在 UserCreationForm 中翻译来自 AUTH_PASSWORD_VALIDATORS 的验证
【发布时间】:2019-03-25 20:33:34
【问题描述】:

我有一个多语言应用程序 (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。提前致谢

【问题讨论】:

    标签: django python-2.7


    【解决方案1】:

    经过多次尝试,我认为解决方案是:

    1. 在 settings.py 中将“django.middleware.locale.LocaleMiddleware”添加到 MIDDLEWARE(注意at the documentation 解释的顺序)
    MIDDLEWARE = (
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.locale.LocaleMiddleware',
        'django.middleware.common.CommonMiddleware',
    ...
    
    1. 还要在 settings.py 中 LANGUAGE_CODE 之后添加 LANGUAGES 常量,它必须包含默认语言
    LANGUAGE_CODE = 'pt-BR'
    LANGUAGES = [
      ('pt-BR', 'Portuguese'),
      ('en-US', 'English'),
    ]
    
    1. 使用 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>
    
    1. 在 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

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多