Формат локализации

Введение

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

Изменено в Django 1.8:

Была добавлена возможно указать список в FORMAT_MODULE_PATH. Ранее можно было указать лишь строку.

Для использования собственных форматов требуется указать путь до пакета, в котором они определены. Для этого предназначен параметр конфигурации 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 содержит определения своих форматов. Например:

from __future__ import unicode_literals

THOUSAND_SEPARATOR = '\xa0'

для использования неразрывного пробела (Unicode 00A0) в качестве разделителя разрядов, вместо стандартной для англичан точки.

Ограничения предоставленных форматов локализации

Некоторые локали используют контекстно-зависимое форматирование для чисел, которое не в состоянии автоматически обработать система локализации Django.

Швейцария (Германия)

Швейцарское форматирование чисел зависит от типа числа. Для денежных величин используются запятая для разделения разрядов и точка для выделения целой части. Для всех остальных чисел, используются запятая для выделения целой части, а пробел — в качестве разделителя разрядов. Поставляемое с Django локализованное форматирование использует вариант для большинства чисел.