Как установить атрибут html lang в шаблоне Django?

Я написал приложение Django, которое обслуживает переведенный контент для немецких пользователей, и английский контент для всех остальных. В настоящее время я использую базовый шаблон, содержащий:

<!DOCTYPE html>
<html lang="en">

Очевидно, что это устанавливает неправильное lang в случае, если содержимое подается на немецком языке.

Возможно, я мог бы попробовать что-то вроде

<html lang="{{ 'de' if request.LANGUAGE_CODE == 'de' else 'en' }}">

но это кажется неуклюжим и сложным для поддержки в случае добавления новых языков.

Каким простым способом можно установить <html lang> на фактический обслуживаемый язык?

Вы можете попробовать следующее

<html lang="{{ request.LANGUAGE_CODE|default:'en' %}">

это добавит request.LANGUAGE_CODE если он доступен или установит значение по умолчанию en

Я понял это.

Тег get_current_language содержит предпочитаемый язык пользователя.

{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
<html lang="{{ LANGUAGE_CODE }}">

Для меня в документации не было сразу понятно, что "предпочтительный язык" - это не самый верхний язык из HTTP-заголовка "Accept-Language", а всегда язык из setting.LANGUAGES, который лучше всего соответствует предпочтениям пользователя.

В моем случае settings.py содержит:

LANGUAGE_CODE = "en-us"
LANGUAGES = [("de", _("German")), ("en", _("English"))]
Если пользователь предпочитает итальянский язык,

то get_current_language все равно будет en. Если приложение Django запущено локально на порту 8000, вы можете попробовать сделать это, например, так:

curl -H 'Accept-Language: it' http://127.0.0.1:8000/ | cut -b 1-50

На выходе получается что-то вроде:

<!doctypehtml><html lang="en">...

Если в запросе не указан предпочитаемый язык, результат будет таким же. Поэтому нет необходимости в |default:'en'. Вы можете проверить это с помощью:

curl http://127.0.0.1:8000/ | cut -b 1-50
Вернуться на верх