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:
parent
5bf654e44b
commit
11f307a5a8
|
@ -292,15 +292,20 @@ def do_translate(message, translation_function):
|
||||||
|
|
||||||
# str() is allowing a bytestring message to remain bytestring on Python 2
|
# 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'))
|
eol_message = message.replace(str('\r\n'), str('\n')).replace(str('\r'), str('\n'))
|
||||||
t = getattr(_active, "value", None)
|
|
||||||
if t is not None:
|
if len(eol_message) == 0:
|
||||||
result = getattr(t, translation_function)(eol_message)
|
# 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:
|
else:
|
||||||
if _default is None:
|
_default = _default or translation(settings.LANGUAGE_CODE)
|
||||||
_default = translation(settings.LANGUAGE_CODE)
|
translation_object = getattr(_active, "value", _default)
|
||||||
result = getattr(_default, translation_function)(eol_message)
|
|
||||||
|
result = getattr(translation_object, translation_function)(eol_message)
|
||||||
|
|
||||||
if isinstance(message, SafeData):
|
if isinstance(message, SafeData):
|
||||||
return mark_safe(result)
|
return mark_safe(result)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -345,6 +345,16 @@ class TranslationTests(TestCase):
|
||||||
"""
|
"""
|
||||||
self.assertEqual('django', six.text_type(string_concat("dja", "ngo")))
|
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):
|
def test_safe_status(self):
|
||||||
"""
|
"""
|
||||||
Translating a string requiring no auto-escaping shouldn't change the "safe" status.
|
Translating a string requiring no auto-escaping shouldn't change the "safe" status.
|
||||||
|
|
Loading…
Reference in New Issue