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