Локализация форматов
Обзор
Система форматирования Django способна отображать даты, время и числа в шаблонах с использованием формата, указанного для текущего локали. Она также обрабатывает локализованный ввод в формах.
При включенной локализации два пользователя, получающие доступ к одному и тому же контенту, могут видеть даты, время и числа, отформатированные по-разному, в зависимости от форматов их текущей локали.
Система форматирования по умолчанию отключена. Для ее включения необходимо установить USE_L10N = True в файле настроек.
Примечание
Файл по умолчанию settings.py , созданный django-admin
startproject включает USE_L10N = True для удобства. Обратите внимание, что для включения форматирования чисел с разделителями тысяч необходимо установить USE_THOUSAND_SEPARATOR
= True в файле настроек. В качестве альтернативы можно использовать intcomma для форматирования чисел в шаблоне.
Примечание
Существует также независимая, но связанная настройка USE_I18N, которая управляет тем, активирует ли Django перевод. Подробнее см. Перевод.
Локализованный ввод в формах
При включенном форматировании Django может использовать локализованные форматы при парсинге дат, времени и чисел в формах. Это означает, что при угадывании формата, используемого пользователем при вводе данных в формы, применяются различные форматы для различных локалей.
Примечание
Django использует разные форматы для отображения данных и для их парсинга. В частности, при парсинге дат не могут использоваться %a (сокращенное название дня недели), %A (полное название дня недели), %b (сокращенное название месяца), %B (полное название месяца) или %p (AM/PM).
Чтобы включить локализованный ввод и вывод в поле формы, просто используйте его аргумент localize:
class CashRegisterForm(forms.Form): product = forms.CharField() revenue = forms.DecimalField(max_digits=4, decimal_places=2, localize=True)
Управление локализацией в шаблонах
При включенном форматировании с помощью USE_L10N, Django будет пытаться использовать локально-специфичный формат всякий раз, когда он выводит значение в шаблоне.
Однако не всегда уместно использовать локализованные значения — например, если вы выводите JavaScript или XML, предназначенные для машинного чтения, вам всегда нужны нелокализованные значения. Также возможно использовать локализацию только в выбранных шаблонах, а не везде.
Для точного управления использованием локализации Django предоставляет библиотеку шаблонов l10n, содержащую следующие теги и фильтры.
Теги шаблонов
localize
Этот тег позволяет более тонко управлять локализацией, чем USE_L10N.
Для активации или деактивации локализации для блока шаблона используйте:
{% load l10n %}
{% localize on %}
{{ value }}
{% endlocalize %}
{% localize off %}
{{ value }}
{% endlocalize %}
Примечание
Значение USE_L10N не учитывается внутри блока {% localize %}.
См. localize и unlocalize для фильтров шаблонов, которые выполнят ту же работу на основе каждой переменной.
Фильтры шаблонов
localize
Принудительно локализует одно значение.
Например:
{% load l10n %}
{{ value|localize }}
Для отключения локализации одного значения используйте unlocalize. Для управления локализацией большой части шаблона используйте тег шаблона localize.
unlocalize
Принудительно выводит одно значение без локализации.
Например:
{% load l10n %}
{{ value|unlocalize }}
Для принудительной локализации одного значения используйте localize. Для управления локализацией большой части шаблона используйте тег шаблона localize.
Создание пользовательских файлов форматов
Django предоставляет определения форматов для многих локалей, но иногда вам может потребоваться создать свои собственные, потому что для вашей локали нет файлов форматов или потому что вы хотите переопределить некоторые значения.
Для использования пользовательских форматов сначала укажите путь, где будут располагаться файлы форматов. Для этого просто установите настройку FORMAT_MODULE_PATH в пакет, где будут храниться файлы форматов, например:
FORMAT_MODULE_PATH = [
'mysite.formats',
'some_app.formats',
]
Файлы располагаются не непосредственно в этом каталоге, а в каталоге с именем локали и должны именоваться formats.py. Будьте осторожны, не помещайте конфиденциальную информацию в эти файлы, так как значения внутри могут быть раскрыты, если вы передадите строку в django.utils.formats.get_format() (используется фильтром шаблона date).
Для настройки английских форматов потребуется структура подобная этой:
mysite/
formats/
__init__.py
en/
__init__.py
formats.py
где formats.py содержит пользовательские определения форматов. Например:
THOUSAND_SEPARATOR = '\xa0'
чтобы использовать неразрывный пробел (Unicode 00A0) в качестве разделителя тысяч вместо стандартной запятой для английского языка.
Ограничения предоставленных форматов локалей
Некоторые локали используют контекстно-зависимые форматы для чисел, с которыми система локализации Django не может автоматически работать.
Швейцария (немецкий)
Форматирование чисел в Швейцарии зависит от типа числа, которое форматируется. Для денежных значений используется запятая в качестве разделителя тысяч и точка в качестве разделителя десятичных знаков. Для всех остальных чисел запятая используется в качестве разделителя десятичных знаков, а пробел — в качестве разделителя тысяч. Предоставленный Django формат локали использует общие разделители — запятую для десятичных знаков и пробел для разделителей тысяч.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.2/topics/i18n/formatting/