Fixed #23196 -- Short-circuited empty string translation

Translating an empty string used to return the gettext catalog
metadata instead of the empty string.
Thanks Ned Batchelder for the suggestion, Tim Graham for the review
and Anton Berezin and Claude Paroz for contributions to the patch.
This commit is contained in:
Yuri Kriachko 2014-09-07 13:56:34 +02:00 committed by Claude Paroz
parent 5bf654e44b
commit 11f307a5a8
2 changed files with 21 additions and 6 deletions

View File

@ -292,15 +292,20 @@ def do_translate(message, translation_function):
# str() is allowing a bytestring message to remain bytestring on Python 2
eol_message = message.replace(str('\r\n'), str('\n')).replace(str('\r'), str('\n'))
t = getattr(_active, "value", None)
if t is not None:
result = getattr(t, translation_function)(eol_message)
if len(eol_message) == 0:
# Returns an empty value of the corresponding type if an empty message
# is given, instead of metadata, which is the default gettext behavior.
result = type(message)("")
else:
if _default is None:
_default = translation(settings.LANGUAGE_CODE)
result = getattr(_default, translation_function)(eol_message)
_default = _default or translation(settings.LANGUAGE_CODE)
translation_object = getattr(_active, "value", _default)
result = getattr(translation_object, translation_function)(eol_message)
if isinstance(message, SafeData):
return mark_safe(result)
return result

View File

@ -345,6 +345,16 @@ class TranslationTests(TestCase):
"""
self.assertEqual('django', six.text_type(string_concat("dja", "ngo")))
def test_empty_value(self):
"""
Empty value must stay empty after being translated (#23196).
"""
with translation.override('de'):
self.assertEqual("", ugettext(""))
self.assertEqual(b"", gettext(b""))
s = mark_safe("")
self.assertEqual(s, ugettext(s))
def test_safe_status(self):
"""
Translating a string requiring no auto-escaping shouldn't change the "safe" status.