使用 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 模板中为一种语言指定日期格式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中为模板应用背景图像

Django 模板:获取另一种语言的当前 URL

是否有任何工具可以自动在Django中为模型创建模板

Python - 如何在 django 模板中为所有值并排显示两个键的字典值

是否有几乎类似于 Django 模板语言的 PHP 模板语言?

php 在Drupal 7模板中为不同语言使用不同的菜单