comparison genshi/filters/tests/i18n.py @ 858:df860bdad9ca

Yet more 2to3 diff size reduction.
author cmlenz
date Thu, 12 Nov 2009 16:23:53 +0000
parents 47297fd93363
children 38c44e2f4232
comparison
equal deleted inserted replaced
857:24733a5854d9 858:df860bdad9ca
86 ${ngettext("Singular", "Plural", num)} 86 ${ngettext("Singular", "Plural", num)}
87 </html>""") 87 </html>""")
88 translator = Translator(extract_text=False) 88 translator = Translator(extract_text=False)
89 messages = list(translator.extract(tmpl.stream)) 89 messages = list(translator.extract(tmpl.stream))
90 self.assertEqual(1, len(messages)) 90 self.assertEqual(1, len(messages))
91 self.assertEqual((3, 'ngettext', (u'Singular', u'Plural', None), []), 91 self.assertEqual((3, 'ngettext', ('Singular', 'Plural', None), []),
92 messages[0]) 92 messages[0])
93 93
94 def test_extract_plural_form(self): 94 def test_extract_plural_form(self):
95 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> 95 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
96 ${ngettext("Singular", "Plural", num)} 96 ${ngettext("Singular", "Plural", num)}
97 </html>""") 97 </html>""")
98 translator = Translator() 98 translator = Translator()
99 messages = list(translator.extract(tmpl.stream)) 99 messages = list(translator.extract(tmpl.stream))
100 self.assertEqual(1, len(messages)) 100 self.assertEqual(1, len(messages))
101 self.assertEqual((2, 'ngettext', (u'Singular', u'Plural', None), []), 101 self.assertEqual((2, 'ngettext', ('Singular', 'Plural', None), []),
102 messages[0]) 102 messages[0])
103 103
104 def test_extract_funky_plural_form(self): 104 def test_extract_funky_plural_form(self):
105 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> 105 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
106 ${ngettext(len(items), *widget.display_names)} 106 ${ngettext(len(items), *widget.display_names)}
124 <span title="Foo"></span> 124 <span title="Foo"></span>
125 </html>""") 125 </html>""")
126 translator = Translator() 126 translator = Translator()
127 messages = list(translator.extract(tmpl.stream)) 127 messages = list(translator.extract(tmpl.stream))
128 self.assertEqual(1, len(messages)) 128 self.assertEqual(1, len(messages))
129 self.assertEqual((2, None, u'Foo', []), messages[0]) 129 self.assertEqual((2, None, 'Foo', []), messages[0])
130 130
131 def test_extract_attribute_expr(self): 131 def test_extract_attribute_expr(self):
132 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> 132 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
133 <input type="submit" value="${_('Save')}" /> 133 <input type="submit" value="${_('Save')}" />
134 </html>""") 134 </html>""")
135 translator = Translator() 135 translator = Translator()
136 messages = list(translator.extract(tmpl.stream)) 136 messages = list(translator.extract(tmpl.stream))
137 self.assertEqual(1, len(messages)) 137 self.assertEqual(1, len(messages))
138 self.assertEqual((2, '_', u'Save', []), messages[0]) 138 self.assertEqual((2, '_', 'Save', []), messages[0])
139 139
140 def test_extract_non_included_attribute_interpolated(self): 140 def test_extract_non_included_attribute_interpolated(self):
141 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> 141 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
142 <a href="#anchor_${num}">Foo</a> 142 <a href="#anchor_${num}">Foo</a>
143 </html>""") 143 </html>""")
144 translator = Translator() 144 translator = Translator()
145 messages = list(translator.extract(tmpl.stream)) 145 messages = list(translator.extract(tmpl.stream))
146 self.assertEqual(1, len(messages)) 146 self.assertEqual(1, len(messages))
147 self.assertEqual((2, None, u'Foo', []), messages[0]) 147 self.assertEqual((2, None, 'Foo', []), messages[0])
148 148
149 def test_extract_text_from_sub(self): 149 def test_extract_text_from_sub(self):
150 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> 150 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
151 <py:if test="foo">Foo</py:if> 151 <py:if test="foo">Foo</py:if>
152 </html>""") 152 </html>""")
153 translator = Translator() 153 translator = Translator()
154 messages = list(translator.extract(tmpl.stream)) 154 messages = list(translator.extract(tmpl.stream))
155 self.assertEqual(1, len(messages)) 155 self.assertEqual(1, len(messages))
156 self.assertEqual((2, None, u'Foo', []), messages[0]) 156 self.assertEqual((2, None, 'Foo', []), messages[0])
157 157
158 def test_ignore_tag_with_fixed_xml_lang(self): 158 def test_ignore_tag_with_fixed_xml_lang(self):
159 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> 159 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
160 <p xml:lang="en">(c) 2007 Edgewall Software</p> 160 <p xml:lang="en">(c) 2007 Edgewall Software</p>
161 </html>""") 161 </html>""")
168 <p xml:lang="${lang}">(c) 2007 Edgewall Software</p> 168 <p xml:lang="${lang}">(c) 2007 Edgewall Software</p>
169 </html>""") 169 </html>""")
170 translator = Translator() 170 translator = Translator()
171 messages = list(translator.extract(tmpl.stream)) 171 messages = list(translator.extract(tmpl.stream))
172 self.assertEqual(1, len(messages)) 172 self.assertEqual(1, len(messages))
173 self.assertEqual((2, None, u'(c) 2007 Edgewall Software', []), 173 self.assertEqual((2, None, '(c) 2007 Edgewall Software', []),
174 messages[0]) 174 messages[0])
175 175
176 def test_ignore_attribute_with_expression(self): 176 def test_ignore_attribute_with_expression(self):
177 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"> 177 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
178 <input type="submit" value="Reply" title="Reply to comment $num" /> 178 <input type="submit" value="Reply" title="Reply to comment $num" />
466 </html>""") 466 </html>""")
467 translator = Translator() 467 translator = Translator()
468 tmpl.add_directives(Translator.NAMESPACE, translator) 468 tmpl.add_directives(Translator.NAMESPACE, translator)
469 messages = list(translator.extract(tmpl.stream)) 469 messages = list(translator.extract(tmpl.stream))
470 self.assertEqual(1, len(messages)) 470 self.assertEqual(1, len(messages))
471 self.assertEqual((3, None, u'Foo', ['As in foo bar']), messages[0]) 471 self.assertEqual((3, None, 'Foo', ['As in foo bar']), messages[0])
472 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 472 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
473 xmlns:i18n="http://genshi.edgewall.org/i18n"> 473 xmlns:i18n="http://genshi.edgewall.org/i18n">
474 <p i18n:msg="" i18n:comment="As in foo bar">Foo</p> 474 <p i18n:msg="" i18n:comment="As in foo bar">Foo</p>
475 </html>""") 475 </html>""")
476 translator = Translator() 476 translator = Translator()
477 tmpl.add_directives(Translator.NAMESPACE, translator) 477 tmpl.add_directives(Translator.NAMESPACE, translator)
478 messages = list(translator.extract(tmpl.stream)) 478 messages = list(translator.extract(tmpl.stream))
479 self.assertEqual(1, len(messages)) 479 self.assertEqual(1, len(messages))
480 self.assertEqual((3, None, u'Foo', ['As in foo bar']), messages[0]) 480 self.assertEqual((3, None, 'Foo', ['As in foo bar']), messages[0])
481 481
482 def test_translate_i18n_msg_with_comment(self): 482 def test_translate_i18n_msg_with_comment(self):
483 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 483 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
484 xmlns:i18n="http://genshi.edgewall.org/i18n"> 484 xmlns:i18n="http://genshi.edgewall.org/i18n">
485 <p i18n:msg="" i18n:comment="As in foo bar">Foo</p> 485 <p i18n:msg="" i18n:comment="As in foo bar">Foo</p>
497 <p i18n:msg="" title="Foo bar">Foo</p> 497 <p i18n:msg="" title="Foo bar">Foo</p>
498 </html>""") 498 </html>""")
499 translator = Translator() 499 translator = Translator()
500 messages = list(translator.extract(tmpl.stream)) 500 messages = list(translator.extract(tmpl.stream))
501 self.assertEqual(2, len(messages)) 501 self.assertEqual(2, len(messages))
502 self.assertEqual((3, None, u'Foo bar', []), messages[0]) 502 self.assertEqual((3, None, 'Foo bar', []), messages[0])
503 self.assertEqual((3, None, u'Foo', []), messages[1]) 503 self.assertEqual((3, None, 'Foo', []), messages[1])
504 504
505 def test_translate_i18n_msg_with_attr(self): 505 def test_translate_i18n_msg_with_attr(self):
506 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 506 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
507 xmlns:i18n="http://genshi.edgewall.org/i18n"> 507 xmlns:i18n="http://genshi.edgewall.org/i18n">
508 <p i18n:msg="" title="Foo bar">Foo</p> 508 <p i18n:msg="" title="Foo bar">Foo</p>
509 </html>""") 509 </html>""")
510 gettext = lambda s: u"Voh" 510 gettext = lambda s: u"Voh"
511 translator = Translator(DummyTranslations({ 511 translator = Translator(DummyTranslations({
512 'Foo': u'Voh', 512 'Foo': 'Voh',
513 'Foo bar': u'Voh bär' 513 'Foo bar': u'Voh bär'
514 })) 514 }))
515 tmpl.filters.insert(0, translator) 515 tmpl.filters.insert(0, translator)
516 tmpl.add_directives(Translator.NAMESPACE, translator) 516 tmpl.add_directives(Translator.NAMESPACE, translator)
517 self.assertEqual("""<html> 517 self.assertEqual("""<html>
552 translator = Translator() 552 translator = Translator()
553 tmpl.add_directives(Translator.NAMESPACE, translator) 553 tmpl.add_directives(Translator.NAMESPACE, translator)
554 messages = list(translator.extract(tmpl.stream)) 554 messages = list(translator.extract(tmpl.stream))
555 self.assertEqual(1, len(messages)) 555 self.assertEqual(1, len(messages))
556 self.assertEqual( 556 self.assertEqual(
557 (3, None, u'Changed %(date)s ago by %(author)s', []), messages[0] 557 (3, None, 'Changed %(date)s ago by %(author)s', []), messages[0]
558 ) 558 )
559 559
560 def test_i18n_msg_ticket_300_translate(self): 560 def test_i18n_msg_ticket_300_translate(self):
561 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 561 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
562 xmlns:i18n="http://genshi.edgewall.org/i18n"> 562 xmlns:i18n="http://genshi.edgewall.org/i18n">
563 <i18n:msg params="date, author"> 563 <i18n:msg params="date, author">
564 Changed ${ date } ago by ${ author } 564 Changed ${ date } ago by ${ author }
565 </i18n:msg> 565 </i18n:msg>
566 </html>""") 566 </html>""")
567 translations = DummyTranslations({ 567 translations = DummyTranslations({
568 u'Changed %(date)s ago by %(author)s': u'Modificado à %(date)s por %(author)s' 568 'Changed %(date)s ago by %(author)s': u'Modificado à %(date)s por %(author)s'
569 }) 569 })
570 translator = Translator(translations) 570 translator = Translator(translations)
571 translator.setup(tmpl) 571 translator.setup(tmpl)
572 self.assertEqual("""<html> 572 self.assertEqual("""<html>
573 Modificado à um dia por Pedro 573 Modificado à um dia por Pedro
617 translator = Translator() 617 translator = Translator()
618 translator.setup(tmpl) 618 translator.setup(tmpl)
619 messages = list(translator.extract(tmpl.stream)) 619 messages = list(translator.extract(tmpl.stream))
620 self.assertEqual(1, len(messages)) 620 self.assertEqual(1, len(messages))
621 self.assertEqual( 621 self.assertEqual(
622 u'Before you do that, though, please first try\n ' 622 'Before you do that, though, please first try\n '
623 u'[1:[2:searching]\n for similar issues], as it is ' 623 '[1:[2:searching]\n for similar issues], as it is '
624 u'quite likely that this problem\n has been reported ' 624 'quite likely that this problem\n has been reported '
625 u'before. For questions about installation\n and ' 625 'before. For questions about installation\n and '
626 u'configuration of Trac, please try the\n ' 626 'configuration of Trac, please try the\n '
627 u'[3:mailing list]\n instead of filing a ticket.', 627 '[3:mailing list]\n instead of filing a ticket.',
628 messages[0][2] 628 messages[0][2]
629 ) 629 )
630 630
631 def test_translate_i18n_msg_with_other_directives_nested(self): 631 def test_translate_i18n_msg_with_other_directives_nested(self):
632 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 632 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
639 <a href="${trac.homepage}wiki/MailingList">mailing list</a> 639 <a href="${trac.homepage}wiki/MailingList">mailing list</a>
640 instead of filing a ticket. 640 instead of filing a ticket.
641 </p> 641 </p>
642 </html>""") 642 </html>""")
643 translations = DummyTranslations({ 643 translations = DummyTranslations({
644 u'Before you do that, though, please first try\n ' 644 'Before you do that, though, please first try\n '
645 u'[1:[2:searching]\n for similar issues], as it is ' 645 '[1:[2:searching]\n for similar issues], as it is '
646 u'quite likely that this problem\n has been reported ' 646 'quite likely that this problem\n has been reported '
647 u'before. For questions about installation\n and ' 647 'before. For questions about installation\n and '
648 u'configuration of Trac, please try the\n ' 648 'configuration of Trac, please try the\n '
649 u'[3:mailing list]\n instead of filing a ticket.': 649 '[3:mailing list]\n instead of filing a ticket.':
650 u'Antes de o fazer, porém,\n ' 650 u'Antes de o fazer, porém,\n '
651 u'[1:por favor tente [2:procurar]\n por problemas semelhantes], uma vez que ' 651 u'[1:por favor tente [2:procurar]\n por problemas semelhantes], uma vez que '
652 u'é muito provável que este problema\n já tenha sido reportado ' 652 u'é muito provável que este problema\n já tenha sido reportado '
653 u'anteriormente. Para questões relativas à instalação\n e ' 653 u'anteriormente. Para questões relativas à instalação\n e '
654 u'configuração do Trac, por favor tente a\n ' 654 u'configuração do Trac, por favor tente a\n '
679 <code><a href="${ 'href.wiki(TracIni)' }">trac.ini</a></code> 679 <code><a href="${ 'href.wiki(TracIni)' }">trac.ini</a></code>
680 and cannot be edited on this page. 680 and cannot be edited on this page.
681 </p> 681 </p>
682 </html>""") 682 </html>""")
683 translations = DummyTranslations({ 683 translations = DummyTranslations({
684 u'[1:Note:] This repository is defined in\n ' 684 '[1:Note:] This repository is defined in\n '
685 u'[2:[3:trac.ini]]\n and cannot be edited on this page.': 685 '[2:[3:trac.ini]]\n and cannot be edited on this page.':
686 u'[1:Nota:] Este repositório está definido em \n ' 686 u'[1:Nota:] Este repositório está definido em \n '
687 u'[2:[3:trac.ini]]\n e não pode ser editado nesta página.', 687 u'[2:[3:trac.ini]]\n e não pode ser editado nesta página.',
688 }) 688 })
689 translator = Translator(translations) 689 translator = Translator(translations)
690 translator.setup(tmpl) 690 translator.setup(tmpl)
691 messages = list(translator.extract(tmpl.stream)) 691 messages = list(translator.extract(tmpl.stream))
692 self.assertEqual(1, len(messages)) 692 self.assertEqual(1, len(messages))
693 self.assertEqual( 693 self.assertEqual(
694 u'[1:Note:] This repository is defined in\n ' 694 '[1:Note:] This repository is defined in\n '
695 u'[2:[3:trac.ini]]\n and cannot be edited on this page.', 695 '[2:[3:trac.ini]]\n and cannot be edited on this page.',
696 messages[0][2] 696 messages[0][2]
697 ) 697 )
698 self.assertEqual("""<html> 698 self.assertEqual("""<html>
699 <p class="hint"><strong>Nota:</strong> Este repositório está definido em 699 <p class="hint"><strong>Nota:</strong> Este repositório está definido em
700 <code><a href="href.wiki(TracIni)">trac.ini</a></code> 700 <code><a href="href.wiki(TracIni)">trac.ini</a></code>
1001 </html>""") 1001 </html>""")
1002 translator = Translator() 1002 translator = Translator()
1003 tmpl.add_directives(Translator.NAMESPACE, translator) 1003 tmpl.add_directives(Translator.NAMESPACE, translator)
1004 messages = list(translator.extract(tmpl.stream)) 1004 messages = list(translator.extract(tmpl.stream))
1005 self.assertEqual(2, len(messages)) 1005 self.assertEqual(2, len(messages))
1006 self.assertEqual((3, 'ngettext', (u'FooBar', u'FooBars'), []), messages[0]) 1006 self.assertEqual((3, 'ngettext', ('FooBar', 'FooBars'), []), messages[0])
1007 self.assertEqual((7, 'ngettext', (u'FooBar', u'FooBars'), []), messages[1]) 1007 self.assertEqual((7, 'ngettext', ('FooBar', 'FooBars'), []), messages[1])
1008 1008
1009 def test_extract_i18n_choose_as_directive(self): 1009 def test_extract_i18n_choose_as_directive(self):
1010 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1010 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1011 xmlns:i18n="http://genshi.edgewall.org/i18n"> 1011 xmlns:i18n="http://genshi.edgewall.org/i18n">
1012 <i18n:choose numeral="two"> 1012 <i18n:choose numeral="two">
1020 </html>""") 1020 </html>""")
1021 translator = Translator() 1021 translator = Translator()
1022 tmpl.add_directives(Translator.NAMESPACE, translator) 1022 tmpl.add_directives(Translator.NAMESPACE, translator)
1023 messages = list(translator.extract(tmpl.stream)) 1023 messages = list(translator.extract(tmpl.stream))
1024 self.assertEqual(2, len(messages)) 1024 self.assertEqual(2, len(messages))
1025 self.assertEqual((3, 'ngettext', (u'FooBar', u'FooBars'), []), messages[0]) 1025 self.assertEqual((3, 'ngettext', ('FooBar', 'FooBars'), []), messages[0])
1026 self.assertEqual((7, 'ngettext', (u'FooBar', u'FooBars'), []), messages[1]) 1026 self.assertEqual((7, 'ngettext', ('FooBar', 'FooBars'), []), messages[1])
1027 1027
1028 def test_extract_i18n_choose_as_attribute_with_params(self): 1028 def test_extract_i18n_choose_as_attribute_with_params(self):
1029 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1029 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1030 xmlns:i18n="http://genshi.edgewall.org/i18n"> 1030 xmlns:i18n="http://genshi.edgewall.org/i18n">
1031 <div i18n:choose="two; fname, lname"> 1031 <div i18n:choose="two; fname, lname">
1035 </html>""") 1035 </html>""")
1036 translator = Translator() 1036 translator = Translator()
1037 tmpl.add_directives(Translator.NAMESPACE, translator) 1037 tmpl.add_directives(Translator.NAMESPACE, translator)
1038 messages = list(translator.extract(tmpl.stream)) 1038 messages = list(translator.extract(tmpl.stream))
1039 self.assertEqual(1, len(messages)) 1039 self.assertEqual(1, len(messages))
1040 self.assertEqual((3, 'ngettext', (u'Foo %(fname)s %(lname)s', 1040 self.assertEqual((3, 'ngettext', ('Foo %(fname)s %(lname)s',
1041 u'Foos %(fname)s %(lname)s'), []), 1041 'Foos %(fname)s %(lname)s'), []),
1042 messages[0]) 1042 messages[0])
1043 1043
1044 def test_extract_i18n_choose_as_attribute_with_params_and_domain_as_param(self): 1044 def test_extract_i18n_choose_as_attribute_with_params_and_domain_as_param(self):
1045 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1045 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1046 xmlns:i18n="http://genshi.edgewall.org/i18n" 1046 xmlns:i18n="http://genshi.edgewall.org/i18n"
1052 </html>""") 1052 </html>""")
1053 translator = Translator() 1053 translator = Translator()
1054 tmpl.add_directives(Translator.NAMESPACE, translator) 1054 tmpl.add_directives(Translator.NAMESPACE, translator)
1055 messages = list(translator.extract(tmpl.stream)) 1055 messages = list(translator.extract(tmpl.stream))
1056 self.assertEqual(1, len(messages)) 1056 self.assertEqual(1, len(messages))
1057 self.assertEqual((4, 'ngettext', (u'Foo %(fname)s %(lname)s', 1057 self.assertEqual((4, 'ngettext', ('Foo %(fname)s %(lname)s',
1058 u'Foos %(fname)s %(lname)s'), []), 1058 'Foos %(fname)s %(lname)s'), []),
1059 messages[0]) 1059 messages[0])
1060 1060
1061 def test_extract_i18n_choose_as_directive_with_params(self): 1061 def test_extract_i18n_choose_as_directive_with_params(self):
1062 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1062 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1063 xmlns:i18n="http://genshi.edgewall.org/i18n"> 1063 xmlns:i18n="http://genshi.edgewall.org/i18n">
1072 </html>""") 1072 </html>""")
1073 translator = Translator() 1073 translator = Translator()
1074 tmpl.add_directives(Translator.NAMESPACE, translator) 1074 tmpl.add_directives(Translator.NAMESPACE, translator)
1075 messages = list(translator.extract(tmpl.stream)) 1075 messages = list(translator.extract(tmpl.stream))
1076 self.assertEqual(2, len(messages)) 1076 self.assertEqual(2, len(messages))
1077 self.assertEqual((3, 'ngettext', (u'Foo %(fname)s %(lname)s', 1077 self.assertEqual((3, 'ngettext', ('Foo %(fname)s %(lname)s',
1078 u'Foos %(fname)s %(lname)s'), []), 1078 'Foos %(fname)s %(lname)s'), []),
1079 messages[0]) 1079 messages[0])
1080 self.assertEqual((7, 'ngettext', (u'Foo %(fname)s %(lname)s', 1080 self.assertEqual((7, 'ngettext', ('Foo %(fname)s %(lname)s',
1081 u'Foos %(fname)s %(lname)s'), []), 1081 'Foos %(fname)s %(lname)s'), []),
1082 messages[1]) 1082 messages[1])
1083 1083
1084 def test_extract_i18n_choose_as_directive_with_params_and_domain_as_directive(self): 1084 def test_extract_i18n_choose_as_directive_with_params_and_domain_as_directive(self):
1085 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1085 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1086 xmlns:i18n="http://genshi.edgewall.org/i18n"> 1086 xmlns:i18n="http://genshi.edgewall.org/i18n">
1097 </html>""") 1097 </html>""")
1098 translator = Translator() 1098 translator = Translator()
1099 tmpl.add_directives(Translator.NAMESPACE, translator) 1099 tmpl.add_directives(Translator.NAMESPACE, translator)
1100 messages = list(translator.extract(tmpl.stream)) 1100 messages = list(translator.extract(tmpl.stream))
1101 self.assertEqual(2, len(messages)) 1101 self.assertEqual(2, len(messages))
1102 self.assertEqual((4, 'ngettext', (u'Foo %(fname)s %(lname)s', 1102 self.assertEqual((4, 'ngettext', ('Foo %(fname)s %(lname)s',
1103 u'Foos %(fname)s %(lname)s'), []), 1103 'Foos %(fname)s %(lname)s'), []),
1104 messages[0]) 1104 messages[0])
1105 self.assertEqual((9, 'ngettext', (u'Foo %(fname)s %(lname)s', 1105 self.assertEqual((9, 'ngettext', ('Foo %(fname)s %(lname)s',
1106 u'Foos %(fname)s %(lname)s'), []), 1106 'Foos %(fname)s %(lname)s'), []),
1107 messages[1]) 1107 messages[1])
1108 1108
1109 def test_extract_i18n_choose_as_attribute_with_params_and_comment(self): 1109 def test_extract_i18n_choose_as_attribute_with_params_and_comment(self):
1110 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1110 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1111 xmlns:i18n="http://genshi.edgewall.org/i18n"> 1111 xmlns:i18n="http://genshi.edgewall.org/i18n">
1116 </html>""") 1116 </html>""")
1117 translator = Translator() 1117 translator = Translator()
1118 tmpl.add_directives(Translator.NAMESPACE, translator) 1118 tmpl.add_directives(Translator.NAMESPACE, translator)
1119 messages = list(translator.extract(tmpl.stream)) 1119 messages = list(translator.extract(tmpl.stream))
1120 self.assertEqual(1, len(messages)) 1120 self.assertEqual(1, len(messages))
1121 self.assertEqual((3, 'ngettext', (u'Foo %(fname)s %(lname)s', 1121 self.assertEqual((3, 'ngettext', ('Foo %(fname)s %(lname)s',
1122 u'Foos %(fname)s %(lname)s'), 1122 'Foos %(fname)s %(lname)s'),
1123 [u'As in Foo Bar']), 1123 ['As in Foo Bar']),
1124 messages[0]) 1124 messages[0])
1125 1125
1126 def test_extract_i18n_choose_as_directive_with_params_and_comment(self): 1126 def test_extract_i18n_choose_as_directive_with_params_and_comment(self):
1127 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1127 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1128 xmlns:i18n="http://genshi.edgewall.org/i18n"> 1128 xmlns:i18n="http://genshi.edgewall.org/i18n">
1133 </html>""") 1133 </html>""")
1134 translator = Translator() 1134 translator = Translator()
1135 tmpl.add_directives(Translator.NAMESPACE, translator) 1135 tmpl.add_directives(Translator.NAMESPACE, translator)
1136 messages = list(translator.extract(tmpl.stream)) 1136 messages = list(translator.extract(tmpl.stream))
1137 self.assertEqual(1, len(messages)) 1137 self.assertEqual(1, len(messages))
1138 self.assertEqual((3, 'ngettext', (u'Foo %(fname)s %(lname)s', 1138 self.assertEqual((3, 'ngettext', ('Foo %(fname)s %(lname)s',
1139 u'Foos %(fname)s %(lname)s'), 1139 'Foos %(fname)s %(lname)s'),
1140 [u'As in Foo Bar']), 1140 ['As in Foo Bar']),
1141 messages[0]) 1141 messages[0])
1142 1142
1143 def test_translate_i18n_domain_with_nested_inlcudes(self): 1143 def test_translate_i18n_domain_with_nested_inlcudes(self):
1144 import os, shutil, tempfile 1144 import os, shutil, tempfile
1145 from genshi.template.loader import TemplateLoader 1145 from genshi.template.loader import TemplateLoader
1367 </html>""") 1367 </html>""")
1368 translator = Translator() 1368 translator = Translator()
1369 tmpl.add_directives(Translator.NAMESPACE, translator) 1369 tmpl.add_directives(Translator.NAMESPACE, translator)
1370 messages = list(translator.extract(tmpl.stream)) 1370 messages = list(translator.extract(tmpl.stream))
1371 self.assertEqual(1, len(messages)) 1371 self.assertEqual(1, len(messages))
1372 self.assertEqual((3, None, u'Please see [1:Help] for details.', []), 1372 self.assertEqual((3, None, 'Please see [1:Help] for details.', []),
1373 messages[0]) 1373 messages[0])
1374 1374
1375 def test_extract_i18n_msg_with_py_strip_and_comment(self): 1375 def test_extract_i18n_msg_with_py_strip_and_comment(self):
1376 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1376 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1377 xmlns:i18n="http://genshi.edgewall.org/i18n"> 1377 xmlns:i18n="http://genshi.edgewall.org/i18n">
1381 </html>""") 1381 </html>""")
1382 translator = Translator() 1382 translator = Translator()
1383 tmpl.add_directives(Translator.NAMESPACE, translator) 1383 tmpl.add_directives(Translator.NAMESPACE, translator)
1384 messages = list(translator.extract(tmpl.stream)) 1384 messages = list(translator.extract(tmpl.stream))
1385 self.assertEqual(1, len(messages)) 1385 self.assertEqual(1, len(messages))
1386 self.assertEqual((3, None, u'Please see [1:Help] for details.', 1386 self.assertEqual((3, None, 'Please see [1:Help] for details.',
1387 ['Foo']), messages[0]) 1387 ['Foo']), messages[0])
1388 1388
1389 def test_extract_i18n_choose_as_attribute_and_py_strip(self): 1389 def test_extract_i18n_choose_as_attribute_and_py_strip(self):
1390 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1390 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1391 xmlns:i18n="http://genshi.edgewall.org/i18n"> 1391 xmlns:i18n="http://genshi.edgewall.org/i18n">
1396 </html>""") 1396 </html>""")
1397 translator = Translator() 1397 translator = Translator()
1398 tmpl.add_directives(Translator.NAMESPACE, translator) 1398 tmpl.add_directives(Translator.NAMESPACE, translator)
1399 messages = list(translator.extract(tmpl.stream)) 1399 messages = list(translator.extract(tmpl.stream))
1400 self.assertEqual(1, len(messages)) 1400 self.assertEqual(1, len(messages))
1401 self.assertEqual((3, 'ngettext', (u'FooBar', u'FooBars'), []), messages[0]) 1401 self.assertEqual((3, 'ngettext', ('FooBar', 'FooBars'), []), messages[0])
1402 1402
1403 def test_translate_i18n_domain_with_inline_directive_on_START_NS(self): 1403 def test_translate_i18n_domain_with_inline_directive_on_START_NS(self):
1404 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" 1404 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
1405 xmlns:i18n="http://genshi.edgewall.org/i18n" i18n:domain="foo"> 1405 xmlns:i18n="http://genshi.edgewall.org/i18n" i18n:domain="foo">
1406 <p i18n:msg="">FooBar</p> 1406 <p i18n:msg="">FooBar</p>
1440 <p>${ngettext("You have %d item", "You have %d items", num)}</p> 1440 <p>${ngettext("You have %d item", "You have %d items", num)}</p>
1441 </body> 1441 </body>
1442 </html>""") 1442 </html>""")
1443 results = list(extract(buf, ['_', 'ngettext'], [], {})) 1443 results = list(extract(buf, ['_', 'ngettext'], [], {}))
1444 self.assertEqual([ 1444 self.assertEqual([
1445 (3, None, u'Example', []), 1445 (3, None, 'Example', []),
1446 (6, None, u'Example', []), 1446 (6, None, 'Example', []),
1447 (7, '_', u'Hello, %(name)s', []), 1447 (7, '_', 'Hello, %(name)s', []),
1448 (8, 'ngettext', (u'You have %d item', u'You have %d items', None), 1448 (8, 'ngettext', ('You have %d item', 'You have %d items', None),
1449 []), 1449 []),
1450 ], results) 1450 ], results)
1451 1451
1452 def test_extraction_without_text(self): 1452 def test_extraction_without_text(self):
1453 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/"> 1453 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
1456 </html>""") 1456 </html>""")
1457 results = list(extract(buf, ['_', 'ngettext'], [], { 1457 results = list(extract(buf, ['_', 'ngettext'], [], {
1458 'extract_text': 'no' 1458 'extract_text': 'no'
1459 })) 1459 }))
1460 self.assertEqual([ 1460 self.assertEqual([
1461 (3, 'ngettext', (u'Singular', u'Plural', None), []), 1461 (3, 'ngettext', ('Singular', 'Plural', None), []),
1462 ], results) 1462 ], results)
1463 1463
1464 def test_text_template_extraction(self): 1464 def test_text_template_extraction(self):
1465 buf = StringIO("""${_("Dear %(name)s") % {'name': name}}, 1465 buf = StringIO("""${_("Dear %(name)s") % {'name': name}},
1466 1466
1473 Foobar""") 1473 Foobar""")
1474 results = list(extract(buf, ['_', 'ngettext'], [], { 1474 results = list(extract(buf, ['_', 'ngettext'], [], {
1475 'template_class': 'genshi.template:TextTemplate' 1475 'template_class': 'genshi.template:TextTemplate'
1476 })) 1476 }))
1477 self.assertEqual([ 1477 self.assertEqual([
1478 (1, '_', u'Dear %(name)s', []), 1478 (1, '_', 'Dear %(name)s', []),
1479 (3, 'ngettext', (u'Your item:', u'Your items', None), []), 1479 (3, 'ngettext', ('Your item:', 'Your items', None), []),
1480 (7, None, u'All the best,\n Foobar', []) 1480 (7, None, 'All the best,\n Foobar', [])
1481 ], results) 1481 ], results)
1482 1482
1483 def test_extraction_with_keyword_arg(self): 1483 def test_extraction_with_keyword_arg(self):
1484 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/"> 1484 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
1485 ${gettext('Foobar', foo='bar')} 1485 ${gettext('Foobar', foo='bar')}
1486 </html>""") 1486 </html>""")
1487 results = list(extract(buf, ['gettext'], [], {})) 1487 results = list(extract(buf, ['gettext'], [], {}))
1488 self.assertEqual([ 1488 self.assertEqual([
1489 (2, 'gettext', (u'Foobar'), []), 1489 (2, 'gettext', ('Foobar'), []),
1490 ], results) 1490 ], results)
1491 1491
1492 def test_extraction_with_nonstring_arg(self): 1492 def test_extraction_with_nonstring_arg(self):
1493 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/"> 1493 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
1494 ${dgettext(curdomain, 'Foobar')} 1494 ${dgettext(curdomain, 'Foobar')}
1495 </html>""") 1495 </html>""")
1496 results = list(extract(buf, ['dgettext'], [], {})) 1496 results = list(extract(buf, ['dgettext'], [], {}))
1497 self.assertEqual([ 1497 self.assertEqual([
1498 (2, 'dgettext', (None, u'Foobar'), []), 1498 (2, 'dgettext', (None, 'Foobar'), []),
1499 ], results) 1499 ], results)
1500 1500
1501 def test_extraction_inside_ignored_tags(self): 1501 def test_extraction_inside_ignored_tags(self):
1502 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/"> 1502 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
1503 <script type="text/javascript"> 1503 <script type="text/javascript">
1507 }); 1507 });
1508 </script> 1508 </script>
1509 </html>""") 1509 </html>""")
1510 results = list(extract(buf, ['_'], [], {})) 1510 results = list(extract(buf, ['_'], [], {}))
1511 self.assertEqual([ 1511 self.assertEqual([
1512 (5, '_', u'Please wait...', []), 1512 (5, '_', 'Please wait...', []),
1513 ], results) 1513 ], results)
1514 1514
1515 def test_extraction_inside_ignored_tags_with_directives(self): 1515 def test_extraction_inside_ignored_tags_with_directives(self):
1516 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/"> 1516 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
1517 <script type="text/javascript"> 1517 <script type="text/javascript">
1563 translator = Translator() 1563 translator = Translator()
1564 tmpl.add_directives(Translator.NAMESPACE, translator) 1564 tmpl.add_directives(Translator.NAMESPACE, translator)
1565 messages = list(translator.extract(tmpl.stream)) 1565 messages = list(translator.extract(tmpl.stream))
1566 self.assertEqual(10, len(messages)) 1566 self.assertEqual(10, len(messages))
1567 self.assertEqual([ 1567 self.assertEqual([
1568 (3, None, u'View differences', []), 1568 (3, None, 'View differences', []),
1569 (6, None, u'inline', []), 1569 (6, None, 'inline', []),
1570 (8, None, u'side by side', []), 1570 (8, None, 'side by side', []),
1571 (10, None, u'Show', []), 1571 (10, None, 'Show', []),
1572 (13, None, u'lines around each change', []), 1572 (13, None, 'lines around each change', []),
1573 (16, None, u'Ignore:', []), 1573 (16, None, 'Ignore:', []),
1574 (20, None, u'Blank lines', []), 1574 (20, None, 'Blank lines', []),
1575 (25, None, u'Case changes',[]), 1575 (25, None, 'Case changes',[]),
1576 (30, None, u'White space changes', []), 1576 (30, None, 'White space changes', []),
1577 (34, '_', u'Update', [])], messages) 1577 (34, '_', 'Update', [])], messages)
1578 1578
1579 1579
1580 def suite(): 1580 def suite():
1581 suite = unittest.TestSuite() 1581 suite = unittest.TestSuite()
1582 suite.addTest(doctest.DocTestSuite(Translator.__module__)) 1582 suite.addTest(doctest.DocTestSuite(Translator.__module__))
Copyright (C) 2012-2017 Edgewall Software