Skip to main content

格式本地化

概述

Django的格式化系统能够使用为当前 语言环境 指定的格式在模板中显示日期,时间和数字。它还处理表单中的本地化输入。

启用后,访问相同内容的两个用户可能会根据当前语言环境的格式,以不同的方式查看日期,时间和数字的格式。

默认情况下禁用格式化系统。要启用它,需要在设置文件中设置 USE_L10N = True

注解

为方便起见,django-admin startproject 创建的默认 settings.py 文件包括 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 %}

注解

{% localize %} 块内部不遵守 USE_L10N 的值。

对于将在每个变量基础上执行相同作业的模板过滤器,请参阅 localizeunlocalize

模板过滤器

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提供的区域设置格式使用通用分隔符,十进制的逗号和千分格符的空格。