diff --git a/django/template/__init__.py b/django/template/__init__.py index 5c4ab3052a..ffdb4e4809 100644 --- a/django/template/__init__.py +++ b/django/template/__init__.py @@ -485,9 +485,14 @@ class FilterExpression(object): (token[:upto], token[upto:start], token[start:])) if var == None: var, constant, i18n_constant = match.group("var", "constant", "i18n_constant") - if i18n_constant: - var = '"%s"' % _(i18n_constant.replace(r'\"', '"')) - elif constant: + if i18n_constant is not None: + # Don't pass the empty string to gettext, because the empty + # string translates to meta information. + if i18n_constant == "": + var = '""' + else: + var = '"%s"' % _(i18n_constant.replace(r'\"', '"')) + elif constant is not None: var = '"%s"' % constant.replace(r'\"', '"') upto = match.end() if var == None: diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 13b8c6b488..96e1d662c6 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -365,6 +365,9 @@ class Templates(unittest.TestCase): # Numbers as filter arguments should work 'filter-syntax19': ('{{ var|truncatewords:1 }}', {"var": "hello world"}, "hello ..."), + + #filters should accept empty string constants + 'filter-syntax20': ('{{ ""|default_if_none:"was none" }}', {}, ""), ### COMMENT SYNTAX ######################################################## 'comment-syntax01': ("{# this is hidden #}hello", {}, "hello"), @@ -770,11 +773,12 @@ class Templates(unittest.TestCase): 'i18n14': ('{% cycle "foo" _("Password") _(\'Password\') as c %} {% cycle c %} {% cycle c %}', {'LANGUAGE_CODE': 'de'}, 'foo Passwort Passwort'), 'i18n15': ('{{ absent|default:_("Password") }}', {'LANGUAGE_CODE': 'de', 'absent': ""}, 'Passwort'), 'i18n16': ('{{ _("<") }}', {'LANGUAGE_CODE': 'de'}, '<'), + 'i18n17': ('{{ _("") }}', {'LANGUAGE_CODE': 'de'}, ''), # Escaping inside blocktrans works as if it was directly in the # template. - 'i18n17': ('{% load i18n %}{% blocktrans with anton|escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α & β'), - 'i18n18': ('{% load i18n %}{% blocktrans with anton|force_escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α & β'), + 'i18n18': ('{% load i18n %}{% blocktrans with anton|escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α & β'), + 'i18n19': ('{% load i18n %}{% blocktrans with anton|force_escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α & β'), ### HANDLING OF TEMPLATE_STRING_IF_INVALID ###################################