[1.6.x] Fixed #21650 -- Corrected bad advice for plural translation.

Thanks nedbatchelder and claudep.

Backport of 85270ef3f5 from master
This commit is contained in:
Tim Graham 2013-12-27 09:57:56 -05:00
parent f3a9a76123
commit 3b79fbabcd
1 changed files with 28 additions and 23 deletions

View File

@ -206,7 +206,9 @@ For example::
In this example the number of objects is passed to the translation In this example the number of objects is passed to the translation
languages as the ``count`` variable. languages as the ``count`` variable.
Lets see a slightly more complex usage example:: Note that pluralization is complicated and works differently in each language.
Comparing ``count`` to 1 isn't always the correct rule. This code looks
sophisticated, but will produce incorrect results for some languages::
from django.utils.translation import ungettext from django.utils.translation import ungettext
from myapp.models import Report from myapp.models import Report
@ -218,42 +220,45 @@ Lets see a slightly more complex usage example::
name = Report._meta.verbose_name_plural name = Report._meta.verbose_name_plural
text = ungettext( text = ungettext(
'There is %(count)d %(name)s available.', 'There is %(count)d %(name)s available.',
'There are %(count)d %(name)s available.', 'There are %(count)d %(name)s available.',
count count
) % { ) % {
'count': count, 'count': count,
'name': name 'name': name
} }
Here we reuse localizable, hopefully already translated literals (contained in Don't try to implement your own singular-or-plural logic, it won't be correct.
the ``verbose_name`` and ``verbose_name_plural`` model ``Meta`` options) for In a case like this, consider something like the following::
other parts of the sentence so all of it is consistently based on the
cardinality of the elements at play. text = ungettext(
'There is %(count)d %(name)s object available.',
'There are %(count)d %(name)s objects available.',
count
) % {
'count': count,
'name': Report._meta.verbose_name,
}
.. _pluralization-var-notes: .. _pluralization-var-notes:
.. note:: .. note::
When using this technique, make sure you use a single name for every When using ``ungettext()``, make sure you use a single name for every
extrapolated variable included in the literal. In the example above note how extrapolated variable included in the literal. In the examples above, note
we used the ``name`` Python variable in both translation strings. This how we used the ``name`` Python variable in both translation strings. This
example would fail:: example, besides being incorrect in some languages as noted above, would
fail::
from django.utils.translation import ungettext text = ungettext(
from myapp.models import Report 'There is %(count)d %(name)s available.',
'There are %(count)d %(plural_name)s available.',
count = Report.objects.count() count
d = { ) % {
'count': count, 'count': Report.objects.count(),
'name': Report._meta.verbose_name, 'name': Report._meta.verbose_name,
'plural_name': Report._meta.verbose_name_plural 'plural_name': Report._meta.verbose_name_plural
} }
text = ungettext(
'There is %(count)d %(name)s available.',
'There are %(count)d %(plural_name)s available.',
count
) % d
You would get an error when running :djadmin:`django-admin.py You would get an error when running :djadmin:`django-admin.py
compilemessages <compilemessages>`:: compilemessages <compilemessages>`::