Локализация формата
Обзор
Система форматирования 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.0/topics/i18n/formatting/