Я хочу использовать часовые пояса в соответствии с локалью babel. Как я могу этого добиться? Конкретная ситуация, с которой я сталкиваюсь, заключается в отображении даты и времени статьи, а также в гуманизированном и локализованном виде, например:
Вчерашний день
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)
Приведенный выше код локализует и гуманизирует вывод:
Я также могу переключать языки, например, на бразильский португальский:
Где 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)
Так что, по крайней мере, кажется, что я могу локализовать один часовой пояс, но мне интересно, как сделать его динамичным.
calendar.month_abbr[<month_number>]
. - person jcollado   schedule 27.12.2011