# HG changeset patch
# User cmlenz
# Date 1179736208 0
# Node ID fb66fb3e4b492ed5afe640f85046ab53386f5a88
# Parent 5cc92db755c540bd4eed36dca3595b7af07e1e0c
Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
diff --git a/genshi/filters/i18n.py b/genshi/filters/i18n.py
--- a/genshi/filters/i18n.py
+++ b/genshi/filters/i18n.py
@@ -149,7 +149,7 @@
yield kind, (tag, attrs), pos
- elif kind is TEXT:
+ elif search_text and kind is TEXT:
text = data.strip()
if text:
data = data.replace(text, translate(text))
@@ -166,7 +166,8 @@
GETTEXT_FUNCTIONS = ('_', 'gettext', 'ngettext', 'dgettext', 'dngettext',
'ugettext', 'ungettext')
- def extract(self, stream, gettext_functions=GETTEXT_FUNCTIONS):
+ def extract(self, stream, gettext_functions=GETTEXT_FUNCTIONS,
+ search_text=True):
"""Extract localizable strings from the given template stream.
For every string found, this function yields a ``(lineno, function,
@@ -203,6 +204,8 @@
:param gettext_functions: a sequence of function names that should be
treated as gettext-style localization
functions
+ :param search_text: whether the content of text nodes should be
+ extracted (used internally)
:note: Changed in 0.4.1: For a function with multiple string arguments
(such as ``ngettext``), a single item with a tuple of strings is
@@ -237,10 +240,11 @@
yield pos[1], None, text
else:
for lineno, funcname, text in self.extract(
- _ensure(value), gettext_functions):
+ _ensure(value), gettext_functions,
+ search_text=name in self.include_attrs):
yield lineno, funcname, text
- elif kind is TEXT:
+ elif search_text and kind is TEXT:
text = data.strip()
if text and filter(None, [ch.isalpha() for ch in text]):
yield pos[1], None, text
diff --git a/genshi/filters/tests/i18n.py b/genshi/filters/tests/i18n.py
--- a/genshi/filters/tests/i18n.py
+++ b/genshi/filters/tests/i18n.py
@@ -12,17 +12,64 @@
# history and logs, available at http://genshi.edgewall.org/log/.
import doctest
+from StringIO import StringIO
import unittest
+from genshi.template import MarkupTemplate
from genshi.filters.i18n import Translator
class TranslatorTestCase(unittest.TestCase):
- pass
+
+ def test_extract_plural_form(self):
+ tmpl = MarkupTemplate("""
+ ${ngettext("Singular", "Plural", num)}
+ """)
+ translator = Translator()
+ messages = list(translator.extract(tmpl.stream))
+ self.assertEqual(1, len(messages))
+ self.assertEqual((2, 'ngettext', (u'Singular', u'Plural')), messages[0])
+
+ def test_extract_included_attribute_text(self):
+ tmpl = MarkupTemplate("""
+
+ """)
+ translator = Translator()
+ messages = list(translator.extract(tmpl.stream))
+ self.assertEqual(1, len(messages))
+ self.assertEqual((2, None, u'Foo'), messages[0])
+
+ def test_extract_attribute_expr(self):
+ tmpl = MarkupTemplate("""
+
+ """)
+ translator = Translator()
+ messages = list(translator.extract(tmpl.stream))
+ self.assertEqual(1, len(messages))
+ self.assertEqual((2, '_', u'Save'), messages[0])
+
+ def test_extract_non_included_attribute_interpolated(self):
+ tmpl = MarkupTemplate("""
+ Foo
+ """)
+ translator = Translator()
+ messages = list(translator.extract(tmpl.stream))
+ self.assertEqual(1, len(messages))
+ self.assertEqual((2, None, u'Foo'), messages[0])
+
+ def test_extract_text_from_sub(self):
+ tmpl = MarkupTemplate("""
+ Foo
+ """)
+ translator = Translator()
+ messages = list(translator.extract(tmpl.stream))
+ self.assertEqual(1, len(messages))
+ self.assertEqual((2, None, u'Foo'), messages[0])
def suite():
suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TranslatorTestCase, 'test'))
suite.addTests(doctest.DocTestSuite(Translator.__module__))
return suite