annotate genshi/filters/tests/i18n.py @ 789:5c93aefcd93f stable-0.5.x

Ported [913], [927], and [928] to the 0.5.x branch.
author cmlenz
date Tue, 19 Aug 2008 11:51:06 +0000
parents 4ca0e1e43ce0
children 422a9dd01e9f
rev   line source
446
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
2 #
719
09a90feb9269 Fix copyright years.
cmlenz
parents: 709
diff changeset
3 # Copyright (C) 2007-2008 Edgewall Software
446
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
4 # All rights reserved.
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
5 #
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
8 # are also available at http://genshi.edgewall.org/wiki/License.
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
9 #
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://genshi.edgewall.org/log/.
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
13
777
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
14 from datetime import datetime
446
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
15 import doctest
485
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
16 from StringIO import StringIO
446
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
17 import unittest
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
18
667
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
19 from genshi.core import Attrs
485
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
20 from genshi.template import MarkupTemplate
528
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
21 from genshi.filters.i18n import Translator, extract
667
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
22 from genshi.input import HTML
446
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
23
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
24
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
25 class TranslatorTestCase(unittest.TestCase):
485
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
26
667
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
27 def test_translate_included_attribute_text(self):
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
28 """
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
29 Verify that translated attributes end up in a proper `Attrs` instance.
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
30 """
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
31 html = HTML("""<html>
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
32 <span title="Foo"></span>
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
33 </html>""")
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
34 translator = Translator(lambda s: u"Voh")
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
35 stream = list(html.filter(translator))
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
36 kind, data, pos = stream[2]
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
37 assert isinstance(data[1], Attrs)
077c9142dca0 Fix case where attributes weren't properly wrapped in an `Attrs` instance if one or more of them were translated by the I18n filter, potentially breaking things further down the chain. Closes #162.
cmlenz
parents: 600
diff changeset
38
594
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
39 def test_extract_without_text(self):
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
40 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
41 <p title="Bar">Foo</p>
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
42 ${ngettext("Singular", "Plural", num)}
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
43 </html>""")
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
44 translator = Translator(extract_text=False)
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
45 messages = list(translator.extract(tmpl.stream))
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
46 self.assertEqual(1, len(messages))
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
47 self.assertEqual((3, 'ngettext', (u'Singular', u'Plural', None)),
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
48 messages[0])
0fb43dc2e165 Add option to I18n filter to only extract strings in gettext function calls.
cmlenz
parents: 565
diff changeset
49
485
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
50 def test_extract_plural_form(self):
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
51 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
52 ${ngettext("Singular", "Plural", num)}
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
53 </html>""")
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
54 translator = Translator()
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
55 messages = list(translator.extract(tmpl.stream))
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
56 self.assertEqual(1, len(messages))
565
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
57 self.assertEqual((2, 'ngettext', (u'Singular', u'Plural', None)),
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
58 messages[0])
485
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
59
600
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
60 def test_extract_funky_plural_form(self):
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
61 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
62 ${ngettext(len(items), *widget.display_names)}
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
63 </html>""")
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
64 translator = Translator()
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
65 messages = list(translator.extract(tmpl.stream))
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
66 self.assertEqual(1, len(messages))
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
67 self.assertEqual((2, 'ngettext', (None, None)), messages[0])
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
68
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
69 def test_extract_gettext_with_unicode_string(self):
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
70 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
71 ${gettext("Grüße")}
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
72 </html>""")
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
73 translator = Translator()
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
74 messages = list(translator.extract(tmpl.stream))
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
75 self.assertEqual(1, len(messages))
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
76 self.assertEqual((2, 'gettext', u'Gr\xfc\xdfe'), messages[0])
0d802a7e3630 Handle starargs and dstarargs in the I18n extraction code.
cmlenz
parents: 596
diff changeset
77
485
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
78 def test_extract_included_attribute_text(self):
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
79 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
80 <span title="Foo"></span>
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
81 </html>""")
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
82 translator = Translator()
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
83 messages = list(translator.extract(tmpl.stream))
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
84 self.assertEqual(1, len(messages))
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
85 self.assertEqual((2, None, u'Foo'), messages[0])
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
86
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
87 def test_extract_attribute_expr(self):
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
88 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
89 <input type="submit" value="${_('Save')}" />
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
90 </html>""")
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
91 translator = Translator()
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
92 messages = list(translator.extract(tmpl.stream))
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
93 self.assertEqual(1, len(messages))
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
94 self.assertEqual((2, '_', u'Save'), messages[0])
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
95
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
96 def test_extract_non_included_attribute_interpolated(self):
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
97 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
98 <a href="#anchor_${num}">Foo</a>
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
99 </html>""")
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
100 translator = Translator()
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
101 messages = list(translator.extract(tmpl.stream))
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
102 self.assertEqual(1, len(messages))
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
103 self.assertEqual((2, None, u'Foo'), messages[0])
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
104
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
105 def test_extract_text_from_sub(self):
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
106 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
107 <py:if test="foo">Foo</py:if>
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
108 </html>""")
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
109 translator = Translator()
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
110 messages = list(translator.extract(tmpl.stream))
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
111 self.assertEqual(1, len(messages))
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
112 self.assertEqual((2, None, u'Foo'), messages[0])
446
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
113
522
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
114 def test_ignore_tag_with_fixed_xml_lang(self):
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
115 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
116 <p xml:lang="en">(c) 2007 Edgewall Software</p>
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
117 </html>""")
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
118 translator = Translator()
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
119 messages = list(translator.extract(tmpl.stream))
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
120 self.assertEqual(0, len(messages))
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
121
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
122 def test_extract_tag_with_variable_xml_lang(self):
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
123 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
124 <p xml:lang="${lang}">(c) 2007 Edgewall Software</p>
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
125 </html>""")
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
126 translator = Translator()
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
127 messages = list(translator.extract(tmpl.stream))
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
128 self.assertEqual(1, len(messages))
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
129 self.assertEqual((2, None, u'(c) 2007 Edgewall Software'), messages[0])
c1738dec04d9 The I18n filter now skips the content of elements that have an `xml:lang` attribute with a fixed string value. Basically, `xml:lang` can now be used as a flag to mark specific sections as not needing localization.
cmlenz
parents: 485
diff changeset
130
535
c8806216aec4 The I18n filter no longer extracts or translates literal strings in attribute values that also contain expressions.
cmlenz
parents: 528
diff changeset
131 def test_ignore_attribute_with_expression(self):
c8806216aec4 The I18n filter no longer extracts or translates literal strings in attribute values that also contain expressions.
cmlenz
parents: 528
diff changeset
132 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/">
c8806216aec4 The I18n filter no longer extracts or translates literal strings in attribute values that also contain expressions.
cmlenz
parents: 528
diff changeset
133 <input type="submit" value="Reply" title="Reply to comment $num" />
c8806216aec4 The I18n filter no longer extracts or translates literal strings in attribute values that also contain expressions.
cmlenz
parents: 528
diff changeset
134 </html>""")
c8806216aec4 The I18n filter no longer extracts or translates literal strings in attribute values that also contain expressions.
cmlenz
parents: 528
diff changeset
135 translator = Translator()
c8806216aec4 The I18n filter no longer extracts or translates literal strings in attribute values that also contain expressions.
cmlenz
parents: 528
diff changeset
136 messages = list(translator.extract(tmpl.stream))
c8806216aec4 The I18n filter no longer extracts or translates literal strings in attribute values that also contain expressions.
cmlenz
parents: 528
diff changeset
137 self.assertEqual(0, len(messages))
c8806216aec4 The I18n filter no longer extracts or translates literal strings in attribute values that also contain expressions.
cmlenz
parents: 528
diff changeset
138
560
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
139 def test_extract_i18n_msg(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
140 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
141 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
142 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
143 Please see <a href="help.html">Help</a> for details.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
144 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
145 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
146 translator = Translator()
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
147 messages = list(translator.extract(tmpl.stream))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
148 self.assertEqual(1, len(messages))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
149 self.assertEqual('Please see [1:Help] for details.', messages[0][2])
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
150
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
151 def test_translate_i18n_msg(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
152 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
153 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
154 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
155 Please see <a href="help.html">Help</a> for details.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
156 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
157 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
158 gettext = lambda s: u"Für Details siehe bitte [1:Hilfe]."
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
159 tmpl.filters.insert(0, Translator(gettext))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
160 self.assertEqual("""<html>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
161 <p>Für Details siehe bitte <a href="help.html">Hilfe</a>.</p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
162 </html>""", tmpl.generate().render())
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
163
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
164 def test_extract_i18n_msg_nested(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
165 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
166 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
167 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
168 Please see <a href="help.html"><em>Help</em> page</a> for details.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
169 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
170 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
171 translator = Translator()
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
172 messages = list(translator.extract(tmpl.stream))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
173 self.assertEqual(1, len(messages))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
174 self.assertEqual('Please see [1:[2:Help] page] for details.',
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
175 messages[0][2])
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
176
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
177 def test_translate_i18n_msg_nested(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
178 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
179 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
180 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
181 Please see <a href="help.html"><em>Help</em> page</a> for details.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
182 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
183 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
184 gettext = lambda s: u"Für Details siehe bitte [1:[2:Hilfeseite]]."
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
185 tmpl.filters.insert(0, Translator(gettext))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
186 self.assertEqual("""<html>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
187 <p>Für Details siehe bitte <a href="help.html"><em>Hilfeseite</em></a>.</p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
188 </html>""", tmpl.generate().render())
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
189
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
190 def test_extract_i18n_msg_empty(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
191 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
192 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
193 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
194 Show me <input type="text" name="num" /> entries per page.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
195 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
196 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
197 translator = Translator()
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
198 messages = list(translator.extract(tmpl.stream))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
199 self.assertEqual(1, len(messages))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
200 self.assertEqual('Show me [1:] entries per page.', messages[0][2])
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
201
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
202 def test_translate_i18n_msg_empty(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
203 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
204 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
205 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
206 Show me <input type="text" name="num" /> entries per page.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
207 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
208 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
209 gettext = lambda s: u"[1:] Einträge pro Seite anzeigen."
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
210 tmpl.filters.insert(0, Translator(gettext))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
211 self.assertEqual("""<html>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
212 <p><input type="text" name="num"/> Einträge pro Seite anzeigen.</p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
213 </html>""", tmpl.generate().render())
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
214
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
215 def test_extract_i18n_msg_multiple(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
216 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
217 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
218 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
219 Please see <a href="help.html">Help</a> for <em>details</em>.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
220 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
221 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
222 translator = Translator()
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
223 messages = list(translator.extract(tmpl.stream))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
224 self.assertEqual(1, len(messages))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
225 self.assertEqual('Please see [1:Help] for [2:details].', messages[0][2])
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
226
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
227 def test_translate_i18n_msg_multiple(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
228 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
229 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
230 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
231 Please see <a href="help.html">Help</a> for <em>details</em>.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
232 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
233 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
234 gettext = lambda s: u"Für [2:Details] siehe bitte [1:Hilfe]."
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
235 tmpl.filters.insert(0, Translator(gettext))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
236 self.assertEqual("""<html>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
237 <p>Für <em>Details</em> siehe bitte <a href="help.html">Hilfe</a>.</p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
238 </html>""", tmpl.generate().render())
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
239
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
240 def test_extract_i18n_msg_multiple_empty(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
241 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
242 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
243 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
244 Show me <input type="text" name="num" /> entries per page, starting at page <input type="text" name="num" />.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
245 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
246 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
247 translator = Translator()
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
248 messages = list(translator.extract(tmpl.stream))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
249 self.assertEqual(1, len(messages))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
250 self.assertEqual('Show me [1:] entries per page, starting at page [2:].',
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
251 messages[0][2])
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
252
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
253 def test_translate_i18n_msg_multiple_empty(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
254 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
255 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
256 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
257 Show me <input type="text" name="num" /> entries per page, starting at page <input type="text" name="num" />.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
258 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
259 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
260 gettext = lambda s: u"[1:] Einträge pro Seite, beginnend auf Seite [2:]."
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
261 tmpl.filters.insert(0, Translator(gettext))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
262 self.assertEqual("""<html>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
263 <p><input type="text" name="num"/> Eintr\xc3\xa4ge pro Seite, beginnend auf Seite <input type="text" name="num"/>.</p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
264 </html>""", tmpl.generate().render())
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
265
777
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
266 def test_extract_i18n_msg_with_param(self):
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
267 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
268 xmlns:i18n="http://genshi.edgewall.org/i18n">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
269 <p i18n:msg="name">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
270 Hello, ${user.name}!
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
271 </p>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
272 </html>""")
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
273 translator = Translator()
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
274 messages = list(translator.extract(tmpl.stream))
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
275 self.assertEqual(1, len(messages))
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
276 self.assertEqual('Hello, %(name)s!', messages[0][2])
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
277
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
278 def test_translate_i18n_msg_with_param(self):
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
279 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
280 xmlns:i18n="http://genshi.edgewall.org/i18n">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
281 <p i18n:msg="name">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
282 Hello, ${user.name}!
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
283 </p>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
284 </html>""")
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
285 gettext = lambda s: u"Hallo, %(name)s!"
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
286 tmpl.filters.insert(0, Translator(gettext))
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
287 self.assertEqual("""<html>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
288 <p>Hallo, Jim!</p>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
289 </html>""", tmpl.generate(user=dict(name='Jim')).render())
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
290
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
291 def test_translate_i18n_msg_with_param_reordered(self):
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
292 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
293 xmlns:i18n="http://genshi.edgewall.org/i18n">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
294 <p i18n:msg="name">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
295 Hello, ${user.name}!
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
296 </p>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
297 </html>""")
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
298 gettext = lambda s: u"%(name)s, sei gegrüßt!"
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
299 tmpl.filters.insert(0, Translator(gettext))
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
300 self.assertEqual("""<html>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
301 <p>Jim, sei gegrüßt!</p>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
302 </html>""", tmpl.generate(user=dict(name='Jim')).render())
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
303
789
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
304 def test_translate_i18n_msg_with_attribute_param(self):
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
305 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
306 xmlns:i18n="http://genshi.edgewall.org/i18n">
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
307 <p i18n:msg="">
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
308 Hello, <a href="#${anchor}">dude</a>!
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
309 </p>
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
310 </html>""")
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
311 gettext = lambda s: u"Sei gegrüßt, [1:Alter]!"
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
312 tmpl.filters.insert(0, Translator(gettext))
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
313 self.assertEqual("""<html>
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
314 <p>Sei gegrüßt, <a href="#42">Alter</a>!</p>
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
315 </html>""", tmpl.generate(anchor='42').render())
5c93aefcd93f Ported [913], [927], and [928] to the 0.5.x branch.
cmlenz
parents: 777
diff changeset
316
777
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
317 def test_extract_i18n_msg_with_two_params(self):
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
318 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
319 xmlns:i18n="http://genshi.edgewall.org/i18n">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
320 <p i18n:msg="name, time">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
321 Posted by ${post.author} at ${entry.time.strftime('%H:%m')}
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
322 </p>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
323 </html>""")
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
324 translator = Translator()
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
325 messages = list(translator.extract(tmpl.stream))
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
326 self.assertEqual(1, len(messages))
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
327 self.assertEqual('Posted by %(name)s at %(time)s', messages[0][2])
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
328
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
329 def test_translate_i18n_msg_with_two_params(self):
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
330 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
331 xmlns:i18n="http://genshi.edgewall.org/i18n">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
332 <p i18n:msg="name, time">
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
333 Written by ${entry.author} at ${entry.time.strftime('%H:%M')}
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
334 </p>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
335 </html>""")
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
336 gettext = lambda s: u"%(name)s schrieb dies um %(time)s"
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
337 tmpl.filters.insert(0, Translator(gettext))
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
338 entry = {
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
339 'author': 'Jim',
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
340 'time': datetime(2008, 4, 1, 14, 30)
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
341 }
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
342 self.assertEqual("""<html>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
343 <p>Jim schrieb dies um 14:30</p>
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
344 </html>""", tmpl.generate(entry=entry).render())
4ca0e1e43ce0 Ported [899:902] to 0.5.x branch.
cmlenz
parents: 719
diff changeset
345
560
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
346 def test_extract_i18n_msg_with_directive(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
347 tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
348 xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
349 <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
350 Show me <input type="text" name="num" py:attrs="{'value': x}" /> entries per page.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
351 </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
352 </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
353 translator = Translator()
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
354 messages = list(translator.extract(tmpl.stream))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
355 self.assertEqual(1, len(messages))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
356 self.assertEqual('Show me [1:] entries per page.', messages[0][2])
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
357
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
358 # FIXME: this currently fails :-/
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
359 # def test_translate_i18n_msg_with_directive(self):
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
360 # tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
361 # xmlns:i18n="http://genshi.edgewall.org/i18n">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
362 # <p i18n:msg="">
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
363 # Show me <input type="text" name="num" py:attrs="{'value': x}" /> entries per page.
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
364 # </p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
365 # </html>""")
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
366 # gettext = lambda s: u"[1:] Einträge pro Seite anzeigen."
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
367 # tmpl.filters.insert(0, Translator(gettext))
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
368 # self.assertEqual("""<html>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
369 # <p><input type="text" name="num" value="x"/> Einträge pro Seite anzeigen.</p>
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
370 # </html>""", tmpl.generate().render())
f227a2f12e5f Start implementation of advanced I18n as dicussed in #129 and the MailingList. This is not complete yet, but many simple cases work okay.
cmlenz
parents: 549
diff changeset
371
446
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
372
528
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
373 class ExtractTestCase(unittest.TestCase):
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
374
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
375 def test_markup_template_extraction(self):
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
376 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
377 <head>
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
378 <title>Example</title>
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
379 </head>
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
380 <body>
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
381 <h1>Example</h1>
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
382 <p>${_("Hello, %(name)s") % dict(name=username)}</p>
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
383 <p>${ngettext("You have %d item", "You have %d items", num)}</p>
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
384 </body>
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
385 </html>""")
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
386 results = list(extract(buf, ['_', 'ngettext'], [], {}))
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
387 self.assertEqual([
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
388 (3, None, u'Example', []),
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
389 (6, None, u'Example', []),
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
390 (7, '_', u'Hello, %(name)s', []),
565
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
391 (8, 'ngettext', (u'You have %d item', u'You have %d items', None),
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
392 []),
528
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
393 ], results)
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
394
596
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
395 def test_extraction_without_text(self):
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
396 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
397 <p title="Bar">Foo</p>
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
398 ${ngettext("Singular", "Plural", num)}
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
399 </html>""")
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
400 results = list(extract(buf, ['_', 'ngettext'], [], {
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
401 'extract_text': 'no'
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
402 }))
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
403 self.assertEqual([
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
404 (3, 'ngettext', (u'Singular', u'Plural', None), []),
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
405 ], results)
f436c7db99f5 Follow-up to [708]. The added `extract_text` option wasn't actually being handled by the Babel extraction plugin.
cmlenz
parents: 594
diff changeset
406
528
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
407 def test_text_template_extraction(self):
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
408 buf = StringIO("""${_("Dear %(name)s") % {'name': name}},
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
409
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
410 ${ngettext("Your item:", "Your items", len(items))}
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
411 #for item in items
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
412 * $item
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
413 #end
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
414
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
415 All the best,
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
416 Foobar""")
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
417 results = list(extract(buf, ['_', 'ngettext'], [], {
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
418 'template_class': 'genshi.template:TextTemplate'
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
419 }))
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
420 self.assertEqual([
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
421 (1, '_', u'Dear %(name)s', []),
565
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
422 (3, 'ngettext', (u'Your item:', u'Your items', None), []),
528
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
423 (7, None, u'All the best,\n Foobar', [])
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
424 ], results)
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
425
565
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
426 def test_extraction_with_keyword_arg(self):
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
427 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
428 ${gettext('Foobar', foo='bar')}
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
429 </html>""")
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
430 results = list(extract(buf, ['gettext'], [], {}))
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
431 self.assertEqual([
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
432 (2, 'gettext', (u'Foobar'), []),
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
433 ], results)
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
434
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
435 def test_extraction_with_nonstring_arg(self):
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
436 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
437 ${dgettext(curdomain, 'Foobar')}
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
438 </html>""")
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
439 results = list(extract(buf, ['dgettext'], [], {}))
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
440 self.assertEqual([
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
441 (2, 'dgettext', (None, u'Foobar'), []),
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
442 ], results)
aa8e85a4085e * The I18n extractor now handles gettext function calls that use non-string parameters as well as keyword arguments.
cmlenz
parents: 560
diff changeset
443
549
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
444 def test_extraction_inside_ignored_tags(self):
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
445 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
446 <script type="text/javascript">
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
447 $('#llist').tabs({
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
448 remote: true,
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
449 spinner: "${_('Please wait...')}"
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
450 });
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
451 </script>
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
452 </html>""")
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
453 results = list(extract(buf, ['_'], [], {}))
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
454 self.assertEqual([
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
455 (5, '_', u'Please wait...', []),
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
456 ], results)
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
457
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
458 def test_extraction_inside_ignored_tags_with_directives(self):
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
459 buf = StringIO("""<html xmlns:py="http://genshi.edgewall.org/">
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
460 <script type="text/javascript">
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
461 <py:if test="foobar">
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
462 alert("This shouldn't be extracted");
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
463 </py:if>
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
464 </script>
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
465 </html>""")
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
466 self.assertEqual([], list(extract(buf, ['_'], [], {})))
da5cbf6d134d The I18n filter now extracts text from translation functions in ignored tags. Fixes #132.
cmlenz
parents: 535
diff changeset
467
528
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
468
446
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
469 def suite():
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
470 suite = unittest.TestSuite()
709
a7b0d320aea4 Python 2.3 compatibility fixes for transformer and (specifically for 2.3.1) i18n.
athomas
parents: 667
diff changeset
471 suite.addTest(doctest.DocTestSuite(Translator.__module__))
485
770ba8556940 Follow-up to [583]: Don't extract strings from interpolated attribute values for attributes that shouldn't be included.
cmlenz
parents: 446
diff changeset
472 suite.addTest(unittest.makeSuite(TranslatorTestCase, 'test'))
528
f38ce008ab0a Integrated [http://babel.edgewall.org/ Babel] message extraction plugin, and added I18n doc page.
cmlenz
parents: 522
diff changeset
473 suite.addTest(unittest.makeSuite(ExtractTestCase, 'test'))
446
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
474 return suite
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
475
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
476 if __name__ == '__main__':
90f5908cd10a Add basic I18n/L10n functionality, based on GenshiRecipes/Localization.
cmlenz
parents:
diff changeset
477 unittest.main(defaultTest='suite')
Copyright (C) 2012-2017 Edgewall Software