使用 L10N 在 Django 模板中为一种语言指定日期格式
Posted
技术标签:
【中文标题】使用 L10N 在 Django 模板中为一种语言指定日期格式【英文标题】:Specifying date format in Django templates with L10N for one language 【发布时间】:2019-06-02 07:23:08 【问题描述】:在 Django 模板中,我显示的日期如下:
article.published_at|date
显示如下:
十一月2018 年 2 月 21 日
我想改变这种格式,但是:
我正在使用本地化,所以我不想在模板中指定特定的日期格式——每种语言都有自己的日期显示方式。
当L10N
设置为True
时,Django DATE_FORMAT
设置does not have any effect。
那我该怎么办:
-
如果当前语言为英语 (
en
),请为此日期使用不同的格式
当不是en
时使用当前语言的默认日期格式
【问题讨论】:
【参考方案1】:这是我最终用来替代内置 date
filter 的过滤器。
# myapp/templatetags/my_filters.py
from django import template
from django.conf import settings
from django.template.defaultfilters import date
from django.utils import dateformat
from django.utils.translation import get_language
register = template.Library()
@register.filter(expects_localtime=True, is_safe=False)
def format_date(value):
if value in (None, ''):
return ''
language_code = get_language()
if language_code == 'en':
# Language is English, so use the format defined in settings:
return dateformat.format(value, settings.DATE_FORMAT)
else:
# Language is not English, so use language-specific default:
return date(value)
我使用settings.py
中的普通DATE_FORMAT
Django 设置来设置自定义日期格式:
DATE_FORMAT = 'j F Y'
如果当前语言是英语,则使用此选项。否则使用当前语言的默认值。
像这样使用它:
% load my_filters %
article.published_at|format_date
您可以扩展它以提供其他语言的自定义格式,但这就是我现在所需要的。
我仍然希望有一种方法可以在设置中定义每种语言的日期格式,所以我仍然觉得我错过了一种更简单的方法......
【讨论】:
【参考方案2】:您的模板是否包含% load l10n %
标签?
您可以使用上面的标签和
例如,如果您正在寻找要显示的日期,例如: 2020 年 1 月 13 日
你会做:
your_date|date:'n/j/Y'
见Link to the docs for builtins |date
当它已经存在时,你自己的滚动没有多大意义,但建议考虑在上下文中添加date_format="n/j/Y"
。那么你就可以恰到好处了:
item.date_end|date:date_format
然后您将不会在模板中指定格式,此外,如果它在任何地方都使用,您可以创建一个上下文处理器来定义它,以便它包含在每个渲染中。因此,在整个站点范围内更改变得非常容易。
Create your own context processor
【讨论】:
它没有。我试过添加它,但它本身并没有什么不同。 尝试指定LANGUAGE_CODE
(记住它还需要USE_I18N = True
)。如果您希望您的应用动态确定语言偏好,请查看LocaleMiddleware。
对不起,我不明白你的意思。整个网站在多种语言中运行良好,带有翻译,用户可以在语言版本之间切换。
哦,那好吧。我误解了您的问题,并以某种方式假设您在新应用程序中设置本地化时遇到问题。您可以指定日期在模板中的显示方式,如 value|date:"D d M Y"
(check docs)。如果您想为每种语言自定义它,您可以将 django.utils.translation.get_language()
传递给模板上下文并使用简单的条件块。这是你的问题吗?
我不知道如何比问题中的第 1 点和第 2 点更好地描述问题。我不想每次显示日期时都在模板中使用条件。我想我必须编写自己的模板过滤器,但我想可能会错过一些更简单的东西。以上是关于使用 L10N 在 Django 模板中为一种语言指定日期格式的主要内容,如果未能解决你的问题,请参考以下文章
Python - 如何在 django 模板中为所有值并排显示两个键的字典值