格式本地化 — Django 文档

来自菜鸟教程
Django/docs/3.0.x/topics/i18n/formatting
跳转至:导航、​搜索

格式本地化

概览

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

启用后,访问相同内容的两个用户可能会看到以不同方式格式化的日期、时间和数字,具体取决于他们当前区域设置的格式。

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

笔记

默认的settings.py创建的文件 :djadmin:`django-admin startproject ` 包括 :设置:`USE_L10N =真 ` 为了方便。 但是请注意,要启用带有千位分隔符的数字格式,必须设置 :设置:`USE_THOUSAND_SEPARATOR = True ` 在您的设置文件中。 或者,您可以使用 :tfilter:`intcomma` 来格式化模板中的数字。


笔记

还有一个独立但相关的 :setting:`USE_I18N` 设置控制 Django 是否应该激活翻译。 有关更多详细信息,请参阅 翻译


表单中的区域感知输入

启用格式化后,Django 在解析表单中的日期、时间和数字时可以使用本地化格式。 这意味着在猜测用户在表单上输入数据时使用的格式时,它会针对不同的语言环境尝试不同的格式。

笔记

Django 使用不同的格式来显示数据和用于解析数据的格式。 最值得注意的是,解析日期的格式不能使用 %a(缩写的工作日名称)、%A(完整的工作日名称)、%b(缩写的月份名称)、[ X163X](完整的月份名称),或 %p(上午/下午)。


要启用表单字段来本地化输入和输出数据,请使用其 localize 参数:

class CashRegisterForm(forms.Form):
   product = forms.CharField()
   revenue = forms.DecimalField(max_digits=4, decimal_places=2, localize=True)

控制模板中的本地化

当您使用 :setting:`USE_L10N` 启用格式时,Django 将在模板中输出值时尝试使用特定于语言环境的格式。

但是,使用本地化值可能并不总是合适的——例如,如果您输出的 JavaScript 或 XML 设计为机器可读,您将始终需要未本地化的值。 您可能还想在选定的模板中使用本地化,而不是在任何地方都使用本地化。

为了对本地化的使用进行精细控制,Django 提供了 l10n 模板库,其中包含以下标签和过滤器。

模板标签

localize

启用或禁用包含块中模板变量的本地化。

:setting:`USE_L10N` 相比,此标签允许对本地化进行更细粒度的控制。

要激活或停用模板块的本地化,请使用:

{% load l10n %}

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

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

笔记

:setting:`USE_L10N` 的值在 {% localize %} 块内不受重视。


请参阅 :tfilter:`localize`:tfilter:`unlocalize` 以了解将在每个变量的基础上完成相同工作的模板过滤器。


模板过滤器

localize

强制本地化单个值。

例如:

{% load l10n %}

{{ value|localize }}

要禁用单个值的本地化,请使用 :tfilter:`unlocalize`。 要控制模板大部分的本地化,请使用 :ttag:`localize` 模板标签。


unlocalize

强制打印单个值而不进行本地化。

例如:

{% load l10n %}

{{ value|unlocalize }}

要强制本地化单个值,请使用 :tfilter:`localize`。 要控制模板大部分的本地化,请使用 :ttag:`localize` 模板标签。


创建自定义格式文件

Django 为许多语言环境提供了格式定义,但有时您可能想要创建自己的格式定义,因为您的语言环境不存在格式文件,或者因为您想覆盖某些值。

要使用自定义格式,请指定首先放置格式文件的路径。 为此,请将您的 :setting:`FORMAT_MODULE_PATH` 设置设置为格式文件将存在的包,例如:

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

文件不直接放在这个目录中,而是放在一个名为 locale 的目录中,并且必须命名为 formats.py。 注意不要将敏感信息放入这些文件中,因为如果将字符串传递给 django.utils.formats.get_format()(由 :tfilter:`date` 模板过滤器使用),则可能会暴露其中的值。

要自定义英文格式,需要这样的结构:

mysite/
    formats/
        __init__.py
        en/
            __init__.py
            formats.py

其中 formats.py 包含自定义格式定义。 例如:

THOUSAND_SEPARATOR = '\xa0'

使用不间断空格 (Unicode 00A0) 作为千位分隔符,而不是英语的默认值,逗号。


提供的语言环境格式的限制

一些语言环境使用上下文相关的数字格式,Django 的本地化系统无法自动处理这些格式。

瑞士(德语)

瑞士数字格式取决于正在设置格式的数字类型。 对于货币值,逗号用作千位分隔符,小数点用作小数点分隔符。 对于所有其他数字,逗号用作小数分隔符,空格用作千位分隔符。 Django 提供的语言环境格式使用通用分隔符,逗号代表十进制,空格代表千位分隔符。