# HG changeset patch # User cmlenz # Date 1187219275 0 # Node ID 0d802a7e363002d097746853f34b7c741d7b0513 # Parent e4ec94fcb0c0b1d446eeb7826460630cd4304990 Handle starargs and dstarargs in the I18n extraction code. diff --git a/genshi/filters/i18n.py b/genshi/filters/i18n.py --- a/genshi/filters/i18n.py +++ b/genshi/filters/i18n.py @@ -405,12 +405,15 @@ if isinstance(node, ast.CallFunc) and isinstance(node.node, ast.Name) \ and node.node.name in gettext_functions: strings = [] - for arg in node.args: + def _add(arg): if isinstance(arg, ast.Const) \ and isinstance(arg.value, basestring): - strings.append(unicode(arg.value)) - elif not isinstance(arg, ast.Keyword): + strings.append(unicode(arg.value, 'utf-8')) + elif arg and not isinstance(arg, ast.Keyword): strings.append(None) + [_add(arg) for arg in node.args] + _add(node.star_args) + _add(node.dstar_args) if len(strings) == 1: strings = strings[0] else: 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 @@ -42,6 +42,24 @@ self.assertEqual((2, 'ngettext', (u'Singular', u'Plural', None)), messages[0]) + def test_extract_funky_plural_form(self): + tmpl = MarkupTemplate(""" + ${ngettext(len(items), *widget.display_names)} + """) + translator = Translator() + messages = list(translator.extract(tmpl.stream)) + self.assertEqual(1, len(messages)) + self.assertEqual((2, 'ngettext', (None, None)), messages[0]) + + def test_extract_gettext_with_unicode_string(self): + tmpl = MarkupTemplate(""" + ${gettext("Grüße")} + """) + translator = Translator() + messages = list(translator.extract(tmpl.stream)) + self.assertEqual(1, len(messages)) + self.assertEqual((2, 'gettext', u'Gr\xfc\xdfe'), messages[0]) + def test_extract_included_attribute_text(self): tmpl = MarkupTemplate("""