Локализация форматов
Обзор
Система форматирования 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 содержит пользовательские определения форматов. Например:
from __future__ import unicode_literals THOUSAND_SEPARATOR = '\xa0'
чтобы использовать неразрывный пробел (Unicode 00A0) в качестве разделителя тысяч вместо запятой, которая используется по умолчанию для английского языка.
Ограничения предоставленных форматов языка
Некоторые языки используют контекстно-зависимые форматы для чисел, с которыми система локализации Django не может автоматически справиться.
Швейцария (немецкий)
Швейцарское форматирование чисел зависит от типа числа, которое форматируется. Для денежных значений используется запятая в качестве разделителя тысяч и десятичная точка в качестве разделителя десятичных знаков. Для всех остальных чисел используется запятая в качестве разделителя десятичных знаков и пробел в качестве разделителя тысяч. Предоставленный Django формат языка использует общие разделители: запятую для десятичных и пробел для разделителей тысяч.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.10/topics/i18n/formatting/