格式本地化 — Django 文档
格式本地化
概览
Django 的格式化系统能够使用为当前 locale 指定的格式在模板中显示日期、时间和数字。 它还处理表单中的本地化输入。
启用后,访问相同内容的两个用户可能会看到以不同方式格式化的日期、时间和数字,具体取决于他们当前区域设置的格式。
默认情况下禁用格式化系统。 要启用它,需要设置 :设置:`USE_L10N =真 ` 在您的设置文件中。
笔记
默认的settings.py
创建的文件 :djadmin:`django-admin startproject ` 包括 :设置:`USE_L10N =真 ` 为了方便。 但是请注意,要启用带有千位分隔符的数字格式,必须设置 :设置:`USE_THOUSAND_SEPARATOR = True ` 在您的设置文件中。 或者,您可以使用 :tfilter:`intcomma` 来格式化模板中的数字。
表单中的区域感知输入
启用格式化后,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
强制本地化单个值。
例如:
{% 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 提供的语言环境格式使用通用分隔符,逗号代表十进制,空格代表千位分隔符。