【发布时间】:2011-12-25 03:47:32
【问题描述】:
我想根据 babel 语言环境使用时区。我怎样才能做到这一点?我的具体情况是显示文章的日期和时间的目标以及人性化和本地化的方式例如:
昨天
13:21
或者如果设置了瑞典语参数,它将显示
伊戈尔
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)
以上代码将输出本地化和人性化:
我还可以将语言切换为巴西葡萄牙语等:
其中“Hoje”的意思是“今天”,因此过滤器似乎可以工作。
您能否告诉我如何使我的代码也允许时区?我使用 babel 进行本地化,使用 Jinja2 进行渲染。时区应该是文章的时区还是查看者的时区?例如,巴西的巴西用户发布消息,瑞典的瑞典观众查看该消息。那么应该使用哪个时区?
我可以尝试处理时区的方法是像文档状态一样导入 pytz 库并使用 I timezone 对象。我可以通过模板代码传递时区参数,但是如何从文章或语言环境中知道时区参数?在这种情况下,语言环境和时区会有所不同,因为它是针对印度的,语言环境是英语,时区是印度:
{{ 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)
所以至少看起来我可以本地化一个时区,但我想知道如何让它动态化。
【问题讨论】:
-
要根据月份数获取本地化名称,您可能会使用:
calendar.month_abbr[<month_number>]。
标签: python timezone internationalization jinja2 python-babel