Как я могу получить текущий язык в Django?

95

Как я могу получить текущий язык в текущем потоке в модели или в админке?

Diegueus9
источник
5
Пожалуйста, будьте конкретны. «Язык моей сети» - вы имеете в виду веб-запрос, веб-сервер или что-то еще?
mikemaccana

Ответы:

141

Особый интерес представляют функции, django.utils.translation.get_language()возвращающие язык, используемый в текущем потоке. См. Документацию .

micha480
источник
2
Предостережение: возвращает None, если переводы временно деактивированы (с помощью deactivate_all () или когда None передается в override ()). До Django 1.8 get_language () всегда возвращал LANGUAGE_CODE, когда переводы были деактивированы.
Питер
91

Или вы также можете получить это в своих представлениях

request.LANGUAGE_CODE
Игнас Бутенас
источник
6
Я проголосовал за это (почему-то с -1). Обратите внимание на следующее (из docs.djangoproject.com/en/dev/topics/i18n/deployment/… "при статическом (без промежуточного программного обеспечения) переводе язык находится в настройках. LANGUAGE_CODE , а при динамическом (промежуточном) переводе он находится в request.LANGUAGE_CODE. "
Александр Марквардт
4
Эта ссылка мертва, и я не вижу причин не использовать задокументированное принятое решение выше:django.utils.translation.get_language()
qris 02
4
попытка получить язык, например, в моделях будет невозможна, если еще нет запроса. Я думаю, что django.utils.translation.get_language()это всегда лучшее решение.
Hussam
Как насчет того, чтобы получить текущий язык в шаблоне?
azmeuk
2
@azmeuk, это может быть вам полезно docs.djangoproject.com/en/dev/topics/i18n/translation/…
Игнас Бутенас,
38

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

При использовании django.utils.translation.get_language()функции она связана с языком потока . До Django 1.8 он всегда возвращался, settings.LANGUAGE_CODEкогда перевод был отключен. Если вы хотите вручную переопределить язык потока, вы можете использовать функции override()или activate(), которые не очень явно названы, но все же полезны:

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

Если вы хотите, чтобы django проверял путь и / или запрос (языковой файл cookie, ...) , что гораздо чаще встречается, например www.example.com/en/<somepath>vs www.example.com/fr/<somepath>, используйте django.utils.translation.get_language_from_request(request, check_path=False). Кроме того, он всегда будет возвращать допустимый язык, установленный вsettings.LANGUAGES

Мне было не очень легко найти эти различия в Google по этому вопросу, поэтому здесь для дальнейшего использования.

ахедеузот
источник
Обратите внимание, что это django.utils.translationне переводы. В предоставленной ссылке есть орфографическая ошибка. В сниппете это правильно.
J0ANMM
4
+1 за разницу между django.utils.translation.get_language()и django.utils.translation.get_language_from_request(request, check_path). Если имеется ввиду, вы должны использовать последнее, check_path = Trueчтобы получить язык, на котором будет отображаться ваш шаблон.
Ондрей
7

Просто добавлю, что если вы все-таки используете, django.utils.translation.get_language()вы должны иметь в виду, что если этот раздел кода будет вызываться асинхронно (например, как задача сельдерея), то этот подход не будет работать, потому что он работает в другом потоке.

Стефан Магнусон
источник
2
Очевидным подходом здесь было бы передать язык в качестве параметра задачи, а затем установить язык с помощью translation.activate (language)
xyzman 02
1

вы можете использовать это

from django.utils import  translation
translation.get_language()
Сарат Ак
источник
Уже ответил micha480. Ваш ответ не добавляет никакой ценности.
Сэмюэл Дозон
0

Информацию о языке вы можете прочитать в системе locale.

адвайт
источник
5
Вы модерированы до -3, но я думаю, что вопрос расплывчатый - «текущий язык моей сети». Не ваша вина, что это означает ОС.
mikemaccana