Як я можу отримати поточну мову в Django?


93

Як я можу отримати поточну мову в поточному потоці в моделі чи в адмініструванні?


5
Будь ласка, будьте конкретні. "Мова мого Інтернету" - ви маєте на увазі веб-запит, веб-сервер чи що?
mikemaccana

Відповіді:


139

Особливо цікавими функціями є django.utils.translation.get_language()повернення мови, що використовується в поточному потоці. Див. Документацію .


2
Застереження: Повертає None, якщо переклади тимчасово деактивовані (за допомогою disabletivate_all () або коли None передано для заміни ()). До Django 1.8, get_language () завжди повертав LANGUAGE_CODE, коли переклади були деактивовані.
Пітер

89

Або ви також можете отримати це у своїх поглядах

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,

4
спроби отримати мову, наприклад, у моделях, були б неможливі, якщо ще немає запиту. Я думаю, що django.utils.translation.get_language()це завжди краще рішення.
Hussam

А як отримати поточну мову в шаблоні?
Azmeuk

2
@azmeuk це може бути корисним для вас docs.djangoproject.com/en/dev/topics/i18n/translation/…
Ігнас Бутенас

37

Будьте обережні щодо методу, який ви використовуєте для отримання мови . Залежно від того, який метод, 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щоб отримати мову, на якій буде відображено ваш шаблон.
Ondrej Skalicka

7

Просто додамо, що якщо ви все-таки використовуєте, django.utils.translation.get_language()то слід пам’ятати, що якщо цей розділ коду буде викликаний асинхронно (наприклад, як завдання селери), то цей підхід не буде працювати, оскільки він працює в іншому потоці.


2
Очевидним підходом тут було б передавати мову як параметр завдання, а потім встановлювати мову з перекладом.
Activate


0

Ви можете прочитати систему localeдля отримання інформації про мову.


5
Ви модеруєте до -3, але я думаю, що питання неясне - "поточна мова мого Інтернету". Не ваша провина вгадувати це означає ОС.
mikemaccana
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.