Skip to content

Commit

Permalink
[1.8.x] Fixed #24515 -- Fixed DjangoTranslation plural handling
Browse files Browse the repository at this point in the history
Backport of 9e83f30 from master.
  • Loading branch information
claudep committed Mar 21, 2015
1 parent 744d9a1 commit 8e4b0d6
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 2 deletions.
3 changes: 2 additions & 1 deletion django/utils/translation/trans_real.py
Expand Up @@ -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()
Expand Down Expand Up @@ -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):
Expand All @@ -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()

Expand Down
12 changes: 11 additions & 1 deletion tests/i18n/tests.py
Expand Up @@ -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
Expand All @@ -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:
Expand Down

0 comments on commit 8e4b0d6

Please sign in to comment.