Django Humanize naturaltime templatetag только частично переводит - PullRequest
2 голосов
/ 15 апреля 2019

Джанго версия 2.1

У меня есть приложение, в котором я показываю события. Я хочу показать, как давно или как далеко в будущем происходит это событие. Для этого я использую шаблон тега naturaltime из пакета humanize.

{{ event.date|naturaltime }}

# my model in models.py
class Event(models.model):
    # ... other fields
    date = models.DateTimeField(...)

Я хочу, чтобы результат был на голландском, поэтому я изменил язык в settings.py: LANGUAGE_CODE = 'nl-nl'

Вот проблема: Если разница во времени между текущим временем и датой-временем, установленными в модели, превышает 24 часа, перевод является только частичным. Примеры со временем в прошлом:

# english
one hour ago
# dutch, correct
een uur geleden

# enlish
6 days, 2 hours ago
# dutch translation, only partial
6 dagen, 2 uur ago

Примеры со временем в будущем

# english
2 hours from now
# dutch translation, correct
over 2 uur

# enlish
1 month from now
# dutch translation, only partial
1 maand from now

Как видите, части «назад» и «отныне» не переводятся, если разница во времени превышает 24 часа.

Я погрузился в исходный код и нашел следующую соответствующую информацию, но все еще не смог найти виновного. Naturaltime вызывает шаблон тега по умолчанию timesince / timeuntil, если разница превышает 1 день. Времена с тегом шаблона переводятся правильно, но когда результат передается обратно в натуральное время, чтобы добавить части «назад» и «отныне», этот результат вообще не переводится.

Humanize

# lines 211-292
@register.filter
def naturaltime(value):
    """
    For date and time values show how many seconds, minutes, or hours ago
    compared to current timestamp return representing string.
    """
    if not isinstance(value, date):  # datetime is a subclass of date
        return value

    now = datetime.now(utc if is_aware(value) else None)
    if value < now:
        delta = now - value
        if delta.days != 0:
            # Translators: delta will contain a string like '2 months' or '1 month, 2 weeks'
            return _('%(delta)s ago') % {'delta': defaultfilters.timesince(value, now, time_strings={
                # Translators: 'naturaltime-past' strings will be included in
                # '%(delta)s ago'
                'year': npgettext_lazy('naturaltime-past', '%d year', '%d years'),
                'month': npgettext_lazy('naturaltime-past', '%d month', '%d months'),
                'week': npgettext_lazy('naturaltime-past', '%d week', '%d weeks'),
                'day': npgettext_lazy('naturaltime-past', '%d day', '%d days'),
                'hour': npgettext_lazy('naturaltime-past', '%d hour', '%d hours'),
                'minute': npgettext_lazy('naturaltime-past', '%d minute', '%d minutes')
            })}
            # some more elif and else
            ...
    else:
        delta = value - now
        if delta.days != 0:
            # Translators: delta will contain a string like '2 months' or '1 month, 2 weeks'
            return _('%(delta)s from now') % {'delta': defaultfilters.timeuntil(value, now, time_strings={
                # Translators: 'naturaltime-future' strings will be included in
                # '%(delta)s from now'
                'year': npgettext_lazy('naturaltime-future', '%d year', '%d years'),
                'month': npgettext_lazy('naturaltime-future', '%d month', '%d months'),
                'week': npgettext_lazy('naturaltime-future', '%d week', '%d weeks'),
                'day': npgettext_lazy('naturaltime-future', '%d day', '%d days'),
                'hour': npgettext_lazy('naturaltime-future', '%d hour', '%d hours'),
                'minute': npgettext_lazy('naturaltime-future', '%d minute', '%d minutes')
            })}
            # some more elif and else
            ...

NL локаль .po файл

# line 259-262 and 302-305, seems working
msgid "an hour ago"
msgid_plural "%(count)s hours ago"
msgstr[0] "een uur geleden"
msgstr[1] "%(count)s uur geleden"
...
msgid "an hour from now"
msgid_plural "%(count)s hours from now"
msgstr[0] "over een uur"
msgstr[1] "over %(count)s uur"

# line 253-254 and 310-311, not working
msgid "%(delta)s ago"
msgstr "%(delta)s geleden"
...
msgid "%(delta)s from now"
msgstr "over %(delta)s"

Я что-то не так делаю или это ошибка в пакете humanize или в голландских файлах перевода?

PS. Я не использую никаких пользовательских файлов перевода

1 Ответ

0 голосов
/ 15 апреля 2019

Я не знаю, в чем проблема, но обновление до Django 2.2 решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...