Локализация формата

Обзор

Система форматирования Django способна отображать даты, время и числа в шаблонах, используя формат, заданный для текущего locale. Она также обрабатывает локализованный ввод в формах.

Когда эта функция включена, два пользователя, получающие доступ к одному и тому же содержимому, могут видеть даты, время и числа, отформатированные по-разному, в зависимости от форматов их текущей локали.

По умолчанию система форматирования отключена. Чтобы включить ее, необходимо установить 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, использует общие разделители, запятую для десятичного разделителя и пробел для разделителя тысяч.

Вернуться на верх