| 464 | | tmpl.filters.insert(0, translator) |
| 465 | | tmpl.add_directives(Translator.NAMESPACE, translator) |
| | 499 | setup_i18n(tmpl, translator) |
| | 500 | self.assertEqual("""<html> |
| | 501 | <p>Voh</p> |
| | 502 | </html>""", tmpl.generate().render()) |
| | 503 | |
| | 504 | def test_translate_i18n_domain_with_msg_directives(self): |
| | 505 | #"""translate with i18n:domain and nested i18n:msg directives """ |
| | 506 | |
| | 507 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 508 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 509 | <div i18n:domain="foo"> |
| | 510 | <p i18n:msg="">FooBar</p> |
| | 511 | <p i18n:msg="">Bar</p> |
| | 512 | </div> |
| | 513 | </html>""") |
| | 514 | translations = DummyTranslations({'Bar': 'Voh'}) |
| | 515 | translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) |
| | 516 | translator = Translator(translations) |
| | 517 | setup_i18n(tmpl, translator) |
| | 518 | self.assertEqual("""<html> |
| | 519 | <div> |
| | 520 | <p>BarFoo</p> |
| | 521 | <p>PT_Foo</p> |
| | 522 | </div> |
| | 523 | </html>""", tmpl.generate().render()) |
| | 524 | |
| | 525 | def test_translate_i18n_domain_with_inline_directives(self): |
| | 526 | #"""translate with inlined i18n:domain and i18n:msg directives""" |
| | 527 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 528 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 529 | <p i18n:msg="" i18n:domain="foo">FooBar</p> |
| | 530 | </html>""") |
| | 531 | translations = DummyTranslations({'Bar': 'Voh'}) |
| | 532 | translations.add_domain('foo', {'FooBar': 'BarFoo'}) |
| | 533 | translator = Translator(translations) |
| | 534 | setup_i18n(tmpl, translator) |
| | 535 | self.assertEqual("""<html> |
| | 536 | <p>BarFoo</p> |
| | 537 | </html>""", tmpl.generate().render()) |
| | 538 | |
| | 539 | def test_translate_i18n_domain_without_msg_directives(self): |
| | 540 | #"""translate domain call without i18n:msg directives still uses current domain""" |
| | 541 | |
| | 542 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 543 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 544 | <p i18n:msg="">Bar</p> |
| | 545 | <div i18n:domain="foo"> |
| | 546 | <p i18n:msg="">FooBar</p> |
| | 547 | <p i18n:msg="">Bar</p> |
| | 548 | <p>Bar</p> |
| | 549 | </div> |
| | 550 | <p>Bar</p> |
| | 551 | </html>""") |
| | 552 | translations = DummyTranslations({'Bar': 'Voh'}) |
| | 553 | translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) |
| | 554 | translator = Translator(translations) |
| | 555 | setup_i18n(tmpl, translator) |
| | 556 | self.assertEqual("""<html> |
| | 557 | <p>Voh</p> |
| | 558 | <div> |
| | 559 | <p>BarFoo</p> |
| | 560 | <p>PT_Foo</p> |
| | 561 | <p>PT_Foo</p> |
| | 562 | </div> |
| | 563 | <p>Voh</p> |
| | 564 | </html>""", tmpl.generate().render()) |
| | 565 | |
| | 566 | def test_translate_i18n_domain_as_directive_not_attribute(self): |
| | 567 | #"""translate with domain as directive""" |
| | 568 | |
| | 569 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 570 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 571 | <i18n:domain name="foo"> |
| | 572 | <p i18n:msg="">FooBar</p> |
| | 573 | <p i18n:msg="">Bar</p> |
| | 574 | <p>Bar</p> |
| | 575 | </i18n:domain> |
| | 576 | <p>Bar</p> |
| | 577 | </html>""") |
| | 578 | translations = DummyTranslations({'Bar': 'Voh'}) |
| | 579 | translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) |
| | 580 | translator = Translator(translations) |
| | 581 | setup_i18n(tmpl, translator) |
| | 582 | self.assertEqual("""<html> |
| | 583 | <p>BarFoo</p> |
| | 584 | <p>PT_Foo</p> |
| | 585 | <p>PT_Foo</p> |
| | 586 | <p>Voh</p> |
| | 587 | </html>""", tmpl.generate().render()) |
| | 588 | |
| | 589 | def test_translate_i18n_domain_nested_directives(self): |
| | 590 | #"""translate with nested i18n:domain directives""" |
| | 591 | |
| | 592 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 593 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 594 | <p i18n:msg="">Bar</p> |
| | 595 | <div i18n:domain="foo"> |
| | 596 | <p i18n:msg="">FooBar</p> |
| | 597 | <p i18n:domain="bar" i18n:msg="">Bar</p> |
| | 598 | <p>Bar</p> |
| | 599 | </div> |
| | 600 | <p>Bar</p> |
| | 601 | </html>""") |
| | 602 | translations = DummyTranslations({'Bar': 'Voh'}) |
| | 603 | translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'foo_Bar'}) |
| | 604 | translations.add_domain('bar', {'Bar': 'bar_Bar'}) |
| | 605 | translator = Translator(translations) |
| | 606 | setup_i18n(tmpl, translator) |
| | 607 | self.assertEqual("""<html> |
| | 608 | <p>Voh</p> |
| | 609 | <div> |
| | 610 | <p>BarFoo</p> |
| | 611 | <p>bar_Bar</p> |
| | 612 | <p>foo_Bar</p> |
| | 613 | </div> |
| | 614 | <p>Voh</p> |
| | 615 | </html>""", tmpl.generate().render()) |
| | 616 | |
| | 617 | def test_translate_i18n_domain_with_empty_nested_domain_directive(self): |
| | 618 | #"""translate with empty nested i18n:domain directive does not use dngettext""" |
| | 619 | |
| | 620 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 621 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 622 | <p i18n:msg="">Bar</p> |
| | 623 | <div i18n:domain="foo"> |
| | 624 | <p i18n:msg="">FooBar</p> |
| | 625 | <p i18n:domain="" i18n:msg="">Bar</p> |
| | 626 | <p>Bar</p> |
| | 627 | </div> |
| | 628 | <p>Bar</p> |
| | 629 | </html>""") |
| | 630 | translations = DummyTranslations({'Bar': 'Voh'}) |
| | 631 | translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'foo_Bar'}) |
| | 632 | translations.add_domain('bar', {'Bar': 'bar_Bar'}) |
| | 633 | translator = Translator(translations) |
| | 634 | setup_i18n(tmpl, translator) |
| | 645 | def test_translate_i18n_choose_as_attribute(self): |
| | 646 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 647 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 648 | <div i18n:choose="one"> |
| | 649 | <p i18n:singular="">FooBar</p> |
| | 650 | <p i18n:plural="">FooBars</p> |
| | 651 | </div> |
| | 652 | <div i18n:choose="two"> |
| | 653 | <p i18n:singular="">FooBar</p> |
| | 654 | <p i18n:plural="">FooBars</p> |
| | 655 | </div> |
| | 656 | </html>""") |
| | 657 | translations = DummyTranslations() |
| | 658 | translator = Translator(translations) |
| | 659 | setup_i18n(tmpl, translator) |
| | 660 | self.assertEqual("""<html> |
| | 661 | <div> |
| | 662 | <p>FooBar</p> |
| | 663 | </div> |
| | 664 | <div> |
| | 665 | <p>FooBars</p> |
| | 666 | </div> |
| | 667 | </html>""", tmpl.generate(one=1, two=2).render()) |
| | 668 | |
| | 669 | def test_translate_i18n_choose_as_directive(self): |
| | 670 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 671 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 672 | <i18n:choose numeral="two"> |
| | 673 | <p i18n:singular="">FooBar</p> |
| | 674 | <p i18n:plural="">FooBars</p> |
| | 675 | </i18n:choose> |
| | 676 | <i18n:choose numeral="one"> |
| | 677 | <p i18n:singular="">FooBar</p> |
| | 678 | <p i18n:plural="">FooBars</p> |
| | 679 | </i18n:choose> |
| | 680 | </html>""") |
| | 681 | translations = DummyTranslations() |
| | 682 | translator = Translator(translations) |
| | 683 | setup_i18n(tmpl, translator) |
| | 684 | self.assertEqual("""<html> |
| | 685 | <p>FooBars</p> |
| | 686 | <p>FooBar</p> |
| | 687 | </html>""", tmpl.generate(one=1, two=2).render()) |
| | 688 | |
| | 689 | def test_translate_i18n_choose_as_attribute_with_params(self): |
| | 690 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 691 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 692 | <div i18n:choose="two; fname, lname"> |
| | 693 | <p i18n:singular="">Foo $fname $lname</p> |
| | 694 | <p i18n:plural="">Foos $fname $lname</p> |
| | 695 | </div> |
| | 696 | </html>""") |
| | 697 | translations = DummyTranslations({ |
| | 698 | ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', |
| | 699 | ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', |
| | 700 | 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', |
| | 701 | 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', |
| | 702 | }) |
| | 703 | translator = Translator(translations) |
| | 704 | setup_i18n(tmpl, translator) |
| | 705 | self.assertEqual("""<html> |
| | 706 | <div> |
| | 707 | <p>Vohs John Doe</p> |
| | 708 | </div> |
| | 709 | </html>""", tmpl.generate(two=2, fname='John', lname='Doe').render()) |
| | 710 | |
| | 711 | def test_translate_i18n_choose_as_attribute_with_params_and_domain_as_param(self): |
| | 712 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 713 | xmlns:i18n="http://genshi.edgewall.org/i18n" |
| | 714 | i18n:domain="foo"> |
| | 715 | <div i18n:choose="two; fname, lname"> |
| | 716 | <p i18n:singular="">Foo $fname $lname</p> |
| | 717 | <p i18n:plural="">Foos $fname $lname</p> |
| | 718 | </div> |
| | 719 | </html>""") |
| | 720 | translations = DummyTranslations() |
| | 721 | translations.add_domain('foo', { |
| | 722 | ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', |
| | 723 | ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', |
| | 724 | 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', |
| | 725 | 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', |
| | 726 | }) |
| | 727 | translator = Translator(translations) |
| | 728 | setup_i18n(tmpl, translator) |
| | 729 | self.assertEqual("""<html> |
| | 730 | <div> |
| | 731 | <p>Vohs John Doe</p> |
| | 732 | </div> |
| | 733 | </html>""", tmpl.generate(two=2, fname='John', lname='Doe').render()) |
| | 734 | |
| | 735 | def test_translate_i18n_choose_as_directive_with_params(self): |
| | 736 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 737 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 738 | <i18n:choose numeral="two" params="fname, lname"> |
| | 739 | <p i18n:singular="">Foo ${fname} ${lname}</p> |
| | 740 | <p i18n:plural="">Foos ${fname} ${lname}</p> |
| | 741 | </i18n:choose> |
| | 742 | <i18n:choose numeral="one" params="fname, lname"> |
| | 743 | <p i18n:singular="">Foo ${fname} ${lname}</p> |
| | 744 | <p i18n:plural="">Foos ${fname} ${lname}</p> |
| | 745 | </i18n:choose> |
| | 746 | </html>""") |
| | 747 | translations = DummyTranslations({ |
| | 748 | ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', |
| | 749 | ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', |
| | 750 | 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', |
| | 751 | 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', |
| | 752 | }) |
| | 753 | translator = Translator(translations) |
| | 754 | setup_i18n(tmpl, translator) |
| | 755 | self.assertEqual("""<html> |
| | 756 | <p>Vohs John Doe</p> |
| | 757 | <p>Voh John Doe</p> |
| | 758 | </html>""", tmpl.generate(one=1, two=2, |
| | 759 | fname='John', lname='Doe').render()) |
| | 760 | |
| | 761 | def test_translate_i18n_choose_as_directive_with_params_and_domain_as_directive(self): |
| | 762 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 763 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 764 | <i18n:domain name="foo"> |
| | 765 | <i18n:choose numeral="two" params="fname, lname"> |
| | 766 | <p i18n:singular="">Foo ${fname} ${lname}</p> |
| | 767 | <p i18n:plural="">Foos ${fname} ${lname}</p> |
| | 768 | </i18n:choose> |
| | 769 | </i18n:domain> |
| | 770 | <i18n:choose numeral="one" params="fname, lname"> |
| | 771 | <p i18n:singular="">Foo ${fname} ${lname}</p> |
| | 772 | <p i18n:plural="">Foos ${fname} ${lname}</p> |
| | 773 | </i18n:choose> |
| | 774 | </html>""") |
| | 775 | translations = DummyTranslations() |
| | 776 | translations.add_domain('foo', { |
| | 777 | ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', |
| | 778 | ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', |
| | 779 | 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', |
| | 780 | 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', |
| | 781 | }) |
| | 782 | translator = Translator(translations) |
| | 783 | setup_i18n(tmpl, translator) |
| | 784 | self.assertEqual("""<html> |
| | 785 | <p>Vohs John Doe</p> |
| | 786 | <p>Foo John Doe</p> |
| | 787 | </html>""", tmpl.generate(one=1, two=2, |
| | 788 | fname='John', lname='Doe').render()) |
| | 789 | |
| | 790 | def test_extract_i18n_choose_as_attribute(self): |
| | 791 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 792 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 793 | <div i18n:choose="one"> |
| | 794 | <p i18n:singular="">FooBar</p> |
| | 795 | <p i18n:plural="">FooBars</p> |
| | 796 | </div> |
| | 797 | <div i18n:choose="two"> |
| | 798 | <p i18n:singular="">FooBar</p> |
| | 799 | <p i18n:plural="">FooBars</p> |
| | 800 | </div> |
| | 801 | </html>""") |
| | 802 | translator = Translator() |
| | 803 | tmpl.add_directives(Translator.NAMESPACE, translator) |
| | 804 | messages = list(translator.extract(tmpl.stream)) |
| | 805 | self.assertEqual(2, len(messages)) |
| | 806 | self.assertEqual((3, 'ngettext', (u'FooBar', u'FooBars'), []), messages[0]) |
| | 807 | self.assertEqual((7, 'ngettext', (u'FooBar', u'FooBars'), []), messages[1]) |
| | 808 | |
| | 809 | def test_extract_i18n_choose_as_directive(self): |
| | 810 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 811 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 812 | <i18n:choose numeral="two"> |
| | 813 | <p i18n:singular="">FooBar</p> |
| | 814 | <p i18n:plural="">FooBars</p> |
| | 815 | </i18n:choose> |
| | 816 | <i18n:choose numeral="one"> |
| | 817 | <p i18n:singular="">FooBar</p> |
| | 818 | <p i18n:plural="">FooBars</p> |
| | 819 | </i18n:choose> |
| | 820 | </html>""") |
| | 821 | translator = Translator() |
| | 822 | tmpl.add_directives(Translator.NAMESPACE, translator) |
| | 823 | messages = list(translator.extract(tmpl.stream)) |
| | 824 | self.assertEqual(2, len(messages)) |
| | 825 | self.assertEqual((3, 'ngettext', (u'FooBar', u'FooBars'), []), messages[0]) |
| | 826 | self.assertEqual((7, 'ngettext', (u'FooBar', u'FooBars'), []), messages[1]) |
| | 827 | |
| | 828 | def test_extract_i18n_choose_as_attribute_with_params(self): |
| | 829 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 830 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 831 | <div i18n:choose="two; fname, lname"> |
| | 832 | <p i18n:singular="">Foo $fname $lname</p> |
| | 833 | <p i18n:plural="">Foos $fname $lname</p> |
| | 834 | </div> |
| | 835 | </html>""") |
| | 836 | translator = Translator() |
| | 837 | tmpl.add_directives(Translator.NAMESPACE, translator) |
| | 838 | messages = list(translator.extract(tmpl.stream)) |
| | 839 | self.assertEqual(1, len(messages)) |
| | 840 | self.assertEqual((3, 'ngettext', (u'Foo %(fname)s %(lname)s', |
| | 841 | u'Foos %(fname)s %(lname)s'), []), |
| | 842 | messages[0]) |
| | 843 | |
| | 844 | def test_extract_i18n_choose_as_attribute_with_params_and_domain_as_param(self): |
| | 845 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 846 | xmlns:i18n="http://genshi.edgewall.org/i18n" |
| | 847 | i18n:domain="foo"> |
| | 848 | <div i18n:choose="two; fname, lname"> |
| | 849 | <p i18n:singular="">Foo $fname $lname</p> |
| | 850 | <p i18n:plural="">Foos $fname $lname</p> |
| | 851 | </div> |
| | 852 | </html>""") |
| | 853 | translator = Translator() |
| | 854 | tmpl.add_directives(Translator.NAMESPACE, translator) |
| | 855 | messages = list(translator.extract(tmpl.stream)) |
| | 856 | self.assertEqual(1, len(messages)) |
| | 857 | self.assertEqual((4, 'ngettext', (u'Foo %(fname)s %(lname)s', |
| | 858 | u'Foos %(fname)s %(lname)s'), []), |
| | 859 | messages[0]) |
| | 860 | |
| | 861 | def test_extract_i18n_choose_as_directive_with_params(self): |
| | 862 | tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" |
| | 863 | xmlns:i18n="http://genshi.edgewall.org/i18n"> |
| | 864 | <i18n:choose numeral="two" params="fname, lname"> |
| | 865 | <p i18n:singular="">Foo ${fname} ${lname}</p> |
| | 866 | <p i18n:plural="">Foos ${fname} ${lname}</p> |
| | 867 | </i18n:choose> |
| | 868 | <i18n:choose numeral="one" params="fname, lname"> |
| | 869 | <p i18n:singular="">Foo ${fname} ${lname}</p> |
| | 870 | <p i18n:plural="">Foos ${fname} ${lname}</p> |
| | 871 | </i18n:choose> |
| | 872 | </html>""") |
| | 873 | translator = Translator() |
| | 874 | tmpl.add_directives( |