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

{{ 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 つのタイムゾーンをローカライズできるようですが、動的にする方法を考えています。

4

1 に答える 1

1

タイムゾーンは記事のタイムゾーンにするべきですか、それとも閲覧者のタイムゾーンにするべきですか? たとえば、ブラジル在住のブラジル人ユーザーがメッセージを投稿し、スウェーデン在住のスウェーデン人視聴者がそのメッセージを閲覧したとします。次に、どのタイムゾーンを使用する必要がありますか?

私は常に時間を「壁時計時間」として表示します。これは、視聴者が机の上の通常の時計で見るタイムゾーンを使用することを意味します。しかし、それはあなた次第です。

テンプレートコードを介してタイムゾーンパラメーターを渡すことができますが、記事またはロケールからタイムゾーンパラメーターを知るにはどうすればよいですか? この場合、ロケールとタイムゾーンはインド向けであり、ロケールは英語でタイムゾーンはインドであるため、異なります。

醜い真実は、タイムゾーンとロケールは 2 つの異なる獣であり、それらの間には非常に緩いつながりしかないということです。たとえば、スウェーデンのインド人は、英語 (ヒンディー語など) を読みたいと思っていますが、スウェーデンのタイムゾーンで読みたいと思っています。

もちろん、特定の用途のためにハードコーディングすることもできますが、より賢明なことは、タイムゾーンからロケールを分離し、ユーザーがタイムゾーン設定を制御できるようにすることです。

コードに関しては、おそらく単純な日時から tz 対応の日時に切り替える必要があります。

于 2012-08-03T20:51:46.643 に答える