gpt4 book ai didi

python - 如何在我的 jinja 过滤器中使用 babel 启用时区?

转载 作者:太空宇宙 更新时间:2023-11-03 19:24:38 25 4
gpt4 key购买 nike

我想根据 babel 语言环境使用时区。我怎样才能实现这个目标?我的具体情况是希望以人性化、本地化的方式显示文章的日期和时间eg:

Yesterday

13:21

或者如果设置了瑞典语语言参数,它将显示

Igår

13:21

如果日期不是昨天或今天,它将打印日期和 24 小时时间。我认为除了处理时区之外我一切都成功了:

    from webapp2_extras import i18n
from webapp2_extras.i18n import lazy_gettext as _
import datetime
from datetime import date, datetime, time
from babel.dates import format_date, format_datetime, format_time
from babel.numbers import format_number, format_decimal, format_percent
def datetimeformat_jinja(value, format='%H:%M / %d-%m-%Y', locale='en'):
now= datetime.now()
info = None
if datetime.date(value) == datetime.date(now):
info= _('Today')
elif (now - value).days < 2:
info= _('Yesterday')
else:
month = value.month
if month == 1:
info = str(value.day)+' '+_('Jan')
elif month == 2:
info = str(value.day)+' '+_('Feb')
elif month == 3:
info = str(value.day)+' '+_('Mar')
elif month == 4:
info = str(value.day)+' '+_('April')
elif month == 5:
info = str(value.day)+' '+_('May')
elif month == 6:
info = str(value.day)+' '+_('June')
elif month == 7:
info = str(value.day)+' '+_('July')
elif month == 8:
info = str(value.day)+' '+_('Aug')
elif month == 9:
info = str(value.day)+' '+_('Sep')
elif month == 10:
info = str(value.day)+' '+_('Oct')
elif month == 11:
info = str(value.day)+' '+_('Nov')
else:
info = str(value.day)+' '+_('Dec')
return info+'<br>'+format_time(value, 'H:mm', locale=locale)

上面的代码本地化和人性化输出:

enter image description here

我还可以将语言切换为例如巴西葡萄牙语:

enter image description here

其中“Hoje”的意思是“今天”,因此过滤器似乎可以工作。

您能否告诉我如何使我的代码也允许时区?我使用 babel 进行本地化,使用 Jinja2 进行渲染。时区应该是文章的时区还是查看者的时区?例如,巴西的巴西用户发布消息,瑞典的瑞典查看者查看该消息。那么应该使用哪个时区?

我可以尝试处理时区的方法是导入 pytz 库(如文档状态)并使用 I 时区对象。我可以通过模板代码传递时区参数,但如何从文章或语言环境中了解时区参数?在这种情况下,区域设置和时区将有所不同,因为它针对印度,区域设置为英语,时区为印度:

{{ article.modified|datetimeformat_jinja(locale='en') }}

然后我也可以像这样传递时区参数

{{ article.modified|datetimeformat_jinja(locale='en') }}

过滤器:

def datetimeformat_jinja(value, format='%H:%M / %d-%m-%Y', locale='en', tzinfo=timezone('India')):
now= datetime.now()
info = None
if datetime.date(value) == datetime.date(now):
info= _('Today')
elif (now - value).days < 2:
info= _('Yesterday')
else:
month = value.month
if month == 1:
info = str(value.day)+' '+_('Jan')
elif month == 2:
info = str(value.day)+' '+_('Feb')
elif month == 3:
info = str(value.day)+' '+_('Mar')
elif month == 4:
info = str(value.day)+' '+_('April')
elif month == 5:
info = str(value.day)+' '+_('May')
elif month == 6:
info = str(value.day)+' '+_('June')
elif month == 7:
info = str(value.day)+' '+_('July')
elif month == 8:
info = str(value.day)+' '+_('Aug')
elif month == 9:
info = str(value.day)+' '+_('Sep')
elif month == 10:
info = str(value.day)+' '+_('Oct')
elif month == 11:
info = str(value.day)+' '+_('Nov')
else:
info = str(value.day)+' '+_('Dec')
return info+'<br>'+format_time(value, 'H:mm', tzinfo=tzinfo, locale=locale)

所以至少我似乎可以本地化一个时区,但我想知道如何使其动态。

最佳答案

Should the timezone be the timezone of the article or the timezone of the viewer? For instance, a Brazilian user in Brazil posts a message and a Swedish viewer in Sweden views the message. Which timezone should then be used?

我总是将时间显示为“挂钟时间”,这意味着使用您的观看者在其办公 table 上的常规时钟上看到的时区。不过,这取决于您。

I can pass the timezone parameter via the template code but how to know the timezone parameter, from the article or from the locale? In this case the locale and the timezone will be different since it's for India and locale is English and timezone India:

丑陋的事实是,时区和地点是两种不同的动物,它们之间的联系非常松散。例如,瑞典的印度人仍然想阅读英语(印地语,...),但处于瑞典时区。

当然,您可以针对特定用途对其进行硬编码,但更明智的做法是将语言环境与时区分离,并让用户控制时区设置。

对于您的代码,您可能需要从简单的日期时间切换到 tz 感知的日期时间。

关于python - 如何在我的 jinja 过滤器中使用 babel 启用时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8628102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com