Fixed #22565 -- Prevented pgettext_lazy crash with bytestring input

Thanks ygbo for the report.
This commit is contained in:
Claude Paroz 2014-05-02 19:31:22 +02:00
parent d1799233f4
commit 142c27218a
3 changed files with 21 additions and 5 deletions

View File

@ -314,7 +314,8 @@ def pgettext(context, message):
result = ugettext(msg_with_ctxt) result = ugettext(msg_with_ctxt)
if CONTEXT_SEPARATOR in result: if CONTEXT_SEPARATOR in result:
# Translation not found # Translation not found
result = message # force unicode, because lazy version expects unicode
result = force_text(message)
return result return result

View File

@ -11,3 +11,6 @@ Bugfixes
* Made the ``year_lookup_bounds_for_datetime_field`` Oracle backend method * Made the ``year_lookup_bounds_for_datetime_field`` Oracle backend method
Python 3 compatible (`#22551 <http://code.djangoproject.com/ticket/22551>`_). Python 3 compatible (`#22551 <http://code.djangoproject.com/ticket/22551>`_).
* Fixed ``pgettext_lazy`` crash when receiving bytestring content on Python 2
(`#22565 <http://code.djangoproject.com/ticket/22565>`_).

View File

@ -9,6 +9,7 @@ from importlib import import_module
import os import os
import pickle import pickle
from threading import local from threading import local
from unittest import skipUnless
from django.conf import settings from django.conf import settings
from django.template import Template, Context from django.template import Template, Context
@ -30,7 +31,7 @@ from django.utils.translation import (activate, deactivate,
ugettext, ugettext_lazy, ugettext, ugettext_lazy,
ngettext_lazy, ngettext_lazy,
ungettext_lazy, ungettext_lazy,
pgettext, pgettext, pgettext_lazy,
npgettext, npgettext_lazy, npgettext, npgettext_lazy,
check_for_language, check_for_language,
string_concat, LANGUAGE_SESSION_KEY) string_concat, LANGUAGE_SESSION_KEY)
@ -94,9 +95,20 @@ class TranslationTests(TestCase):
s4 = ugettext_lazy('Some other string') s4 = ugettext_lazy('Some other string')
self.assertEqual(False, s == s4) self.assertEqual(False, s == s4)
if six.PY2: @skipUnless(six.PY2, "No more bytestring translations on PY3")
# On Python 2, gettext_lazy should not transform a bytestring to unicode def test_lazy_and_bytestrings(self):
# On Python 2, (n)gettext_lazy should not transform a bytestring to unicode
self.assertEqual(gettext_lazy(b"test").upper(), b"TEST") self.assertEqual(gettext_lazy(b"test").upper(), b"TEST")
self.assertEqual((ngettext_lazy(b"%d test", b"%d tests") % 1).upper(), b"1 TEST")
# Other versions of lazy functions always return unicode
self.assertEqual(ugettext_lazy(b"test").upper(), "TEST")
self.assertEqual((ungettext_lazy(b"%d test", b"%d tests") % 1).upper(), "1 TEST")
self.assertEqual(pgettext_lazy(b"context", b"test").upper(), "TEST")
self.assertEqual(
(npgettext_lazy(b"context", b"%d test", b"%d tests") % 1).upper(),
"1 TEST"
)
def test_lazy_pickle(self): def test_lazy_pickle(self):
s1 = ugettext_lazy("test") s1 = ugettext_lazy("test")