Локализация форматов
Обзор
Система форматирования Django позволяет отображать даты, время и числа в шаблонах, используя формат, указанный для текущего региона. Она также обрабатывает локализованный ввод в формах.
При включении, два пользователя, получающие доступ к одному и тому же контенту, могут увидеть даты, время и числа, отформатированные по-разному, в зависимости от форматов их текущего региона.
Система форматирования по умолчанию отключена. Для её включения необходимо установить 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.
Возвращает строковое представление для чисел без локализации (int, float, или Decimal).
Создание пользовательских файлов форматов
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/4.0/topics/i18n/formatting/