Jak mogę uzyskać aktualny język w Django?

95

Jak mogę uzyskać aktualny język w bieżącym wątku w modelu lub w panelu administracyjnym?

diegueus9
źródło
5
Proszę, bądź konkretny. „Język mojej sieci” - masz na myśli żądanie sieciowe, serwer WWW, czy co?
mikemaccana

Odpowiedzi:

140

Szczególnie interesujące są funkcje, django.utils.translation.get_language()które zwracają język używany w bieżącym wątku. Zobacz dokumentację .

micha480
źródło
2
Zastrzeżenie: zwraca wartość None, jeśli tłumaczenia są tymczasowo dezaktywowane (przez dezaktywację_all () lub gdy wartość None jest przekazywana do override ()). Przed Django 1.8, get_language () zawsze zwracało LANGUAGE_CODE, gdy tłumaczenia były dezaktywowane.
Pieter,
89

Lub możesz to również uzyskać w swoich poglądach

request.LANGUAGE_CODE
Ignas Butėnas
źródło
6
Głosowałem za tym (z jakiegoś powodu od -1). Zwróć uwagę na następujące kwestie (z docs.djangoproject.com/en/dev/topics/i18n/deployment/ ... ”z tłumaczeniem statycznym (bez oprogramowania pośredniego), język jest w ustawieniach.LANGUAGE_CODE, podczas gdy z tłumaczeniem dynamicznym (oprogramowanie pośrednie) jest w request.LANGUAGE_CODE. ”
Alexander Marquardt
4
Ten link jest martwy i nie widzę powodu, by nie używać udokumentowanego, zaakceptowanego rozwiązania powyżej:django.utils.translation.get_language()
qris
4
próba uzyskania języka np. w modelach nie byłaby możliwa, gdyby nie było jeszcze prośby. Myślę, że django.utils.translation.get_language()to zawsze lepsze rozwiązanie.
Hussam
Co powiesz na pobranie aktualnego języka w szablonie?
azmeuk
2
@azmeuk to może być przydatne dla ciebie docs.djangoproject.com/en/dev/topics/i18n/translation/…
Ignas Butėnas
38

Uważaj na metodę, której używasz, aby poznać język . W zależności od metody, Django użyje różnych sposobów i informacji do określenia właściwy język.

Podczas korzystania z django.utils.translation.get_language()funkcji jest ona połączona z językiem wątku . Przed Django 1.8 zawsze zwracał się, settings.LANGUAGE_CODEgdy tłumaczenia były wyłączone. Jeśli chcesz ręcznie przesłonić język wątku, możesz użyć funkcji override()lub activate(), które nie są nazwane zbyt wyraźnie, ale nadal są przydatne:

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

Jeśli chcesz, aby django sprawdzało ścieżkę i / lub żądanie (plik cookie języka, ...) , co jest o wiele bardziej powszechne, np. www.example.com/en/<somepath>Vs www.example.com/fr/<somepath>, użyj django.utils.translation.get_language_from_request(request, check_path=False). Ponadto zawsze zwróci prawidłowy język ustawiony wsettings.LANGUAGES

Nie było łatwo znaleźć te różnice w Google na ten temat, więc tutaj jest dla dalszych informacji.

achedeuzot
źródło
Zauważ, że tak jest django.utils.translation, a nie tłumaczenia. Podany link zawiera błąd ortograficzny. We fragmencie jest poprawne.
J0ANMM
4
+1 za różnicę między django.utils.translation.get_language()a django.utils.translation.get_language_from_request(request, check_path). Jeśli masz na myśli, powinieneś użyć tego drugiego z, check_path = Trueaby uzyskać język, w którym twój szablon będzie renderowany.
Ondrej Skalicka
7

Wystarczy dodać, że jeśli używasz, to django.utils.translation.get_language()pamiętaj, że jeśli ta sekcja kodu zostanie wywołana asynchronicznie (np. Jako zadanie selera), to takie podejście nie zadziała, ponieważ działa w innym wątku.

Stefan Magnuson
źródło
2
Oczywistym podejściem byłoby przekazanie języka jako parametru zadania, a następnie ustawienie języka za pomocą funkcji translation.activate (język)
xyzman
1

możesz tego użyć

from django.utils import  translation
translation.get_language()
Sarath Ak
źródło
Już odpowiedział micha480. Twoja odpowiedź nie dodaje żadnej wartości.
Samuel Dauzon
0

Możesz przeczytać localeinformacje o języku w systemie .

advait
źródło
5
Jesteś moderowany do -3, ale myślę, że pytanie jest niejasne - „obecny język mojej sieci”. Nie twoja wina, że ​​zgadłeś, że oznacza to OS.
mikemaccana,