Формат локализации¶
Обзор¶
Система форматирования Django имеет возможность отображать в шаблонах даты, время и числа, используя формат, определённый для текущей локали. Она также поддерживает локализованный ввод в формы.
When it’s enabled, two users accessing the same content may see dates, times and numbers formatted in different ways, depending on the formats for their current locale.
The formatting system is disabled by default. To enable it, it’s
necessary to set USE_L10N = True in your settings file.
Примечание
The default settings.py file created by django-admin
startproject includes USE_L10N = True
for convenience. Note, however, that to enable number formatting with
thousand separators it is necessary to set USE_THOUSAND_SEPARATOR
= True in your settings file. Alternatively, you
could use intcomma to format numbers in your template.
Локализованный ввод в формах¶
При активированной системе форматирования 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)
Управление локализацией в шаблонах¶
When you have enabled formatting with USE_L10N, Django
will try to use a locale specific format whenever it outputs a value
in a template.
Тем не менее, использование локализованных значений подходит не во всех случаях. Например, при выводе JavaScript или XML, которые не предназначены для чтения людьми, вам всегда будут нужны не локализированные значения. Также может потребоваться использовать локализацию только в нужных шаблонах, а не во всех.
Для решения задачи по контролю над использованием локализации, Django предоставляет шаблонную библиотеку l10n, которая содержит следующие теги и фильтры.
Шаблонные фильтры¶
localize¶
Включает локализацию для одного значения.
Например:
{% load l10n %}
{{ value|localize }}
Используйте шаблонный фильтр unlocalize, чтобы отключить локализацию одного значения. Используйте шаблонный тег localize, чтобы управлять локализацией большой части шаблона.
unlocalize¶
Обеспечивает вывод одного значения в нелокализированном виде.
Например:
{% load l10n %}
{{ value|unlocalize }}
Используйте шаблонный фильтр localize, чтобы включить локализацию одного значения. Используйте шаблонный тег localize, чтобы управлять локализацией большой части шаблона.
Returns a string representation for unlocalized numbers (int, float,
or Decimal).
Создание собственных форматов¶
Django provides format definitions for many locales, but sometimes you might want to create your own, because a format files doesn’t exist for your locale, or because you want to overwrite some of the values.
Для использования собственных форматов требуется указать путь до пакета, в котором они определены. Для этого предназначен параметр конфигурации FORMAT_MODULE_PATH, например:
FORMAT_MODULE_PATH = [
'mysite.formats',
'some_app.formats',
]
Файлы помещаются не в каталог, а в подкаталог с названием locale, и должны называться formats.py. Осторожно, не помещайте важные данные в эти файлы т.к. значения могут быть отображены пользователю при передаче в django.utils.formats.get_format() (например шаблонным фильтром date).
To customize the English formats, a structure like this would be needed:
mysite/
formats/
__init__.py
en/
__init__.py
formats.py
где formats.py содержит определения своих форматов. Например:
THOUSAND_SEPARATOR = '\xa0'
для использования неразрывного пробела (Unicode 00A0) в качестве разделителя разрядов, вместо стандартной для англичан точки.
Ограничения предоставленных форматов локализации¶
Некоторые локали используют контекстно-зависимое форматирование для чисел, которое не в состоянии автоматически обработать система локализации Django.
Швейцария (Германия)¶
Швейцарское форматирование чисел зависит от типа числа. Для денежных величин используются запятая для разделения разрядов и точка для выделения целой части. Для всех остальных чисел, используются запятая для выделения целой части, а пробел — в качестве разделителя разрядов. Поставляемое с Django локализованное форматирование использует вариант для большинства чисел.