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 ライブラリをインポートし、タイムゾーン オブジェクトを使用することです。テンプレートコードを介してタイムゾーンパラメーターを渡すことができますが、記事またはロケールからタイムゾーンパラメーターを知るにはどうすればよいですか? この場合、ロケールとタイムゾーンはインド向けであり、ロケールは英語でタイムゾーンはインドであるため、異なります。
{{ 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 つのタイムゾーンをローカライズできるようですが、動的にする方法を考えています。