Code

Ticket #5972: trans_understands_filter_alternate_version.4.diff

File trans_understands_filter_alternate_version.4.diff, 3.0 KB (added by Dmitri Fedortchenko <zeraien@…>, 7 years ago)

Fixes the backwards compatiblity issue and knocks out an inconsistency in the FilterExpression parser at the same time.

Line 
1Index: django/templatetags/i18n.py
2===================================================================
3--- django/templatetags/i18n.py (revision 6693)
4+++ django/templatetags/i18n.py (working copy)
5@@ -34,16 +34,17 @@
6         return ''
7 
8 class TranslateNode(Node):
9-    def __init__(self, value, noop):
10-        self.value = Variable(value)
11+    def __init__(self, filter_expression, noop):
12+        self.filter_expression = filter_expression
13         self.noop = noop
14 
15     def render(self, context):
16-        value = self.value.resolve(context)
17-        if self.noop:
18-            return value
19-        else:
20-            return translation.ugettext(value)
21+               
22+        if not self.noop:
23+            translated = translation.ugettext(self.filter_expression.var.resolve(context))
24+            self.filter_expression.var = Variable('"'+translated+'"')
25+        # Filters are applied here
26+        return self.filter_expression.resolve(context)
27 
28 class BlockTranslateNode(Node):
29     def __init__(self, extra_context, singular, plural=None, countervar=None,
30@@ -171,6 +174,20 @@
31     class TranslateParser(TokenParser):
32         def top(self):
33             value = self.value()
34+
35+            # Backwards Compatiblity fix:
36+            # FilterExpression does not support single-quoted strings,
37+            # so we make a cheap localized fix in order to maintain
38+            # backwards compatibility with existing uses of ``trans``
39+            # where single quote use is supported.
40+            if value[0] == "'":
41+                pos = None
42+                m = re.match("^'([^']+)'(\|.*$)",value)
43+                if m:
44+                    value = '"%s"%s' % (m.group(1).replace('"','\\"'),m.group(2))
45+                elif value[-1] == "'":
46+                    value = '"%s"' % value[1:-1].replace('"','\\"')
47+                   
48             if self.more():
49                 if self.tag() == 'noop':
50                     noop = True
51@@ -180,7 +197,7 @@
52                 noop = False
53             return (value, noop)
54     value, noop = TranslateParser(token.contents).top()
55-    return TranslateNode(value, noop)
56+    return TranslateNode(parser.compile_filter(value), noop)
57 
58 def do_block_translate(parser, token):
59     """
60Index: django/template/__init__.py
61===================================================================
62--- django/template/__init__.py (revision 6693)
63+++ django/template/__init__.py (working copy)
64@@ -547,9 +557,9 @@
65             if var == None:
66                 var, constant, i18n_constant = match.group("var", "constant", "i18n_constant")
67                 if i18n_constant:
68-                    var = '"%s"' %  _(i18n_constant)
69+                    var = "'%s'" % _(i18n_constant.replace(r'\"', '"'))
70                 elif constant:
71-                    var = '"%s"' % constant
72+                    var = "'%s'" % constant.replace(r'\"', '"')
73                 upto = match.end()
74                 if var == None:
75                     raise TemplateSyntaxError, "Could not find variable at start of %s" % token