Commit 11f307a5 authored by Yuri Kriachko's avatar Yuri Kriachko Committed by Claude Paroz
Browse files

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.
parent 5bf654e4
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -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


+10 −0
Original line number Diff line number Diff line
@@ -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.