wake-up-neo.com

Djangos get_current_language liefert immer "en"

In meiner Django 2.0-Website möchte ich die Variable lang des HTML-Tags auf die Sprache des aktuellen Gebietsschemas setzen. In meinem base.html, den andere Vorlagen erweitern, verwende ich get_current_language auf folgende Weise

{% load i18n %}

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

Die Website bietet Übersetzungen für mehrere Sprachen. Wenn ich die Sprache im Browser umschalte, werden die korrekten Übersetzungen angezeigt, das lang-Attribut enthält jedoch immer en.

In meinem settings.py habe ich 

USE_I18N = True
LANGUAGE_CODE = 'en-us'

und basierend auf dem Vorschlag von Goran der folgenden Middleware-Bestellung

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',
]

Die Einstellung LANGUAGES ist nicht festgelegt.

Wie von Kostadin Slavov vorgeschlagen, habe ich versucht, die Sprache aus der Ansicht heraus zu drucken. Es scheint, dass get_current_language Django.utils.translation.get_language aufruft, also habe ich Folgendes in meine Ansicht eingefügt

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

Es gibt den richtigen Wert aus (z. B. de beim Zugriff auf die Ansicht mit einem Browser, der auf Deutsch eingestellt ist).

Was fehlt mir noch?

12
Stefan Kögl

Ich habe versucht, Ihre Umgebung mit diesen Schritten zu simulieren:

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

Dann habe ich den Generierungscode wie in Ihrem Beispiel aktualisiert:

  • 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>
    

Mit dem von Django generierten Code und meinen wenigen oben genannten Updates kann ich einen anderen Sprachcode sehen, wenn ich die Sprache meines Browsers auf http: // localhost: 8000/ wechsle, nachdem ich ihn gestartet habe:

$ python manage.py runserver

Probieren Sie meine Schritte in Ihrer lokalen Umgebung aus und prüfen Sie, ob dies funktioniert. Vergleichen Sie dann Ihr Projekt mit dem obigen Code.

Aktualisieren

Verwenden Sie diffsettings , um "Unterschiede zwischen der aktuellen Einstellungsdatei und den Standardeinstellungen von Django" anzuzeigen.

2