From 8e4b0d60109950c3dd0d500feb30d95fb716325c Mon Sep 17 00:00:00 2001
From: Claude Paroz <claude@2xlibre.net>
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 376723ebe8..ff84589310 100644
--- a/django/utils/translation/trans_real.py
+++ b/django/utils/translation/trans_real.py
@@ -111,7 +111,6 @@ class DjangoTranslation(gettext_module.GNUTranslations):
         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 @@ class DjangoTranslation(gettext_module.GNUTranslations):
             # 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 @@ class DjangoTranslation(gettext_module.GNUTranslations):
             # 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 59ddd23556..5503d0ba5b 100644
--- a/tests/i18n/tests.py
+++ b/tests/i18n/tests.py
@@ -29,7 +29,7 @@ from django.utils.translation import (
     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: