Kaydet (Commit) 142c2721 authored tarafından Claude Paroz's avatar Claude Paroz

Fixed #22565 -- Prevented pgettext_lazy crash with bytestring input

Thanks ygbo for the report.
üst d1799233
...@@ -314,7 +314,8 @@ def pgettext(context, message): ...@@ -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
......
...@@ -11,3 +11,6 @@ Bugfixes ...@@ -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>`_).
...@@ -9,6 +9,7 @@ from importlib import import_module ...@@ -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, ...@@ -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): ...@@ -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):
self.assertEqual(gettext_lazy(b"test").upper(), b"TEST") # On Python 2, (n)gettext_lazy should not transform a bytestring to unicode
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")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment