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')
Copyright (C) 2012-2017 Edgewall Software