#21408 closed Bug (fixed)
Fallback to timesince produces erroneous translations in naturaltime
| Reported by: | Owned by: | Maximilian Merz | |
|---|---|---|---|
| Component: | Internationalization | Version: | dev |
| Severity: | Normal | Keywords: | i18n l10n translation |
| Cc: | Triage Stage: | Ready for checkin | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
The naturaltime filter in django.contrib.humanize composes strings for days, weeks, months, and years from the words "ago" and "in" and the output of the built-in timesince filter. See here, where delta is to be supplied by timesince:
#: templatetags/humanize.py:190 #, python-format msgctxt "naturaltime" msgid "%(delta)s ago" msgstr "vor %(delta)s"
This produces erroneous translations in German (and probably other inflectional languages, too).
"3 days, 12 hours ago" is translated by Django as
vor 3 Tage, 12 Stunden
but the correct translation is (with dative inflection)
vor 3 Tagen, 12 Stunden
"3 Tage" is correct for timesince, but for naturaltime it must become "3 Tagen". Unfortunately, the assumption that these translations can simply be pieced together from translated bits in timesince.py is mistaken.
I apologise if this isn't the right channel. I'd be glad to help, but so far I haven't seen a good way to avoid duplicating translations.
Change History (14)
comment:1 by , 12 years ago
| Component: | Translations → Internationalization |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
| Version: | 1.6 → master |
comment:2 by , 12 years ago
Thank you for your answer. Slightly off-topic: I noticed a minor error in the docs for npgettext_lazy and have fixed it in https://github.com/django/django/pull/1895.
comment:3 by , 12 years ago
I'm running into some difficulties with the code and the translations. Could it be that the .po files are out of sync with the code?
in humanize.py, line 204, there are bits like this one:
return ungettext(
# Translators: \\u00a0 is non-breaking space
'a second ago', '%(count)s\u00a0seconds ago', delta.seconds
) % {'count': delta.seconds}
There is a corresponding entry in the "en" locale, but in the "de" locale it looks different:
#. Translators: \\u00a0 is non-breaking space #: templatetags/humanize.py:198 #, python-format msgid "a second ago" msgid_plural "%(count)s\\u00a0seconds ago" msgstr[0] "" msgstr[1] ""
#: templatetags/humanize.py:196 #, python-format msgid "a second ago" msgid_plural "%(count)s seconds ago" msgstr[0] "vor einer Sekunde" msgstr[1] "vor %(count)s Sekunden"
I guess the translation is still found because the msgid is the same, but the German translation doesn't have the non-breaking space.
Also, these gettext messages in timesince.py, line 24,
chunks = (
(60 * 60 * 24 * 365, ungettext_lazy('%d year', '%d years')),
(60 * 60 * 24 * 30, ungettext_lazy('%d month', '%d months')),
...
don't exist in the "de" translations. As far as I can tell, the msgid "year" will not match "%d year".
#: utils/timesince.py:23 #, python-format msgid "%d year" msgid_plural "%d years" msgstr[0] "" msgstr[1] ""
#: utils/timesince.py:22 msgid "year" msgid_plural "years" msgstr[0] "Jahr" msgstr[1] "Jahre"
I'm not sure what's happening here. I'll experiment some more, maybe things will become clearer soon. If you want to share some advice, please do! Thanks.
comment:4 by , 12 years ago
You might find more up-to-date translations in the 1.6.x branch. We've still not updated master with the more recent translations.
comment:5 by , 12 years ago
Yes, @claudep, thank you, unfortunately there are no unit tests for those, and consequently the bug they introduced was overlooked: ticket:21415 Sorry for not noticing this earlier.
David
comment:6 by , 9 years ago
Bug still exists in 1.8.
A workaround for German for intervals into the future is to manually replace 'in' with 'noch', resulting in 'noch 2 Tage, 3 Stunden', which is correct.
comment:7 by , 8 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:9 by , 8 years ago
| Has patch: | set |
|---|
comment:10 by , 8 years ago
| Patch needs improvement: | set |
|---|
comment:11 by , 8 years ago
| Patch needs improvement: | unset |
|---|---|
| Triage Stage: | Accepted → Ready for checkin |
Surely, this will need duplication of translatable strings. One solution would be to make the
django.utils.timesinceutility to accept a new optional argument containing a set of translatable strings. Then,naturaltimewill be able to provide its own set ofnpgettext_lazy(with context) strings.