Wie kann ich die aktuelle Sprache in Django erhalten?

92

Wie kann ich die aktuelle Sprache im aktuellen Thread in einem Modell oder im Administrator abrufen?

diegueus9
quelle
5
Bitte erläutern. "Die Sprache meines Webs" - meinen Sie die Webanforderung, den Webserver oder was?
Mikemaccana

Antworten:

137

Von besonderem Interesse sind Funktionen, django.utils.translation.get_language()die die im aktuellen Thread verwendete Sprache zurückgeben. Siehe Dokumentation .

micha480
quelle
2
Vorsichtsmaßnahme: Gibt None zurück, wenn Übersetzungen vorübergehend deaktiviert sind (durch deactivate_all () oder wenn None an override () übergeben wird). Vor Django 1.8 gab get_language () immer LANGUAGE_CODE zurück, wenn Übersetzungen deaktiviert wurden.
Pieter
88

Oder Sie können dies auch in Ihren Ansichten erhalten

request.LANGUAGE_CODE
Ignas Butėnas
quelle
6
Ich habe dafür gestimmt (von -1 aus irgendeinem Grund). Beachten Sie Folgendes (von docs.djangoproject.com/de/dev/topics/i18n/deployment/… ): Bei statischer Übersetzung (ohne Middleware) befindet sich die Sprache in settings.LANGUAGE_CODE, bei dynamischer Übersetzung (Middleware) request.LANGUAGE_CODE. "
Alexander Marquardt
4
Dieser Link ist tot, und ich sehe keinen Grund, die oben dokumentierte akzeptierte Lösung nicht zu verwenden:django.utils.translation.get_language()
qris
4
Der Versuch, die Sprache in zB Modellen zu erhalten, wäre nicht möglich, wenn noch keine Anfrage vorliegt. Ich denke das django.utils.translation.get_language()ist immer eine bessere Lösung.
Hussam
Was ist mit der aktuellen Sprache in einer Vorlage?
Azmeuk
2
@azmeuk dies könnte für Sie nützlich sein docs.djangoproject.com/de/dev/topics/i18n/translation/…
Ignas Butėnas
37

Achten Sie auf die Methode, mit der Sie die Sprache erhalten . Abhängig von der Methode verwendet Django verschiedene Methoden und Informationen, um die richtige Sprache zu bestimmen .

Wenn Sie die django.utils.translation.get_language()Funktion verwenden, ist sie mit der Thread- Sprache verknüpft . Vor Django 1.8 wurde es immer zurückgegeben, settings.LANGUAGE_CODEwenn Übersetzungen deaktiviert waren. Wenn Sie die Thread-Sprache manuell überschreiben möchten, können Sie die Funktionen override()oder activate()verwenden, die nicht sehr explizit benannt, aber dennoch nützlich sind:

from django.utils import translation

with translation.override('fr'):
    print(_("Hello")) # <= will be translated inside the with block

translation.activate('fr') # <= will change the language for the whole thread.
# You then have to manually "restore" the language with another activate()
translation.activate('en') # <= change languages manually

Wenn Sie möchten, dass Django den Pfad und / oder die Anforderung überprüft (Sprachcookie, ...) , was viel häufiger vorkommt, z . B. www.example.com/en/<somepath>vs www.example.com/fr/<somepath>, verwenden Sie django.utils.translation.get_language_from_request(request, check_path=False). Außerdem wird immer eine gültige Sprache zurückgegebensettings.LANGUAGES

Ich fand es nicht sehr einfach, diese Unterschiede über Google zu diesem Thema zu finden, daher dient sie hier als weitere Referenz.

Achedeuzot
quelle
Beachten Sie django.utils.translation, dass dies keine Übersetzungen sind. Der bereitgestellte Link enthält einen Rechtschreibfehler. Im Snippet ist es richtig.
J0ANMM
4
+1 für die Differenz zwischen django.utils.translation.get_language()und django.utils.translation.get_language_from_request(request, check_path). Wenn Sie dies sehen, sollten Sie Letzteres verwenden check_path = True, um die Sprache zu erhalten, in der Ihre Vorlage gerendert wird.
Ondrej Skalicka
7

Um dies hinzuzufügen, django.utils.translation.get_language()sollten Sie berücksichtigen, dass dieser Ansatz nicht funktioniert, wenn dieser Codeabschnitt asynchron aufgerufen wird (z. B. als Sellerie-Aufgabe), da er in einem anderen Thread ausgeführt wird.

Stefan Magnuson
quelle
2
Der naheliegende Ansatz hier wäre, die Sprache als Aufgabenparameter zu übergeben und dann die Sprache mit translation.activate (language)
xyzman am
1

Sie können dies verwenden

from django.utils import  translation
translation.get_language()
Sarath Ak
quelle
Bereits beantwortet von micha480. Ihre Antwort bringt keinen Mehrwert.
Samuel Dauzon
0

Sie können die Systeminformationen lesen locale.

advait
quelle
5
Sie sind auf -3 moderiert, aber ich denke, die Frage ist vage - "die aktuelle Sprache meines Webs". Nicht deine Schuld, dass du das erraten hast, bedeutet Betriebssystem.
Mikemaccana