web-dev-qa-db-fra.com

La langue get_current_langu de Django retourne toujours "en"

Sur mon site Django 2.0, je souhaite définir l'attribut lang de la balise html sur la langue de l'environnement local actuel. Dans mon base.html quels autres modèles s'étendent, j'utilise get_current_language de la manière suivante

{% load i18n %}

{% get_current_language as LANGUAGE_CODE %}
<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE }}">
 ...
</html>

Le site a des traductions pour plusieurs langues. Si je change de langue dans le navigateur, les traductions correctes sont affichées, mais l'attribut lang contient toujours en.

Dans mon settings.py j'ai 

USE_I18N = True
LANGUAGE_CODE = 'en-us'

et sur la suggestion de Goran l'ordre suivant du middleware

MIDDLEWARE = [
    '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',
]

Le paramètre LANGUAGES est non défini.

Comme suggéré par Kostadin Slavov J'ai essayé d'imprimer le langage à partir de la vue. Il semble que get_current_language appelle Django.utils.translation.get_language. C’est pourquoi j’ai inséré ce qui suit à mon avis

from Django.utils import translation                                        
print(translation.get_language())                                           

Il imprime la valeur correcte (par exemple, de lors de l'accès à la vue avec un navigateur défini en allemand).

Que manque-t-il d'autre?

12
Stefan Kögl

J'ai essayé de simuler votre environnement en procédant comme suit:

$ cd ~
$ python3 -m venv ~/venvs/mysite
$ source ~/venvs/mysite/bin/activate
$ pip install Django==2.0.8
$ Django-admin startproject mysite

Puis j'ai mis à jour le code généré comme dans votre exemple:

  • mysite/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',
    ]
    ...
    TEMPLATES = [
        {
            'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
            'DIRS': ['templates'],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'Django.template.context_processors.debug',
                    'Django.template.context_processors.request',
                    'Django.contrib.auth.context_processors.auth',
                    'Django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    ...
    
  • mysite/urls.py

    from Django.contrib import admin
    from Django.urls import path
    from Django.views.generic.base import TemplateView
    
    urlpatterns = [
        path('', TemplateView.as_view(template_name='base.html'), name='home'),
        path('admin/', admin.site.urls),
    ]
    
  • templates/base.html

    {% load i18n %}
    {% get_current_language as LANGUAGE_CODE %}
    <!DOCTYPE html>
    <html lang="{{ LANGUAGE_CODE }}">
    <body>
    <pre>LANGUAGE_CODE = {{ LANGUAGE_CODE }}</pre>
    <body>
    </html>
    

Avec le code généré par Django et les quelques mises à jour ci-dessus, je peux voir un code de langue différent si je change la langue de mon navigateur en visitant http: // localhost: 8000/ après l'avoir lancé avec:

$ python manage.py runserver

Essayez mes étapes sur votre environnement local et vérifiez si cela fonctionne, puis comparez votre projet au code ci-dessus.

Mettre à jour

Essayez d’utiliser diffsettings pour voir "les différences entre le fichier de paramètres actuel et les paramètres par défaut de Django".

2
Paolo Melchiorre