Как локализовать гуманизированное форматирование времени - PullRequest
2 голосов
/ 16 декабря 2011

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

Сегодня

16: 48

или

Вчера

17: 10

или

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') }}

Но как мне локализовать строки «Сегодня» и «Вчера» и как получить сокращенную форму от babel, например, Jan вместо января, февраль вместо февраля, и как мне добавить часовые пояса к этому проекту, когда я знаю, какие страна, в которой находился субъект на момент изменения? У меня есть переменная entity.url, которая сообщает нам, какой это был домен, поскольку мое приложение обслуживает несколько доменов, поэтому в основном это только часовые пояса, зависящие от entity.url (часовой пояс Бразилии и часовой пояс Индии), и моя основная локализация в основном для бразильского португальского и английского языков. но это должно работать на большее, т. е. должно быть легко добавлять и языки и переключаться на язык.

Спасибо за любой ответ на комментарий

Обновление

Теперь он отображается правильно, но я не мог взять его напрямую из времен Джанго, потому что еще не мог заставить работать часовые пояса. Но единственная оставшаяся часть сейчас это часовые пояса, я думаю:

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)

Мне нужно было сделать то же самое, что и выше, чтобы получить переведенную краткую форму месяцев, например, Дез. для декабря в бразильском португальском) и теперь он локализуется лучше:

enter image description here Выше, прежде, и следующее с локализацией на бразильском португальском enter image description here

1 Ответ

2 голосов
/ 16 декабря 2011

У Django есть приятная функция timesince:

Вы можете адаптировать ее под свои нужды (возможно, придется убрать часть перевода).

...