本地格式化

概况

Django 的格式化系统可以在模板中使用指定的格式化工具为当前的 locale 来显示日期、时间和数字。

Two users accessing the same content may see dates, times and numbers formatted in different ways, depending on the formats for their current locale.

备注

要启用千位分隔符的数字格式,必须在你的配置文件中设置 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)

在模板中控制本地化

Django tries to use a locale specific format whenever it outputs a value in a template.

然而,使用本地化值可能并不总是合适的——比如,如果你正在输出机器可读的 JavaScript 或 XML ,则始终需要非本地化的值。你也可以在已选的模板里使用本地化,而不是在所有地方使用。

为了更好的控制本地化的使用,Django 提供 l10n 模板库,它包含以下的 tags 和 filters。

模板标签

localize

在模板里启用和禁用模板变量本地化。

To activate or deactivate localization for a template block, use:

{% load l10n %}

{% localize on %}
    {{ value }}
{% endlocalize %}

{% localize off %}
    {{ value }}
{% endlocalize %}

查看 localizeunlocalize 来获取在每个变量基础上执行相同任务的模板过滤器。

模板过滤器

localize

对单一值的强制本地化

例如:

{% load l10n %}

{{ value|localize }}

对单一值取消本地化,使用 unlocalize 。要控制大部分模板的本地化,请使用 localize 模板标签。

unlocalize

强制地让单一值不被本地化。

例如:

{% load l10n %}

{{ value|unlocalize }}

对单一值强制本地化,使用 localize 。要控制大部分模板的本地化,请使用 localize 模板标签。

返回未本地化数字(intfloatDecimal)的字符串表示。

创建自定义的格式化文件

Django 为许多地区提供了格式定义,但有时你可能想创建自己的格式,因为你的地区不存在一个格式文件,或者你想覆盖一些值。

要使用自定义格式化,你首先要指定格式化文件的路径,需要将 FORMAT_MODULE_PATH 设置为格式化文件所在的包路径,例如:

FORMAT_MODULE_PATH = [
    "mysite.formats",
    "some_app.formats",
]

文件不能直接放置在这个目录里,而是要放在本地语言环境的目录中,而且必须命名为 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 本地化系统不能自动处理。

Switzerland (German)

瑞士数字格式化取决于要格式化的数字类型。对于货币值,用逗号作为千位分隔符,小数点作为小数点分隔符。对于其他数字,逗号用作小数点分隔符,空格用作千分位分隔符。Django 提供的本地语言环境格式化使用通用分隔符,小数点用逗号,千分位分隔符用空格。