次のような記事の時間の人間味のある出力を得るためにローカライズするにはどうすればよいですか
今日
16:48
また
昨日
17:10
また
12月13日
11:20
from webapp2_extras.i18n import 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()
if datetime.date(value) == datetime.date(now):
info= _('Today')
elif (now - value).days < 2:
info= _('Yesterday')
else:
info=format_datetime(value, "MMMM dd", locale=locale)
return info+'<br>'+format_time(value, 'hh:mm', locale=locale)
上記のコードを使用して、人間化された出力を表示するエンティティの時間のフィルターを作成できます。
{{ entity.modified|datetimeformat_jinja(locale='pt_BR') }}
しかし、文字列「Today」と「Yesterday」をローカライズするにはどうすればよいですか。また、1 月ではなく Jan、February ではなく Feb のようなバベルから省略形を取得するにはどうすればよいでしょうか。また、エンティティの国がわかっている場合に、このプロジェクトにタイムゾーンを追加するにはどうすればよいでしょうか。改造時に入っていた?アプリが複数のドメインを提供するため、どのドメインであったかを示す変数 entity.url があるため、基本的には entity.url (ブラジルのタイムゾーンとインドのタイムゾーン) に応じたタイムゾーンであり、私の基本的なローカリゼーションは主にブラジルのポルトガル語と英語です。しかし、それはもっとうまくいくはずです。つまり、言語の追加と言語への切り替えが簡単でなければなりません。
コメントの返信ありがとうございます
アップデート
現在は正しくレンダリングされていますが、まだタイムゾーンを機能させることができなかったため、django の時間から直接取得することはできませんでした。しかし、今残っている唯一の部分はタイムゾーンだと思います:
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, 'hh:mm', locale=locale)
Dez などの翻訳された短い形式の月を取得するには、上記のようにする必要がありました。ブラジリア ポルトガル語の Dezember の場合)、ローカライズが改善されました。
上は以前のもので、以下はブラジル ポルトガル語にローカライズされたものです。