Как установить язык по умолчанию - ошибка при его изменении - Django

Я довольно долго мучился с переводом в django. Я хочу установить язык по умолчанию, который устанавливается каждый раз, когда пользователь заходит на сайт (в новой сессии). Я изучил документацию django и нашел следующий алгоритм:

First, it looks for the language prefix in the requested URL. This is only performed when you are using the i18n_patterns function in your root URLconf. See Internationalization: in URL patterns for more information about the language prefix and how to internationalize URL patterns.

Failing that, it looks for a cookie.

The name of the cookie used is set by the LANGUAGE_COOKIE_NAME setting. (The default name is django_language.)

Failing that, it looks at the Accept-Language HTTP header. This header is sent by your browser and tells the server which language(s) you prefer, in order by priority. Django tries each language in the header until it finds one with available translations.

Failing that, it uses the global LANGUAGE_CODE setting.

Я пытаюсь установить префикс языка в запрашиваемом URL. Я настроил свое приложение следующим образом:

settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'crm.middleware.RequestMiddleware',
]
....

EXTRA_LANG_INFO = {
    'md': {
        'bidi': False,
        'code': 'md',
        'name': 'Romanian',
        'name_local': _('Romanian'),
    },
}
LANGUAGE_CODE = 'md'
LANGUAGES = (
    ('md', _('Romanian')),
    ('en', _('English'))
)

import django.conf.locale
LANG_INFO = {**django.conf.locale.LANG_INFO, **EXTRA_LANG_INFO}
django.conf.locale.LANG_INFO = LANG_INFO

USE_I18N = True
USE_L10N = True
urls.py

from django.conf.urls.i18n import i18n_patterns
urlpatterns = [
                  path('i18n/', include('django.conf.urls.i18n')),
              ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += i18n_patterns(
    path('sentry-debug/', trigger_error),
    path('health/', health, name='health'),
    path('admin/', admin.site.urls),
    path('properties/', include('properties.urls')),
    path('', include(('ui.urls', 'ui'), namespace='ui')),
    path('api/', include(api_urls)),
)

template

<div class="float-left ml-2" id="language-div">
    <form action="{% url 'set_language' %}" method="post">{% csrf_token %}
        <input name="next" type="hidden" value="{{ redirect_to }}">
        <select name="language">
            {% get_current_language as LANGUAGE_CODE %}
            {% get_available_languages as LANGUAGES %}
            {% get_language_info_list for LANGUAGES as languages %}
            {% for language in languages %}
                <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected{% endif %}>
                    {{ language.name_local }} ({{ language.code }})
                </option>
            {% endfor %}
        </select>
        <input type="submit" value="{% trans 'Change' %}">
    </form>
</div>

Проблема заключается в следующем: -> Мой URL выглядит следующим образом: localhost:8000/md/..... Если в браузере не установлен язык, который используется при переводе (использую Chrome), я получаю перевод по умолчанию каждый раз, указанный LANGUAGE_CODE="md". Но как только я устанавливаю язык предпочтений в браузере на английский, алгоритм перескакивает с шага 1 на шаг 3 и выдает мне en в качестве языка по умолчанию. (URL: localhost:8000/en/...)

Все, что я хочу, это чтобы каждый раз, когда пользователь заходит на сайт, язык по умолчанию был MD, и менять его только по желанию пользователя.

ПРИМЕЧАНИЕ: set_language не перезаписывается. он использует значение по умолчанию.

Спасибо за ваше время!

Приветствую, geekt

Вернуться на верх