diff --git a/django/template/__init__.py b/django/template/__init__.py index 1fd3171c12..edc2150af0 100644 --- a/django/template/__init__.py +++ b/django/template/__init__.py @@ -678,6 +678,7 @@ class Variable(object): self.var = var self.literal = None self.lookups = None + self.translate = False try: # First try to treat this variable as a number. @@ -698,11 +699,15 @@ class Variable(object): except ValueError: # A ValueError means that the variable isn't a number. + if var.startswith('_(') and var.endswith(')'): + # The result of the lookup should be translated at rendering + # time. + self.translate = True + var = var[2:-1] # If it's wrapped with quotes (single or double), then # we're also dealing with a literal. if var[0] in "\"'" and var[0] == var[-1]: self.literal = var[1:-1] - else: # Otherwise we'll set self.lookups so that resolve() knows we're # dealing with a bonafide variable @@ -712,10 +717,13 @@ class Variable(object): """Resolve this variable against a given context.""" if self.lookups is not None: # We're dealing with a variable that needs to be resolved - return self._resolve_lookup(context) + value = self._resolve_lookup(context) else: # We're dealing with a literal, so it's already been "resolved" - return self.literal + value = self.literal + if self.translate: + return _(value) + return value def __repr__(self): return "<%s: %r>" % (self.__class__.__name__, self.var) diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 90dfa60b17..74e6fd5cef 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -734,8 +734,10 @@ class Templates(unittest.TestCase): # usage of the get_available_languages tag 'i18n12': ('{% load i18n %}{% get_available_languages as langs %}{% for lang in langs %}{% ifequal lang.0 "de" %}{{ lang.0 }}{% endifequal %}{% endfor %}', {}, 'de'), - # translation of a constant string + # translation of constant strings 'i18n13': ('{{ _("Page not found") }}', {'LANGUAGE_CODE': 'de'}, 'Seite nicht gefunden'), + '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'), ### HANDLING OF TEMPLATE_STRING_IF_INVALID ###################################