1

我想根据 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)

所以至少看起来我可以本地化一个时区,但我想知道如何让它动态化。

4

1 回答 1

1

时区应该是文章的时区还是查看者的时区?例如,巴西的巴西用户发布消息,瑞典的瑞典观众查看该消息。那么应该使用哪个时区?

我总是将时间显示为“挂钟时间”,这意味着使用您的观众在他桌子上的常规时钟上看到的时区。然而,这取决于你。

我可以通过模板代码传递时区参数,但是如何从文章或语言环境中知道时区参数?在这种情况下,语言环境和时区会有所不同,因为它是针对印度的,语言环境是英语,时区是印度:

丑陋的事实是,时区和地区是两种不同的野兽,它们之间只有非常松散的联系。例如,瑞典的印度人仍然想在瑞典时区阅读英语(印地语,...)。

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

至于您的代码,您可能需要从天真的日期时间切换到支持 tz 的日期时间。

于 2012-08-03T20:51:46.643 回答