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


95

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


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

Ответы:


141

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


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


0

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


5
Вы модерированы до -3, но я думаю, что вопрос расплывчатый - «текущий язык моей сети». Не ваша вина, что это означает ОС.
mikemaccana
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.