Как включить часовые пояса с babel в моем фильтре jinja? - PullRequest
1 голос
/ 25 декабря 2011

Я хочу использовать часовые пояса в соответствии с локалью 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)

Приведенный выше код локализует и очеловечивает вывод:

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)

Так что, по крайней мере, я могу локализовать один часовой пояс, но мне интересно, как сделать его динамичным.

1 Ответ

1 голос
/ 04 августа 2012

Должен ли часовой пояс быть часовым поясом статьи или часовым поясом зрителя?Например, бразильский пользователь в Бразилии отправляет сообщение, а шведский зритель в Швеции просматривает сообщение.Какой часовой пояс следует использовать?

Я бы всегда отображал время как «время настенных часов», что означает использование часового пояса, который ваш зритель будет видеть на обычных часах на своем столе.Однако это зависит от вас.

Я могу передать параметр часового пояса через код шаблона, но как узнать параметр часового пояса, из статьи или из локали?В этом случае локаль и часовой пояс будут отличаться, так как это для Индии, а локаль - английский, а часовой пояс - для Индии:

Ужасная правда в том, что часовые пояса и локали - это два разных зверя с очень слабой связьюмежду ними.Например, индиец в Швеции по-прежнему хочет читать по-английски (хинди, ...), но в шведском часовом поясе.

Конечно, вы можете жестко закодировать его для конкретных целей, но более разумным было бы разделитьлокализуйте из часового пояса и предоставьте пользователю возможность управлять настройкой часового пояса.

Что касается вашего кода, вам, вероятно, потребуется переключиться с наивных датчасов на tz-осведомленные даты.

...