From 8e4b0d60109950c3dd0d500feb30d95fb716325c Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Fri, 20 Mar 2015 19:45:53 +0100 Subject: [PATCH] [1.8.x] Fixed #24515 -- Fixed DjangoTranslation plural handling Backport of 9e83f30cd31 from master. --- django/utils/translation/trans_real.py | 3 ++- tests/i18n/tests.py | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py index 376723ebe8e93..ff84589310653 100644 --- a/django/utils/translation/trans_real.py +++ b/django/utils/translation/trans_real.py @@ -111,7 +111,6 @@ def __init__(self, language): self.__language = language self.__to_language = to_language(language) self.__locale = to_locale(language) - self.plural = lambda n: int(n != 1) self._init_translation_catalog() self._add_installed_apps_translations() @@ -139,6 +138,7 @@ def _new_gnu_trans(self, localedir, use_null_fallback=True): # provides merge support for NullTranslations() translation._catalog = {} translation._info = {} + translation.plural = lambda n: int(n != 1) return translation def _init_translation_catalog(self): @@ -151,6 +151,7 @@ def _init_translation_catalog(self): # gettext will raise an IOError (refs #18192). use_null_fallback = False translation = self._new_gnu_trans(localedir, use_null_fallback) + self.plural = translation.plural self._info = translation._info.copy() self._catalog = translation._catalog.copy() diff --git a/tests/i18n/tests.py b/tests/i18n/tests.py index 59ddd235568e5..5503d0ba5ba3d 100644 --- a/tests/i18n/tests.py +++ b/tests/i18n/tests.py @@ -29,7 +29,7 @@ get_language, get_language_from_request, get_language_info, gettext, gettext_lazy, ngettext_lazy, npgettext, npgettext_lazy, pgettext, pgettext_lazy, string_concat, to_locale, trans_real, ugettext, - ugettext_lazy, ungettext_lazy, + ugettext_lazy, ungettext, ungettext_lazy, ) from .forms import CompanyForm, I18nForm, SelectDateForm, SelectDateWidget @@ -56,6 +56,16 @@ def patch_formats(lang, **settings): class TranslationTests(TestCase): + @translation.override('fr') + def test_plural(self): + """ + Test plurals with ungettext. French differs from English in that 0 is singular. + """ + self.assertEqual(ungettext("%d year", "%d years", 0) % 0, "0 année") + self.assertEqual(ungettext("%d year", "%d years", 2) % 2, "2 années") + self.assertEqual(ungettext("%(size)d byte", "%(size)d bytes", 0) % {'size': 0}, "0 octet") + self.assertEqual(ungettext("%(size)d byte", "%(size)d bytes", 2) % {'size': 2}, "2 octets") + def test_override(self): activate('de') try: