Как установить атрибут 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