Формат локализации¶
Обзор¶
Система форматирования Django имеет возможность отображать в шаблонах даты, время и числа, используя формат, определённый для текущей локали. Она также поддерживает локализованный ввод в формы.
Два пользователя, обращающиеся к одному и тому же контенту, могут видеть даты, время и числа, отформатированные по-разному, в зависимости от форматов их текущего языкового стандарта.
Примечание
Чтобы включить форматирование чисел с помощью разделителей тысяч, необходимо в файле настроек установить USE_THUSAND_SEPARATOR = True. Альтернативно вы можете использовать intcomma для форматирования чисел в вашем шаблоне.
Локализованный ввод в формах¶
При активированной системе форматирования 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)
Управление локализацией в шаблонах¶
Django пытается использовать формат, специфичный для локали, всякий раз, когда выводит значение в шаблоне.
Тем не менее, использование локализованных значений подходит не во всех случаях. Например, при выводе JavaScript или XML, которые не предназначены для чтения людьми, вам всегда будут нужны не локализированные значения. Также может потребоваться использовать локализацию только в нужных шаблонах, а не во всех.
Для решения задачи по контролю над использованием локализации, Django предоставляет шаблонную библиотеку l10n, которая содержит следующие теги и фильтры.
Шаблонные фильтры¶
localize¶
Включает локализацию для одного значения.
Например:
{% load l10n %}
{{ value|localize }}
Используйте шаблонный фильтр unlocalize, чтобы отключить локализацию одного значения. Используйте шаблонный тег localize, чтобы управлять локализацией большой части шаблона.
unlocalize¶
Обеспечивает вывод одного значения в нелокализированном виде.
Например:
{% load l10n %}
{{ value|unlocalize }}
Используйте шаблонный фильтр localize, чтобы включить локализацию одного значения. Используйте шаблонный тег localize, чтобы управлять локализацией большой части шаблона.
Возвращает строковое представление чисел (int, float или Decimal) с примененными форматами настроек локализации <settings-l10n>.
Создание собственных форматов¶
Django предоставляет определения форматов для многих локалей, но иногда вам может потребоваться создать свои собственные, поскольку для вашей локали не существует файла формата или вы хотите перезаписать некоторые значения.
Чтобы использовать пользовательские форматы, сначала укажите путь, по которому вы будете размещать файлы форматирования. Для этого установите параметр FORMAT_MODULE_PATH для пакета, в котором будут существовать файлы форматирования, например:
FORMAT_MODULE_PATH = [
"mysite.formats",
"some_app.formats",
]
Файлы помещаются не в каталог, а в подкаталог с названием locale, и должны называться 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.
Швейцария (немецкий, французский)¶
Формат чисел в Швейцарии традиционно варьируется в зависимости от контекста. Например, в денежных значениях в качестве десятичного разделителя может использоваться точка («23,50 франков»), а в измерениях часто используется запятая («22,5 м»). Система локализации Django не поддерживает автоматически такие контекстно-зависимые варианты.
Формат локали, предоставляемый Django, использует общие разделители: запятую для десятичных чисел и пробел для разделителей тысяч.