Mercurial > genshi > genshi-test
comparison genshi/filters/tests/i18n.py @ 894:6fe4feb2635b
Split up the i18n unit tests into per-directive test cases.
author | cmlenz |
---|---|
date | Wed, 21 Apr 2010 11:56:44 +0000 |
parents | bf76a0fe20ae |
children | 85e4678337cf |
comparison
equal
deleted
inserted
replaced
893:bf76a0fe20ae | 894:6fe4feb2635b |
---|---|
179 </html>""") | 179 </html>""") |
180 translator = Translator() | 180 translator = Translator() |
181 messages = list(translator.extract(tmpl.stream)) | 181 messages = list(translator.extract(tmpl.stream)) |
182 self.assertEqual(0, len(messages)) | 182 self.assertEqual(0, len(messages)) |
183 | 183 |
184 def test_translate_with_translations_object(self): | |
185 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
186 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
187 <p i18n:msg="" i18n:comment="As in foo bar">Foo</p> | |
188 </html>""") | |
189 translator = Translator(DummyTranslations({'Foo': 'Voh'})) | |
190 translator.setup(tmpl) | |
191 self.assertEqual("""<html> | |
192 <p>Voh</p> | |
193 </html>""", tmpl.generate().render()) | |
194 | |
195 | |
196 class MsgDirectiveTestCase(unittest.TestCase): | |
197 | |
184 def test_extract_i18n_msg(self): | 198 def test_extract_i18n_msg(self): |
185 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | 199 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
186 xmlns:i18n="http://genshi.edgewall.org/i18n"> | 200 xmlns:i18n="http://genshi.edgewall.org/i18n"> |
187 <p i18n:msg=""> | 201 <p i18n:msg=""> |
188 Please see <a href="help.html">Help</a> for details. | 202 Please see <a href="help.html">Help</a> for details. |
662 })) | 676 })) |
663 tmpl.filters.insert(0, translator) | 677 tmpl.filters.insert(0, translator) |
664 tmpl.add_directives(Translator.NAMESPACE, translator) | 678 tmpl.add_directives(Translator.NAMESPACE, translator) |
665 self.assertEqual("""<html> | 679 self.assertEqual("""<html> |
666 <p title="Voh bär">Voh</p> | 680 <p title="Voh bär">Voh</p> |
667 </html>""", tmpl.generate().render()) | |
668 | |
669 def test_translate_with_translations_object(self): | |
670 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
671 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
672 <p i18n:msg="" i18n:comment="As in foo bar">Foo</p> | |
673 </html>""") | |
674 translator = Translator(DummyTranslations({'Foo': 'Voh'})) | |
675 translator.setup(tmpl) | |
676 self.assertEqual("""<html> | |
677 <p>Voh</p> | |
678 </html>""", tmpl.generate().render()) | 681 </html>""", tmpl.generate().render()) |
679 | 682 |
680 def test_translate_i18n_msg_and_py_strip_directives(self): | 683 def test_translate_i18n_msg_and_py_strip_directives(self): |
681 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | 684 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
682 xmlns:i18n="http://genshi.edgewall.org/i18n"> | 685 xmlns:i18n="http://genshi.edgewall.org/i18n"> |
847 <p class="hint"><strong>Nota:</strong> Este repositório está definido em | 850 <p class="hint"><strong>Nota:</strong> Este repositório está definido em |
848 <code><a href="href.wiki(TracIni)">trac.ini</a></code> | 851 <code><a href="href.wiki(TracIni)">trac.ini</a></code> |
849 e não pode ser editado nesta página.</p> | 852 e não pode ser editado nesta página.</p> |
850 </html>""", tmpl.generate(editable=False).render()) | 853 </html>""", tmpl.generate(editable=False).render()) |
851 | 854 |
852 def test_translate_i18n_domain_with_msg_directives(self): | 855 def test_extract_i18n_msg_with_py_strip(self): |
853 #"""translate with i18n:domain and nested i18n:msg directives """ | 856 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
854 | 857 xmlns:i18n="http://genshi.edgewall.org/i18n"> |
855 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | 858 <p i18n:msg="" py:strip=""> |
856 xmlns:i18n="http://genshi.edgewall.org/i18n"> | 859 Please see <a href="help.html">Help</a> for details. |
857 <div i18n:domain="foo"> | 860 </p> |
858 <p i18n:msg="">FooBar</p> | 861 </html>""") |
859 <p i18n:msg="">Bar</p> | 862 translator = Translator() |
860 </div> | 863 tmpl.add_directives(Translator.NAMESPACE, translator) |
861 </html>""") | 864 messages = list(translator.extract(tmpl.stream)) |
862 translations = DummyTranslations({'Bar': 'Voh'}) | 865 self.assertEqual(1, len(messages)) |
863 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) | 866 self.assertEqual((3, None, 'Please see [1:Help] for details.', []), |
864 translator = Translator(translations) | 867 messages[0]) |
865 translator.setup(tmpl) | 868 |
866 self.assertEqual("""<html> | 869 def test_extract_i18n_msg_with_py_strip_and_comment(self): |
867 <div> | 870 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
868 <p>BarFoo</p> | 871 xmlns:i18n="http://genshi.edgewall.org/i18n"> |
869 <p>PT_Foo</p> | 872 <p i18n:msg="" py:strip="" i18n:comment="Foo"> |
870 </div> | 873 Please see <a href="help.html">Help</a> for details. |
871 </html>""", tmpl.generate().render()) | 874 </p> |
872 | 875 </html>""") |
873 def test_translate_i18n_domain_with_inline_directives(self): | 876 translator = Translator() |
874 #"""translate with inlined i18n:domain and i18n:msg directives""" | 877 tmpl.add_directives(Translator.NAMESPACE, translator) |
875 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | 878 messages = list(translator.extract(tmpl.stream)) |
876 xmlns:i18n="http://genshi.edgewall.org/i18n"> | 879 self.assertEqual(1, len(messages)) |
877 <p i18n:msg="" i18n:domain="foo">FooBar</p> | 880 self.assertEqual((3, None, 'Please see [1:Help] for details.', |
878 </html>""") | 881 ['Foo']), messages[0]) |
879 translations = DummyTranslations({'Bar': 'Voh'}) | 882 |
880 translations.add_domain('foo', {'FooBar': 'BarFoo'}) | 883 def test_translate_i18n_msg_and_comment_with_py_strip_directives(self): |
881 translator = Translator(translations) | 884 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
882 translator.setup(tmpl) | 885 xmlns:i18n="http://genshi.edgewall.org/i18n"> |
883 self.assertEqual("""<html> | 886 <p i18n:msg="" i18n:comment="As in foo bar" py:strip="">Foo</p> |
884 <p>BarFoo</p> | 887 <p py:strip="" i18n:msg="" i18n:comment="As in foo bar">Foo</p> |
885 </html>""", tmpl.generate().render()) | 888 </html>""") |
886 | 889 translator = Translator(DummyTranslations({'Foo': 'Voh'})) |
887 def test_translate_i18n_domain_without_msg_directives(self): | 890 translator.setup(tmpl) |
888 #"""translate domain call without i18n:msg directives still uses current domain""" | 891 self.assertEqual("""<html> |
889 | 892 Voh |
890 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | 893 Voh |
891 xmlns:i18n="http://genshi.edgewall.org/i18n"> | 894 </html>""", tmpl.generate().render()) |
892 <p i18n:msg="">Bar</p> | 895 |
893 <div i18n:domain="foo"> | 896 |
894 <p i18n:msg="">FooBar</p> | 897 class ChooseDirectiveTestCase(unittest.TestCase): |
895 <p i18n:msg="">Bar</p> | |
896 <p>Bar</p> | |
897 </div> | |
898 <p>Bar</p> | |
899 </html>""") | |
900 translations = DummyTranslations({'Bar': 'Voh'}) | |
901 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) | |
902 translator = Translator(translations) | |
903 translator.setup(tmpl) | |
904 self.assertEqual("""<html> | |
905 <p>Voh</p> | |
906 <div> | |
907 <p>BarFoo</p> | |
908 <p>PT_Foo</p> | |
909 <p>PT_Foo</p> | |
910 </div> | |
911 <p>Voh</p> | |
912 </html>""", tmpl.generate().render()) | |
913 | |
914 def test_translate_i18n_domain_as_directive_not_attribute(self): | |
915 #"""translate with domain as directive""" | |
916 | |
917 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
918 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
919 <i18n:domain name="foo"> | |
920 <p i18n:msg="">FooBar</p> | |
921 <p i18n:msg="">Bar</p> | |
922 <p>Bar</p> | |
923 </i18n:domain> | |
924 <p>Bar</p> | |
925 </html>""") | |
926 translations = DummyTranslations({'Bar': 'Voh'}) | |
927 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) | |
928 translator = Translator(translations) | |
929 translator.setup(tmpl) | |
930 self.assertEqual("""<html> | |
931 <p>BarFoo</p> | |
932 <p>PT_Foo</p> | |
933 <p>PT_Foo</p> | |
934 <p>Voh</p> | |
935 </html>""", tmpl.generate().render()) | |
936 | |
937 def test_translate_i18n_domain_nested_directives(self): | |
938 #"""translate with nested i18n:domain directives""" | |
939 | |
940 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
941 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
942 <p i18n:msg="">Bar</p> | |
943 <div i18n:domain="foo"> | |
944 <p i18n:msg="">FooBar</p> | |
945 <p i18n:domain="bar" i18n:msg="">Bar</p> | |
946 <p>Bar</p> | |
947 </div> | |
948 <p>Bar</p> | |
949 </html>""") | |
950 translations = DummyTranslations({'Bar': 'Voh'}) | |
951 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'foo_Bar'}) | |
952 translations.add_domain('bar', {'Bar': 'bar_Bar'}) | |
953 translator = Translator(translations) | |
954 translator.setup(tmpl) | |
955 self.assertEqual("""<html> | |
956 <p>Voh</p> | |
957 <div> | |
958 <p>BarFoo</p> | |
959 <p>bar_Bar</p> | |
960 <p>foo_Bar</p> | |
961 </div> | |
962 <p>Voh</p> | |
963 </html>""", tmpl.generate().render()) | |
964 | |
965 def test_translate_i18n_domain_with_empty_nested_domain_directive(self): | |
966 #"""translate with empty nested i18n:domain directive does not use dngettext""" | |
967 | |
968 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
969 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
970 <p i18n:msg="">Bar</p> | |
971 <div i18n:domain="foo"> | |
972 <p i18n:msg="">FooBar</p> | |
973 <p i18n:domain="" i18n:msg="">Bar</p> | |
974 <p>Bar</p> | |
975 </div> | |
976 <p>Bar</p> | |
977 </html>""") | |
978 translations = DummyTranslations({'Bar': 'Voh'}) | |
979 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'foo_Bar'}) | |
980 translations.add_domain('bar', {'Bar': 'bar_Bar'}) | |
981 translator = Translator(translations) | |
982 translator.setup(tmpl) | |
983 self.assertEqual("""<html> | |
984 <p>Voh</p> | |
985 <div> | |
986 <p>BarFoo</p> | |
987 <p>Voh</p> | |
988 <p>foo_Bar</p> | |
989 </div> | |
990 <p>Voh</p> | |
991 </html>""", tmpl.generate().render()) | |
992 | 898 |
993 def test_translate_i18n_choose_as_attribute(self): | 899 def test_translate_i18n_choose_as_attribute(self): |
994 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | 900 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
995 xmlns:i18n="http://genshi.edgewall.org/i18n"> | 901 xmlns:i18n="http://genshi.edgewall.org/i18n"> |
996 <div i18n:choose="one"> | 902 <div i18n:choose="one"> |
1366 self.assertEqual( | 1272 self.assertEqual( |
1367 (3, 'ngettext', ('There is [1:%(num)s thing].', | 1273 (3, 'ngettext', ('There is [1:%(num)s thing].', |
1368 'There are [1:%(num)s things].'), []), | 1274 'There are [1:%(num)s things].'), []), |
1369 messages[3]) | 1275 messages[3]) |
1370 | 1276 |
1371 def test_translate_i18n_msg_with_attributes(self): | 1277 def test_translate_i18n_choose_with_attributes(self): |
1372 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | 1278 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
1373 xmlns:i18n="http://genshi.edgewall.org/i18n"> | 1279 xmlns:i18n="http://genshi.edgewall.org/i18n"> |
1374 <p i18n:choose="num; num" title="Things"> | 1280 <p i18n:choose="num; num" title="Things"> |
1375 <i18n:singular> | 1281 <i18n:singular> |
1376 There is <a href="$link" title="View thing">${num} thing</a>. | 1282 There is <a href="$link" title="View thing">${num} thing</a>. |
1423 self.assertEqual( | 1329 self.assertEqual( |
1424 (3, 'ngettext', ('There is [1:%(num)s thing].', | 1330 (3, 'ngettext', ('There is [1:%(num)s thing].', |
1425 'There are [1:%(num)s things].'), []), | 1331 'There are [1:%(num)s things].'), []), |
1426 messages[4]) | 1332 messages[4]) |
1427 | 1333 |
1428 def test_translate_i18n_msg_as_element_with_attributes(self): | 1334 def test_translate_i18n_choose_as_element_with_attributes(self): |
1429 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | 1335 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
1430 xmlns:i18n="http://genshi.edgewall.org/i18n"> | 1336 xmlns:i18n="http://genshi.edgewall.org/i18n"> |
1431 <i18n:choose numeral="num" params="num"> | 1337 <i18n:choose numeral="num" params="num"> |
1432 <p i18n:singular="" title="Things"> | 1338 <p i18n:singular="" title="Things"> |
1433 There is <a href="$link" title="View thing">${num} thing</a>. | 1339 There is <a href="$link" title="View thing">${num} thing</a>. |
1451 </html>""", tmpl.generate(link="/things", num=1).render(encoding=None)) | 1357 </html>""", tmpl.generate(link="/things", num=1).render(encoding=None)) |
1452 self.assertEqual(u"""<html> | 1358 self.assertEqual(u"""<html> |
1453 <p title="Sachen">Da sind <a href="/things" title="Sachen betrachten">3 Sachen</a>.</p> | 1359 <p title="Sachen">Da sind <a href="/things" title="Sachen betrachten">3 Sachen</a>.</p> |
1454 </html>""", tmpl.generate(link="/things", num=3).render(encoding=None)) | 1360 </html>""", tmpl.generate(link="/things", num=3).render(encoding=None)) |
1455 | 1361 |
1456 def test_translate_i18n_domain_with_nested_inlcudes(self): | 1362 def test_translate_i18n_choose_and_py_strip(self): |
1363 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1364 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1365 <div i18n:choose="two; fname, lname"> | |
1366 <p i18n:singular="">Foo $fname $lname</p> | |
1367 <p i18n:plural="">Foos $fname $lname</p> | |
1368 </div> | |
1369 </html>""") | |
1370 translations = DummyTranslations({ | |
1371 ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', | |
1372 ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', | |
1373 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', | |
1374 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', | |
1375 }) | |
1376 translator = Translator(translations) | |
1377 translator.setup(tmpl) | |
1378 self.assertEqual("""<html> | |
1379 <div> | |
1380 <p>Vohs John Doe</p> | |
1381 </div> | |
1382 </html>""", tmpl.generate(two=2, fname='John', lname='Doe').render()) | |
1383 | |
1384 def test_translate_i18n_choose_and_domain_and_py_strip(self): | |
1385 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1386 xmlns:i18n="http://genshi.edgewall.org/i18n" | |
1387 i18n:domain="foo"> | |
1388 <div i18n:choose="two; fname, lname"> | |
1389 <p i18n:singular="">Foo $fname $lname</p> | |
1390 <p i18n:plural="">Foos $fname $lname</p> | |
1391 </div> | |
1392 </html>""") | |
1393 translations = DummyTranslations() | |
1394 translations.add_domain('foo', { | |
1395 ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', | |
1396 ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', | |
1397 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', | |
1398 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', | |
1399 }) | |
1400 translator = Translator(translations) | |
1401 translator.setup(tmpl) | |
1402 self.assertEqual("""<html> | |
1403 <div> | |
1404 <p>Vohs John Doe</p> | |
1405 </div> | |
1406 </html>""", tmpl.generate(two=2, fname='John', lname='Doe').render()) | |
1407 | |
1408 def test_translate_i18n_choose_and_singular_with_py_strip(self): | |
1409 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1410 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1411 <div i18n:choose="two; fname, lname"> | |
1412 <p i18n:singular="" py:strip="">Foo $fname $lname</p> | |
1413 <p i18n:plural="">Foos $fname $lname</p> | |
1414 </div> | |
1415 <div i18n:choose="one; fname, lname"> | |
1416 <p i18n:singular="" py:strip="">Foo $fname $lname</p> | |
1417 <p i18n:plural="">Foos $fname $lname</p> | |
1418 </div> | |
1419 </html>""") | |
1420 translations = DummyTranslations({ | |
1421 ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', | |
1422 ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', | |
1423 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', | |
1424 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', | |
1425 }) | |
1426 translator = Translator(translations) | |
1427 translator.setup(tmpl) | |
1428 self.assertEqual("""<html> | |
1429 <div> | |
1430 <p>Vohs John Doe</p> | |
1431 </div> | |
1432 <div> | |
1433 Voh John Doe | |
1434 </div> | |
1435 </html>""", tmpl.generate( | |
1436 one=1, two=2, fname='John',lname='Doe').render()) | |
1437 | |
1438 def test_translate_i18n_choose_and_plural_with_py_strip(self): | |
1439 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1440 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1441 <div i18n:choose="two; fname, lname"> | |
1442 <p i18n:singular="" py:strip="">Foo $fname $lname</p> | |
1443 <p i18n:plural="">Foos $fname $lname</p> | |
1444 </div> | |
1445 </html>""") | |
1446 translations = DummyTranslations({ | |
1447 ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', | |
1448 ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', | |
1449 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', | |
1450 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', | |
1451 }) | |
1452 translator = Translator(translations) | |
1453 translator.setup(tmpl) | |
1454 self.assertEqual("""<html> | |
1455 <div> | |
1456 Voh John Doe | |
1457 </div> | |
1458 </html>""", tmpl.generate(two=1, fname='John', lname='Doe').render()) | |
1459 | |
1460 def test_extract_i18n_choose_as_attribute_and_py_strip(self): | |
1461 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1462 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1463 <div i18n:choose="one" py:strip=""> | |
1464 <p i18n:singular="" py:strip="">FooBar</p> | |
1465 <p i18n:plural="" py:strip="">FooBars</p> | |
1466 </div> | |
1467 </html>""") | |
1468 translator = Translator() | |
1469 tmpl.add_directives(Translator.NAMESPACE, translator) | |
1470 messages = list(translator.extract(tmpl.stream)) | |
1471 self.assertEqual(1, len(messages)) | |
1472 self.assertEqual((3, 'ngettext', ('FooBar', 'FooBars'), []), messages[0]) | |
1473 | |
1474 | |
1475 class DomainDirectiveTestCase(unittest.TestCase): | |
1476 | |
1477 def test_translate_i18n_domain_with_msg_directives(self): | |
1478 #"""translate with i18n:domain and nested i18n:msg directives """ | |
1479 | |
1480 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1481 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1482 <div i18n:domain="foo"> | |
1483 <p i18n:msg="">FooBar</p> | |
1484 <p i18n:msg="">Bar</p> | |
1485 </div> | |
1486 </html>""") | |
1487 translations = DummyTranslations({'Bar': 'Voh'}) | |
1488 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) | |
1489 translator = Translator(translations) | |
1490 translator.setup(tmpl) | |
1491 self.assertEqual("""<html> | |
1492 <div> | |
1493 <p>BarFoo</p> | |
1494 <p>PT_Foo</p> | |
1495 </div> | |
1496 </html>""", tmpl.generate().render()) | |
1497 | |
1498 def test_translate_i18n_domain_with_inline_directives(self): | |
1499 #"""translate with inlined i18n:domain and i18n:msg directives""" | |
1500 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1501 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1502 <p i18n:msg="" i18n:domain="foo">FooBar</p> | |
1503 </html>""") | |
1504 translations = DummyTranslations({'Bar': 'Voh'}) | |
1505 translations.add_domain('foo', {'FooBar': 'BarFoo'}) | |
1506 translator = Translator(translations) | |
1507 translator.setup(tmpl) | |
1508 self.assertEqual("""<html> | |
1509 <p>BarFoo</p> | |
1510 </html>""", tmpl.generate().render()) | |
1511 | |
1512 def test_translate_i18n_domain_without_msg_directives(self): | |
1513 #"""translate domain call without i18n:msg directives still uses current domain""" | |
1514 | |
1515 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1516 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1517 <p i18n:msg="">Bar</p> | |
1518 <div i18n:domain="foo"> | |
1519 <p i18n:msg="">FooBar</p> | |
1520 <p i18n:msg="">Bar</p> | |
1521 <p>Bar</p> | |
1522 </div> | |
1523 <p>Bar</p> | |
1524 </html>""") | |
1525 translations = DummyTranslations({'Bar': 'Voh'}) | |
1526 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) | |
1527 translator = Translator(translations) | |
1528 translator.setup(tmpl) | |
1529 self.assertEqual("""<html> | |
1530 <p>Voh</p> | |
1531 <div> | |
1532 <p>BarFoo</p> | |
1533 <p>PT_Foo</p> | |
1534 <p>PT_Foo</p> | |
1535 </div> | |
1536 <p>Voh</p> | |
1537 </html>""", tmpl.generate().render()) | |
1538 | |
1539 def test_translate_i18n_domain_as_directive_not_attribute(self): | |
1540 #"""translate with domain as directive""" | |
1541 | |
1542 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1543 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1544 <i18n:domain name="foo"> | |
1545 <p i18n:msg="">FooBar</p> | |
1546 <p i18n:msg="">Bar</p> | |
1547 <p>Bar</p> | |
1548 </i18n:domain> | |
1549 <p>Bar</p> | |
1550 </html>""") | |
1551 translations = DummyTranslations({'Bar': 'Voh'}) | |
1552 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) | |
1553 translator = Translator(translations) | |
1554 translator.setup(tmpl) | |
1555 self.assertEqual("""<html> | |
1556 <p>BarFoo</p> | |
1557 <p>PT_Foo</p> | |
1558 <p>PT_Foo</p> | |
1559 <p>Voh</p> | |
1560 </html>""", tmpl.generate().render()) | |
1561 | |
1562 def test_translate_i18n_domain_nested_directives(self): | |
1563 #"""translate with nested i18n:domain directives""" | |
1564 | |
1565 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1566 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1567 <p i18n:msg="">Bar</p> | |
1568 <div i18n:domain="foo"> | |
1569 <p i18n:msg="">FooBar</p> | |
1570 <p i18n:domain="bar" i18n:msg="">Bar</p> | |
1571 <p>Bar</p> | |
1572 </div> | |
1573 <p>Bar</p> | |
1574 </html>""") | |
1575 translations = DummyTranslations({'Bar': 'Voh'}) | |
1576 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'foo_Bar'}) | |
1577 translations.add_domain('bar', {'Bar': 'bar_Bar'}) | |
1578 translator = Translator(translations) | |
1579 translator.setup(tmpl) | |
1580 self.assertEqual("""<html> | |
1581 <p>Voh</p> | |
1582 <div> | |
1583 <p>BarFoo</p> | |
1584 <p>bar_Bar</p> | |
1585 <p>foo_Bar</p> | |
1586 </div> | |
1587 <p>Voh</p> | |
1588 </html>""", tmpl.generate().render()) | |
1589 | |
1590 def test_translate_i18n_domain_with_empty_nested_domain_directive(self): | |
1591 #"""translate with empty nested i18n:domain directive does not use dngettext""" | |
1592 | |
1593 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1594 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1595 <p i18n:msg="">Bar</p> | |
1596 <div i18n:domain="foo"> | |
1597 <p i18n:msg="">FooBar</p> | |
1598 <p i18n:domain="" i18n:msg="">Bar</p> | |
1599 <p>Bar</p> | |
1600 </div> | |
1601 <p>Bar</p> | |
1602 </html>""") | |
1603 translations = DummyTranslations({'Bar': 'Voh'}) | |
1604 translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'foo_Bar'}) | |
1605 translations.add_domain('bar', {'Bar': 'bar_Bar'}) | |
1606 translator = Translator(translations) | |
1607 translator.setup(tmpl) | |
1608 self.assertEqual("""<html> | |
1609 <p>Voh</p> | |
1610 <div> | |
1611 <p>BarFoo</p> | |
1612 <p>Voh</p> | |
1613 <p>foo_Bar</p> | |
1614 </div> | |
1615 <p>Voh</p> | |
1616 </html>""", tmpl.generate().render()) | |
1617 | |
1618 def test_translate_i18n_domain_with_inline_directive_on_START_NS(self): | |
1619 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1620 xmlns:i18n="http://genshi.edgewall.org/i18n" i18n:domain="foo"> | |
1621 <p i18n:msg="">FooBar</p> | |
1622 </html>""") | |
1623 translations = DummyTranslations({'Bar': 'Voh'}) | |
1624 translations.add_domain('foo', {'FooBar': 'BarFoo'}) | |
1625 translator = Translator(translations) | |
1626 translator.setup(tmpl) | |
1627 self.assertEqual("""<html> | |
1628 <p>BarFoo</p> | |
1629 </html>""", tmpl.generate().render()) | |
1630 | |
1631 def test_translate_i18n_domain_with_inline_directive_on_START_NS_with_py_strip(self): | |
1632 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1633 xmlns:i18n="http://genshi.edgewall.org/i18n" | |
1634 i18n:domain="foo" py:strip=""> | |
1635 <p i18n:msg="">FooBar</p> | |
1636 </html>""") | |
1637 translations = DummyTranslations({'Bar': 'Voh'}) | |
1638 translations.add_domain('foo', {'FooBar': 'BarFoo'}) | |
1639 translator = Translator(translations) | |
1640 translator.setup(tmpl) | |
1641 self.assertEqual(""" | |
1642 <p>BarFoo</p> | |
1643 """, tmpl.generate().render()) | |
1644 | |
1645 def test_translate_i18n_domain_with_nested_includes(self): | |
1457 import os, shutil, tempfile | 1646 import os, shutil, tempfile |
1458 from genshi.template.loader import TemplateLoader | 1647 from genshi.template.loader import TemplateLoader |
1459 dirname = tempfile.mkdtemp(suffix='genshi_test') | 1648 dirname = tempfile.mkdtemp(suffix='genshi_test') |
1460 try: | 1649 try: |
1461 for idx in range(7): | 1650 for idx in range(7): |
1534 <p>Voh 6</p> | 1723 <p>Voh 6</p> |
1535 </html>""", tmpl.generate(idx=-1).render()) | 1724 </html>""", tmpl.generate(idx=-1).render()) |
1536 finally: | 1725 finally: |
1537 shutil.rmtree(dirname) | 1726 shutil.rmtree(dirname) |
1538 | 1727 |
1539 def test_translate_i18n_domain_with_nested_inlcudes_with_translatable_attrs(self): | 1728 def test_translate_i18n_domain_with_nested_includes_with_translatable_attrs(self): |
1540 import os, shutil, tempfile | 1729 import os, shutil, tempfile |
1541 from genshi.template.loader import TemplateLoader | 1730 from genshi.template.loader import TemplateLoader |
1542 dirname = tempfile.mkdtemp(suffix='genshi_test') | 1731 dirname = tempfile.mkdtemp(suffix='genshi_test') |
1543 try: | 1732 try: |
1544 for idx in range(4): | 1733 for idx in range(4): |
1609 <p title="Voh">Voh 3</p> | 1798 <p title="Voh">Voh 3</p> |
1610 </html>""", tmpl.generate(idx=-1, | 1799 </html>""", tmpl.generate(idx=-1, |
1611 dg=translations.dugettext).render()) | 1800 dg=translations.dugettext).render()) |
1612 finally: | 1801 finally: |
1613 shutil.rmtree(dirname) | 1802 shutil.rmtree(dirname) |
1614 | |
1615 def test_translate_i18n_msg_and_comment_with_py_strip_directives(self): | |
1616 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1617 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1618 <p i18n:msg="" i18n:comment="As in foo bar" py:strip="">Foo</p> | |
1619 <p py:strip="" i18n:msg="" i18n:comment="As in foo bar">Foo</p> | |
1620 </html>""") | |
1621 translator = Translator(DummyTranslations({'Foo': 'Voh'})) | |
1622 translator.setup(tmpl) | |
1623 self.assertEqual("""<html> | |
1624 Voh | |
1625 Voh | |
1626 </html>""", tmpl.generate().render()) | |
1627 | |
1628 def test_translate_i18n_choose_and_py_strip(self): | |
1629 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1630 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1631 <div i18n:choose="two; fname, lname"> | |
1632 <p i18n:singular="">Foo $fname $lname</p> | |
1633 <p i18n:plural="">Foos $fname $lname</p> | |
1634 </div> | |
1635 </html>""") | |
1636 translations = DummyTranslations({ | |
1637 ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', | |
1638 ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', | |
1639 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', | |
1640 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', | |
1641 }) | |
1642 translator = Translator(translations) | |
1643 translator.setup(tmpl) | |
1644 self.assertEqual("""<html> | |
1645 <div> | |
1646 <p>Vohs John Doe</p> | |
1647 </div> | |
1648 </html>""", tmpl.generate(two=2, fname='John', lname='Doe').render()) | |
1649 | |
1650 def test_translate_i18n_choose_and_domain_and_py_strip(self): | |
1651 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1652 xmlns:i18n="http://genshi.edgewall.org/i18n" | |
1653 i18n:domain="foo"> | |
1654 <div i18n:choose="two; fname, lname"> | |
1655 <p i18n:singular="">Foo $fname $lname</p> | |
1656 <p i18n:plural="">Foos $fname $lname</p> | |
1657 </div> | |
1658 </html>""") | |
1659 translations = DummyTranslations() | |
1660 translations.add_domain('foo', { | |
1661 ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', | |
1662 ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', | |
1663 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', | |
1664 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', | |
1665 }) | |
1666 translator = Translator(translations) | |
1667 translator.setup(tmpl) | |
1668 self.assertEqual("""<html> | |
1669 <div> | |
1670 <p>Vohs John Doe</p> | |
1671 </div> | |
1672 </html>""", tmpl.generate(two=2, fname='John', lname='Doe').render()) | |
1673 | |
1674 def test_translate_i18n_choose_and_singular_with_py_strip(self): | |
1675 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1676 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1677 <div i18n:choose="two; fname, lname"> | |
1678 <p i18n:singular="" py:strip="">Foo $fname $lname</p> | |
1679 <p i18n:plural="">Foos $fname $lname</p> | |
1680 </div> | |
1681 <div i18n:choose="one; fname, lname"> | |
1682 <p i18n:singular="" py:strip="">Foo $fname $lname</p> | |
1683 <p i18n:plural="">Foos $fname $lname</p> | |
1684 </div> | |
1685 </html>""") | |
1686 translations = DummyTranslations({ | |
1687 ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', | |
1688 ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', | |
1689 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', | |
1690 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', | |
1691 }) | |
1692 translator = Translator(translations) | |
1693 translator.setup(tmpl) | |
1694 self.assertEqual("""<html> | |
1695 <div> | |
1696 <p>Vohs John Doe</p> | |
1697 </div> | |
1698 <div> | |
1699 Voh John Doe | |
1700 </div> | |
1701 </html>""", tmpl.generate( | |
1702 one=1, two=2, fname='John',lname='Doe').render()) | |
1703 | |
1704 def test_translate_i18n_choose_and_plural_with_py_strip(self): | |
1705 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1706 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1707 <div i18n:choose="two; fname, lname"> | |
1708 <p i18n:singular="" py:strip="">Foo $fname $lname</p> | |
1709 <p i18n:plural="">Foos $fname $lname</p> | |
1710 </div> | |
1711 </html>""") | |
1712 translations = DummyTranslations({ | |
1713 ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', | |
1714 ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', | |
1715 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', | |
1716 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', | |
1717 }) | |
1718 translator = Translator(translations) | |
1719 translator.setup(tmpl) | |
1720 self.assertEqual("""<html> | |
1721 <div> | |
1722 Voh John Doe | |
1723 </div> | |
1724 </html>""", tmpl.generate(two=1, fname='John', lname='Doe').render()) | |
1725 | |
1726 def test_extract_i18n_msg_with_py_strip(self): | |
1727 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1728 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1729 <p i18n:msg="" py:strip=""> | |
1730 Please see <a href="help.html">Help</a> for details. | |
1731 </p> | |
1732 </html>""") | |
1733 translator = Translator() | |
1734 tmpl.add_directives(Translator.NAMESPACE, translator) | |
1735 messages = list(translator.extract(tmpl.stream)) | |
1736 self.assertEqual(1, len(messages)) | |
1737 self.assertEqual((3, None, 'Please see [1:Help] for details.', []), | |
1738 messages[0]) | |
1739 | |
1740 def test_extract_i18n_msg_with_py_strip_and_comment(self): | |
1741 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1742 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1743 <p i18n:msg="" py:strip="" i18n:comment="Foo"> | |
1744 Please see <a href="help.html">Help</a> for details. | |
1745 </p> | |
1746 </html>""") | |
1747 translator = Translator() | |
1748 tmpl.add_directives(Translator.NAMESPACE, translator) | |
1749 messages = list(translator.extract(tmpl.stream)) | |
1750 self.assertEqual(1, len(messages)) | |
1751 self.assertEqual((3, None, 'Please see [1:Help] for details.', | |
1752 ['Foo']), messages[0]) | |
1753 | |
1754 def test_extract_i18n_choose_as_attribute_and_py_strip(self): | |
1755 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1756 xmlns:i18n="http://genshi.edgewall.org/i18n"> | |
1757 <div i18n:choose="one" py:strip=""> | |
1758 <p i18n:singular="" py:strip="">FooBar</p> | |
1759 <p i18n:plural="" py:strip="">FooBars</p> | |
1760 </div> | |
1761 </html>""") | |
1762 translator = Translator() | |
1763 tmpl.add_directives(Translator.NAMESPACE, translator) | |
1764 messages = list(translator.extract(tmpl.stream)) | |
1765 self.assertEqual(1, len(messages)) | |
1766 self.assertEqual((3, 'ngettext', ('FooBar', 'FooBars'), []), messages[0]) | |
1767 | |
1768 def test_translate_i18n_domain_with_inline_directive_on_START_NS(self): | |
1769 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1770 xmlns:i18n="http://genshi.edgewall.org/i18n" i18n:domain="foo"> | |
1771 <p i18n:msg="">FooBar</p> | |
1772 </html>""") | |
1773 translations = DummyTranslations({'Bar': 'Voh'}) | |
1774 translations.add_domain('foo', {'FooBar': 'BarFoo'}) | |
1775 translator = Translator(translations) | |
1776 translator.setup(tmpl) | |
1777 self.assertEqual("""<html> | |
1778 <p>BarFoo</p> | |
1779 </html>""", tmpl.generate().render()) | |
1780 | |
1781 def test_translate_i18n_domain_with_inline_directive_on_START_NS_with_py_strip(self): | |
1782 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" | |
1783 xmlns:i18n="http://genshi.edgewall.org/i18n" | |
1784 i18n:domain="foo" py:strip=""> | |
1785 <p i18n:msg="">FooBar</p> | |
1786 </html>""") | |
1787 translations = DummyTranslations({'Bar': 'Voh'}) | |
1788 translations.add_domain('foo', {'FooBar': 'BarFoo'}) | |
1789 translator = Translator(translations) | |
1790 translator.setup(tmpl) | |
1791 self.assertEqual(""" | |
1792 <p>BarFoo</p> | |
1793 """, tmpl.generate().render()) | |
1794 | 1803 |
1795 | 1804 |
1796 class ExtractTestCase(unittest.TestCase): | 1805 class ExtractTestCase(unittest.TestCase): |
1797 | 1806 |
1798 def test_markup_template_extraction(self): | 1807 def test_markup_template_extraction(self): |
1945 | 1954 |
1946 def suite(): | 1955 def suite(): |
1947 suite = unittest.TestSuite() | 1956 suite = unittest.TestSuite() |
1948 suite.addTest(doctest.DocTestSuite(Translator.__module__)) | 1957 suite.addTest(doctest.DocTestSuite(Translator.__module__)) |
1949 suite.addTest(unittest.makeSuite(TranslatorTestCase, 'test')) | 1958 suite.addTest(unittest.makeSuite(TranslatorTestCase, 'test')) |
1959 suite.addTest(unittest.makeSuite(MsgDirectiveTestCase, 'test')) | |
1960 suite.addTest(unittest.makeSuite(ChooseDirectiveTestCase, 'test')) | |
1961 suite.addTest(unittest.makeSuite(DomainDirectiveTestCase, 'test')) | |
1950 suite.addTest(unittest.makeSuite(ExtractTestCase, 'test')) | 1962 suite.addTest(unittest.makeSuite(ExtractTestCase, 'test')) |
1951 return suite | 1963 return suite |
1952 | 1964 |
1953 if __name__ == '__main__': | 1965 if __name__ == '__main__': |
1954 unittest.main(defaultTest='suite') | 1966 unittest.main(defaultTest='suite') |