Как перевести проверки из AUTH_PASSWORD_VALIDATORS в UserCreationForm - PullRequest
0 голосов
/ 25 марта 2019

У меня есть многоязычное приложение (Django 1.11) с формой для создания новых пользователей. В этой форме сообщения об ошибках, когда пользователь отправляет неверные данные, должны быть на португальском (pt-BR) или английском (en-US) языке в зависимости от выбранного языка. Пользовательские проверки и некоторые из автоматических сообщений Django для проверок хорошо переведены, но не следующие: «Пароль слишком похож на имя пользователя»; «Этот пароль слишком короткий. Он должен содержать не менее 8 символов». и «Этот пароль слишком распространен». На самом деле они отображаются на португальском языке, поскольку LANGUAGE_CODE из settings.py имеет значение «pt-BR».

Мне удалось перевести некоторые автоматические сообщения, такие как «Пользователь с таким именем уже существует». с django.utils.translation.activate, как показано в следующем коде.

from django.utils.translation import activate
activate(curr_lang)

Но этого было недостаточно, чтобы перевести проверки из настроек. AUTH_PASSWORD_VALIDATORS. Я вручную изменил LANGUAGE_CODE с «pt-BR» на «en-US» и смог видеть сообщения только на английском языке. Какова лучшая стратегия для перевода этих сообщений? Насколько я исследовал, настройка LANGUAGE_CODE не является опцией, так как результаты, которые я нахожу, показывают использование django.utils.translation.activate. Заранее спасибо

1 Ответ

0 голосов
/ 01 апреля 2019

После нескольких попыток я думаю, что решение было:

  1. Добавьте «django.middleware.locale.LocaleMiddleware» в MIDDLEWARE на settings.py (будьте осторожны с порядком, как объяснено в документации )
MIDDLEWARE = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
...
  1. Добавьте const LANGUAGES также в settings.py после LANGUAGE_CODE, который должен содержать язык по умолчанию
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 без необходимости пользовательских валидаторов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...