diff --git a/django/utils/translation.py b/django/utils/translation.py index a8b9192bc6..0d40a636c8 100644 --- a/django/utils/translation.py +++ b/django/utils/translation.py @@ -364,6 +364,7 @@ inline_re = re.compile(r"""^\s*trans\s+((?:".*?")|(?:'.*?'))\s*""") block_re = re.compile(r"""^\s*blocktrans(?:\s+|$)""") endblock_re = re.compile(r"""^\s*endblocktrans$""") plural_re = re.compile(r"""^\s*plural$""") +constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""") def templateize(src): from django.core.template import tokenize, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK """ @@ -414,6 +415,7 @@ def templateize(src): if t.token_type == TOKEN_BLOCK: imatch = inline_re.match(t.contents) bmatch = block_re.match(t.contents) + cmatches = constant_re.findall(t.contents) if imatch: g = imatch.group(1) if g[0] == '"': g = g.strip('"') @@ -424,11 +426,17 @@ def templateize(src): inplural = False singular = [] plural = [] + elif cmatches: + for cmatch in cmatches: + out.write(' _(%s) ' % cmatch) else: out.write(blankout(t.contents, 'B')) elif t.token_type == TOKEN_VAR: parts = t.contents.split('|') - for p in parts: + cmatch = constant_re.match(parts[0]) + if cmatch: + out.write(' _(%s) ' % cmatch.group(1)) + for p in parts[1:]: if p.find(':_(') >= 0: out.write(' %s ' % p.split(':',1)[1]) else: diff --git a/docs/translation.txt b/docs/translation.txt index 21d947d1d6..637719b879 100644 --- a/docs/translation.txt +++ b/docs/translation.txt @@ -172,6 +172,16 @@ two tags:: All tags live in the ``i18n`` tag library, so you need to specify ``{% load i18n %}`` in the head of your template to make use of them. +There are some places where you will encounter constant strings in your template code. +One is filter arguments, the other are normal string constants for tags. If you need to +translate those, you can use the ``_("....")`` syntax:: + + {% some_special_tag _("Page not found") value|yesno:_("yes,no") %} + +In this case both the filter and the tag will see the already translated string, so they +don't need to be aware of translations. And both strings will be pulled out of the templates +for translation and stored in the .po files. + The ``setlang`` redirect view -----------------------------