cmlenz@446: # -*- coding: utf-8 -*- cmlenz@446: # cmlenz@897: # Copyright (C) 2007-2010 Edgewall Software cmlenz@446: # All rights reserved. cmlenz@446: # cmlenz@446: # This software is licensed as described in the file COPYING, which cmlenz@446: # you should have received as part of this distribution. The terms cmlenz@446: # are also available at http://genshi.edgewall.org/wiki/License. cmlenz@446: # cmlenz@446: # This software consists of voluntary contributions made by many cmlenz@446: # individuals. For the exact contribution history, see the revision cmlenz@446: # history and logs, available at http://genshi.edgewall.org/log/. cmlenz@446: cmlenz@776: from datetime import datetime cmlenz@446: import doctest cmlenz@788: from gettext import NullTranslations cmlenz@446: import unittest cmlenz@446: cmlenz@667: from genshi.core import Attrs cmlenz@849: from genshi.template import MarkupTemplate, Context cmlenz@528: from genshi.filters.i18n import Translator, extract cmlenz@667: from genshi.input import HTML hodgestar@933: from genshi.compat import IS_PYTHON2, StringIO cmlenz@446: cmlenz@446: cmlenz@788: class DummyTranslations(NullTranslations): cmlenz@849: _domains = {} cmlenz@788: cmlenz@849: def __init__(self, catalog=()): cmlenz@788: NullTranslations.__init__(self) cmlenz@849: self._catalog = catalog or {} cmlenz@849: self.plural = lambda n: n != 1 cmlenz@849: cmlenz@849: def add_domain(self, domain, catalog): cmlenz@849: translation = DummyTranslations(catalog) cmlenz@849: translation.add_fallback(self) cmlenz@849: self._domains[domain] = translation cmlenz@849: cmlenz@849: def _domain_call(self, func, domain, *args, **kwargs): cmlenz@849: return getattr(self._domains.get(domain, self), func)(*args, **kwargs) cmlenz@788: hodgestar@933: if IS_PYTHON2: hodgestar@933: def ugettext(self, message): hodgestar@933: missing = object() hodgestar@933: tmsg = self._catalog.get(message, missing) hodgestar@933: if tmsg is missing: hodgestar@933: if self._fallback: hodgestar@933: return self._fallback.ugettext(message) hodgestar@933: return unicode(message) hodgestar@933: return tmsg hodgestar@933: else: hodgestar@933: def gettext(self, message): hodgestar@933: missing = object() hodgestar@933: tmsg = self._catalog.get(message, missing) hodgestar@933: if tmsg is missing: hodgestar@933: if self._fallback: hodgestar@933: return self._fallback.gettext(message) hodgestar@933: return unicode(message) hodgestar@933: return tmsg cmlenz@788: hodgestar@933: if IS_PYTHON2: hodgestar@933: def dugettext(self, domain, message): hodgestar@933: return self._domain_call('ugettext', domain, message) hodgestar@933: else: hodgestar@933: def dgettext(self, domain, message): hodgestar@933: return self._domain_call('gettext', domain, message) cmlenz@849: cmlenz@849: def ungettext(self, msgid1, msgid2, n): cmlenz@849: try: cmlenz@849: return self._catalog[(msgid1, self.plural(n))] cmlenz@849: except KeyError: cmlenz@849: if self._fallback: cmlenz@849: return self._fallback.ngettext(msgid1, msgid2, n) cmlenz@849: if n == 1: cmlenz@849: return msgid1 cmlenz@849: else: cmlenz@849: return msgid2 cmlenz@849: hodgestar@933: if not IS_PYTHON2: hodgestar@933: ngettext = ungettext hodgestar@933: del ungettext hodgestar@933: hodgestar@933: if IS_PYTHON2: hodgestar@933: def dungettext(self, domain, singular, plural, numeral): hodgestar@933: return self._domain_call('ungettext', domain, singular, plural, numeral) hodgestar@933: else: hodgestar@933: def dngettext(self, domain, singular, plural, numeral): hodgestar@933: return self._domain_call('ngettext', domain, singular, plural, numeral) cmlenz@849: cmlenz@788: cmlenz@446: class TranslatorTestCase(unittest.TestCase): cmlenz@485: cmlenz@667: def test_translate_included_attribute_text(self): cmlenz@667: """ cmlenz@667: Verify that translated attributes end up in a proper `Attrs` instance. cmlenz@667: """ hodgestar@933: html = HTML(u""" cmlenz@667: cmlenz@667: """) cmlenz@667: translator = Translator(lambda s: u"Voh") cmlenz@667: stream = list(html.filter(translator)) cmlenz@667: kind, data, pos = stream[2] cmlenz@667: assert isinstance(data[1], Attrs) cmlenz@667: cmlenz@594: def test_extract_without_text(self): cmlenz@594: tmpl = MarkupTemplate(""" cmlenz@594:
Foo
cmlenz@594: ${ngettext("Singular", "Plural", num)} cmlenz@594: """) cmlenz@594: translator = Translator(extract_text=False) cmlenz@594: messages = list(translator.extract(tmpl.stream)) cmlenz@594: self.assertEqual(1, len(messages)) cmlenz@858: self.assertEqual((3, 'ngettext', ('Singular', 'Plural', None), []), cmlenz@594: messages[0]) cmlenz@594: cmlenz@485: def test_extract_plural_form(self): cmlenz@485: tmpl = MarkupTemplate(""" cmlenz@485: ${ngettext("Singular", "Plural", num)} cmlenz@485: """) cmlenz@485: translator = Translator() cmlenz@485: messages = list(translator.extract(tmpl.stream)) cmlenz@485: self.assertEqual(1, len(messages)) cmlenz@858: self.assertEqual((2, 'ngettext', ('Singular', 'Plural', None), []), cmlenz@565: messages[0]) cmlenz@485: cmlenz@600: def test_extract_funky_plural_form(self): cmlenz@600: tmpl = MarkupTemplate(""" cmlenz@600: ${ngettext(len(items), *widget.display_names)} cmlenz@600: """) cmlenz@600: translator = Translator() cmlenz@600: messages = list(translator.extract(tmpl.stream)) cmlenz@600: self.assertEqual(1, len(messages)) cmlenz@787: self.assertEqual((2, 'ngettext', (None, None), []), messages[0]) cmlenz@600: cmlenz@600: def test_extract_gettext_with_unicode_string(self): cmlenz@600: tmpl = MarkupTemplate(""" cmlenz@600: ${gettext("Grüße")} cmlenz@600: """) cmlenz@600: translator = Translator() cmlenz@600: messages = list(translator.extract(tmpl.stream)) cmlenz@600: self.assertEqual(1, len(messages)) cmlenz@787: self.assertEqual((2, 'gettext', u'Gr\xfc\xdfe', []), messages[0]) cmlenz@600: cmlenz@485: def test_extract_included_attribute_text(self): cmlenz@485: tmpl = MarkupTemplate(""" cmlenz@485: cmlenz@485: """) cmlenz@485: translator = Translator() cmlenz@485: messages = list(translator.extract(tmpl.stream)) cmlenz@485: self.assertEqual(1, len(messages)) cmlenz@858: self.assertEqual((2, None, 'Foo', []), messages[0]) cmlenz@485: cmlenz@485: def test_extract_attribute_expr(self): cmlenz@485: tmpl = MarkupTemplate(""" cmlenz@485: cmlenz@485: """) cmlenz@485: translator = Translator() cmlenz@485: messages = list(translator.extract(tmpl.stream)) cmlenz@485: self.assertEqual(1, len(messages)) cmlenz@858: self.assertEqual((2, '_', 'Save', []), messages[0]) cmlenz@485: cmlenz@485: def test_extract_non_included_attribute_interpolated(self): cmlenz@485: tmpl = MarkupTemplate(""" cmlenz@485: Foo cmlenz@485: """) cmlenz@485: translator = Translator() cmlenz@485: messages = list(translator.extract(tmpl.stream)) cmlenz@485: self.assertEqual(1, len(messages)) cmlenz@858: self.assertEqual((2, None, 'Foo', []), messages[0]) cmlenz@485: cmlenz@485: def test_extract_text_from_sub(self): cmlenz@485: tmpl = MarkupTemplate(""" cmlenz@485:(c) 2007 Edgewall Software
cmlenz@522: """) cmlenz@522: translator = Translator() cmlenz@522: messages = list(translator.extract(tmpl.stream)) cmlenz@522: self.assertEqual(0, len(messages)) cmlenz@522: cmlenz@522: def test_extract_tag_with_variable_xml_lang(self): cmlenz@522: tmpl = MarkupTemplate(""" cmlenz@522:(c) 2007 Edgewall Software
cmlenz@522: """) cmlenz@522: translator = Translator() cmlenz@522: messages = list(translator.extract(tmpl.stream)) cmlenz@522: self.assertEqual(1, len(messages)) cmlenz@858: self.assertEqual((2, None, '(c) 2007 Edgewall Software', []), cmlenz@787: messages[0]) cmlenz@522: cmlenz@535: def test_ignore_attribute_with_expression(self): cmlenz@535: tmpl = MarkupTemplate(""" cmlenz@535: cmlenz@535: """) cmlenz@535: translator = Translator() cmlenz@535: messages = list(translator.extract(tmpl.stream)) cmlenz@535: self.assertEqual(0, len(messages)) cmlenz@535: cmlenz@894: def test_translate_with_translations_object(self): cmlenz@894: tmpl = MarkupTemplate(""" cmlenz@894:Foo
cmlenz@894: """) cmlenz@894: translator = Translator(DummyTranslations({'Foo': 'Voh'})) cmlenz@894: translator.setup(tmpl) cmlenz@894: self.assertEqual(""" cmlenz@894:Voh
cmlenz@894: """, tmpl.generate().render()) cmlenz@894: cmlenz@894: cmlenz@894: class MsgDirectiveTestCase(unittest.TestCase): cmlenz@894: cmlenz@560: def test_extract_i18n_msg(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:cmlenz@560: Please see Help for details. cmlenz@560:
cmlenz@560: """) cmlenz@560: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@560: messages = list(translator.extract(tmpl.stream)) cmlenz@560: self.assertEqual(1, len(messages)) cmlenz@560: self.assertEqual('Please see [1:Help] for details.', messages[0][2]) cmlenz@560: cmlenz@560: def test_translate_i18n_msg(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:cmlenz@560: Please see Help for details. cmlenz@560:
cmlenz@560: """) cmlenz@560: gettext = lambda s: u"Für Details siehe bitte [1:Hilfe]." cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@560:Für Details siehe bitte Hilfe.
hodgestar@933: """.encode('utf-8'), tmpl.generate().render(encoding='utf-8')) cmlenz@560: cmlenz@869: def test_extract_i18n_msg_nonewline(self): cmlenz@869: tmpl = MarkupTemplate(""" cmlenz@869:Please see Help
cmlenz@869: """) cmlenz@869: translator = Translator() cmlenz@869: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@869: messages = list(translator.extract(tmpl.stream)) cmlenz@869: self.assertEqual(1, len(messages)) cmlenz@869: self.assertEqual('Please see [1:Help]', messages[0][2]) cmlenz@869: cmlenz@869: def test_translate_i18n_msg_nonewline(self): cmlenz@869: tmpl = MarkupTemplate(""" cmlenz@869:Please see Help
cmlenz@869: """) cmlenz@869: gettext = lambda s: u"Für Details siehe bitte [1:Hilfe]" cmlenz@869: translator = Translator(gettext) cmlenz@869: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@869:Für Details siehe bitte Hilfe
cmlenz@869: """, tmpl.generate().render()) cmlenz@869: cmlenz@869: def test_extract_i18n_msg_elt_nonewline(self): cmlenz@869: tmpl = MarkupTemplate(""" cmlenz@869:cmlenz@892: Please see Help cmlenz@892:
cmlenz@892: """) cmlenz@892: translator = Translator() cmlenz@892: translator.setup(tmpl) cmlenz@892: messages = list(translator.extract(tmpl.stream)) cmlenz@892: self.assertEqual(3, len(messages)) cmlenz@892: self.assertEqual('A helpful paragraph', messages[0][2]) cmlenz@892: self.assertEqual(3, messages[0][0]) cmlenz@892: self.assertEqual('Click for help', messages[1][2]) cmlenz@892: self.assertEqual(4, messages[1][0]) cmlenz@892: self.assertEqual('Please see [1:Help]', messages[2][2]) cmlenz@892: self.assertEqual(3, messages[2][0]) cmlenz@892: cmlenz@892: def test_translate_i18n_msg_with_attributes(self): cmlenz@892: tmpl = MarkupTemplate(""" cmlenz@892:cmlenz@892: Please see Help cmlenz@892:
cmlenz@892: """) cmlenz@892: translator = Translator(lambda msgid: { cmlenz@892: 'A helpful paragraph': 'Ein hilfreicher Absatz', cmlenz@892: 'Click for help': u'Klicken für Hilfe', cmlenz@892: 'Please see [1:Help]': u'Siehe bitte [1:Hilfe]' cmlenz@892: }[msgid]) cmlenz@892: translator.setup(tmpl) cmlenz@892: self.assertEqual(u""" cmlenz@892:Siehe bitte Hilfe
cmlenz@892: """, tmpl.generate().render(encoding=None)) cmlenz@892: cmlenz@893: def test_extract_i18n_msg_with_dynamic_attributes(self): cmlenz@893: tmpl = MarkupTemplate(""" cmlenz@893:cmlenz@893: Please see Help cmlenz@893:
cmlenz@893: """) cmlenz@893: translator = Translator() cmlenz@893: translator.setup(tmpl) cmlenz@893: messages = list(translator.extract(tmpl.stream)) cmlenz@893: self.assertEqual(3, len(messages)) cmlenz@893: self.assertEqual('A helpful paragraph', messages[0][2]) cmlenz@893: self.assertEqual(3, messages[0][0]) cmlenz@893: self.assertEqual('Click for help', messages[1][2]) cmlenz@893: self.assertEqual(4, messages[1][0]) cmlenz@893: self.assertEqual('Please see [1:Help]', messages[2][2]) cmlenz@893: self.assertEqual(3, messages[2][0]) cmlenz@893: cmlenz@893: def test_translate_i18n_msg_with_dynamic_attributes(self): cmlenz@893: tmpl = MarkupTemplate(""" cmlenz@893:cmlenz@893: Please see Help cmlenz@893:
cmlenz@893: """) cmlenz@893: translator = Translator(lambda msgid: { cmlenz@893: 'A helpful paragraph': 'Ein hilfreicher Absatz', cmlenz@893: 'Click for help': u'Klicken für Hilfe', cmlenz@893: 'Please see [1:Help]': u'Siehe bitte [1:Hilfe]' cmlenz@893: }[msgid]) cmlenz@893: translator.setup(tmpl) cmlenz@893: self.assertEqual(u""" cmlenz@893:Siehe bitte Hilfe
cmlenz@893: """, tmpl.generate(_=translator.translate).render(encoding=None)) cmlenz@893: cmlenz@893: def test_extract_i18n_msg_as_element_with_attributes(self): cmlenz@892: tmpl = MarkupTemplate(""" cmlenz@892:cmlenz@560: Please see Help page for details. cmlenz@560:
cmlenz@560: """) cmlenz@560: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@560: messages = list(translator.extract(tmpl.stream)) cmlenz@560: self.assertEqual(1, len(messages)) cmlenz@560: self.assertEqual('Please see [1:[2:Help] page] for details.', cmlenz@560: messages[0][2]) cmlenz@560: cmlenz@560: def test_translate_i18n_msg_nested(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:cmlenz@560: Please see Help page for details. cmlenz@560:
cmlenz@560: """) cmlenz@560: gettext = lambda s: u"Für Details siehe bitte [1:[2:Hilfeseite]]." cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@560:Für Details siehe bitte Hilfeseite.
cmlenz@560: """, tmpl.generate().render()) cmlenz@560: cmlenz@849: def test_extract_i18n_msg_label_with_nested_input(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:cmlenz@560: Show me entries per page. cmlenz@560:
cmlenz@560: """) cmlenz@560: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@560: messages = list(translator.extract(tmpl.stream)) cmlenz@560: self.assertEqual(1, len(messages)) cmlenz@560: self.assertEqual('Show me [1:] entries per page.', messages[0][2]) cmlenz@560: cmlenz@560: def test_translate_i18n_msg_empty(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:cmlenz@560: Show me entries per page. cmlenz@560:
cmlenz@560: """) cmlenz@560: gettext = lambda s: u"[1:] Einträge pro Seite anzeigen." cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@560:Einträge pro Seite anzeigen.
cmlenz@560: """, tmpl.generate().render()) cmlenz@560: cmlenz@560: def test_extract_i18n_msg_multiple(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:cmlenz@560: Please see Help for details. cmlenz@560:
cmlenz@560: """) cmlenz@560: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@560: messages = list(translator.extract(tmpl.stream)) cmlenz@560: self.assertEqual(1, len(messages)) cmlenz@560: self.assertEqual('Please see [1:Help] for [2:details].', messages[0][2]) cmlenz@560: cmlenz@560: def test_translate_i18n_msg_multiple(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:cmlenz@560: Please see Help for details. cmlenz@560:
cmlenz@560: """) cmlenz@560: gettext = lambda s: u"Für [2:Details] siehe bitte [1:Hilfe]." cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@560:Für Details siehe bitte Hilfe.
cmlenz@560: """, tmpl.generate().render()) cmlenz@560: cmlenz@560: def test_extract_i18n_msg_multiple_empty(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:cmlenz@560: Show me entries per page, starting at page . cmlenz@560:
cmlenz@560: """) cmlenz@560: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@560: messages = list(translator.extract(tmpl.stream)) cmlenz@560: self.assertEqual(1, len(messages)) cmlenz@560: self.assertEqual('Show me [1:] entries per page, starting at page [2:].', cmlenz@560: messages[0][2]) cmlenz@560: cmlenz@560: def test_translate_i18n_msg_multiple_empty(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:cmlenz@560: Show me entries per page, starting at page . cmlenz@560:
hodgestar@933: """, encoding='utf-8') cmlenz@560: gettext = lambda s: u"[1:] Einträge pro Seite, beginnend auf Seite [2:]." cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" hodgestar@933:Eintr\u00E4ge pro Seite, beginnend auf Seite .
hodgestar@933: """.encode('utf-8'), tmpl.generate().render(encoding='utf-8')) cmlenz@560: cmlenz@776: def test_extract_i18n_msg_with_param(self): cmlenz@776: tmpl = MarkupTemplate(""" cmlenz@776:cmlenz@776: Hello, ${user.name}! cmlenz@776:
cmlenz@776: """) cmlenz@776: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@776: messages = list(translator.extract(tmpl.stream)) cmlenz@776: self.assertEqual(1, len(messages)) cmlenz@776: self.assertEqual('Hello, %(name)s!', messages[0][2]) cmlenz@776: cmlenz@776: def test_translate_i18n_msg_with_param(self): cmlenz@776: tmpl = MarkupTemplate(""" cmlenz@776:cmlenz@776: Hello, ${user.name}! cmlenz@776:
cmlenz@776: """) cmlenz@776: gettext = lambda s: u"Hallo, %(name)s!" cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) cmlenz@776: self.assertEqual(""" cmlenz@776:Hallo, Jim!
cmlenz@776: """, tmpl.generate(user=dict(name='Jim')).render()) cmlenz@776: cmlenz@776: def test_translate_i18n_msg_with_param_reordered(self): cmlenz@776: tmpl = MarkupTemplate(""" cmlenz@776:cmlenz@776: Hello, ${user.name}! cmlenz@776:
cmlenz@776: """) cmlenz@776: gettext = lambda s: u"%(name)s, sei gegrüßt!" cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@776:Jim, sei gegrüßt!
cmlenz@776: """, tmpl.generate(user=dict(name='Jim')).render()) cmlenz@776: cmlenz@785: def test_translate_i18n_msg_with_attribute_param(self): cmlenz@785: tmpl = MarkupTemplate(""" cmlenz@785:cmlenz@785: Hello, dude! cmlenz@785:
cmlenz@785: """) cmlenz@785: gettext = lambda s: u"Sei gegrüßt, [1:Alter]!" cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@785:Sei gegrüßt, Alter!
cmlenz@785: """, tmpl.generate(anchor='42').render()) cmlenz@785: cmlenz@776: def test_extract_i18n_msg_with_two_params(self): cmlenz@776: tmpl = MarkupTemplate(""" cmlenz@776:cmlenz@776: Posted by ${post.author} at ${entry.time.strftime('%H:%m')} cmlenz@776:
cmlenz@776: """) cmlenz@776: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@776: messages = list(translator.extract(tmpl.stream)) cmlenz@776: self.assertEqual(1, len(messages)) cmlenz@776: self.assertEqual('Posted by %(name)s at %(time)s', messages[0][2]) cmlenz@776: cmlenz@776: def test_translate_i18n_msg_with_two_params(self): cmlenz@776: tmpl = MarkupTemplate(""" cmlenz@776:cmlenz@776: Written by ${entry.author} at ${entry.time.strftime('%H:%M')} cmlenz@776:
cmlenz@776: """) cmlenz@776: gettext = lambda s: u"%(name)s schrieb dies um %(time)s" cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) cmlenz@776: entry = { cmlenz@776: 'author': 'Jim', cmlenz@776: 'time': datetime(2008, 4, 1, 14, 30) cmlenz@776: } cmlenz@776: self.assertEqual(""" cmlenz@776:Jim schrieb dies um 14:30
cmlenz@776: """, tmpl.generate(entry=entry).render()) cmlenz@776: cmlenz@560: def test_extract_i18n_msg_with_directive(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:cmlenz@560: Show me entries per page. cmlenz@560:
cmlenz@560: """) cmlenz@560: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@560: messages = list(translator.extract(tmpl.stream)) cmlenz@560: self.assertEqual(1, len(messages)) cmlenz@560: self.assertEqual('Show me [1:] entries per page.', messages[0][2]) cmlenz@560: cmlenz@849: def test_translate_i18n_msg_with_directive(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:cmlenz@849: Show me entries per page. cmlenz@849:
cmlenz@849: """) cmlenz@849: gettext = lambda s: u"[1:] Einträge pro Seite anzeigen." cmlenz@849: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@849:Einträge pro Seite anzeigen.
cmlenz@849: """, tmpl.generate().render()) cmlenz@560: cmlenz@787: def test_extract_i18n_msg_with_comment(self): cmlenz@787: tmpl = MarkupTemplate(""" cmlenz@849:Foo
cmlenz@849: """) cmlenz@849: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@849: messages = list(translator.extract(tmpl.stream)) cmlenz@849: self.assertEqual(1, len(messages)) cmlenz@858: self.assertEqual((3, None, 'Foo', ['As in foo bar']), messages[0]) cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@787:Foo
cmlenz@787: """) cmlenz@787: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@787: messages = list(translator.extract(tmpl.stream)) cmlenz@787: self.assertEqual(1, len(messages)) cmlenz@858: self.assertEqual((3, None, 'Foo', ['As in foo bar']), messages[0]) cmlenz@787: cmlenz@787: def test_translate_i18n_msg_with_comment(self): cmlenz@787: tmpl = MarkupTemplate(""" cmlenz@787:Foo
cmlenz@787: """) cmlenz@787: gettext = lambda s: u"Voh" cmlenz@790: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) cmlenz@787: self.assertEqual(""" cmlenz@787:Voh
cmlenz@787: """, tmpl.generate().render()) cmlenz@787: cmlenz@790: def test_extract_i18n_msg_with_attr(self): cmlenz@790: tmpl = MarkupTemplate(""" cmlenz@790:Foo
cmlenz@790: """) cmlenz@790: translator = Translator() cmlenz@790: messages = list(translator.extract(tmpl.stream)) cmlenz@790: self.assertEqual(2, len(messages)) cmlenz@858: self.assertEqual((3, None, 'Foo bar', []), messages[0]) cmlenz@858: self.assertEqual((3, None, 'Foo', []), messages[1]) cmlenz@790: cmlenz@790: def test_translate_i18n_msg_with_attr(self): cmlenz@790: tmpl = MarkupTemplate(""" cmlenz@790:Foo
cmlenz@790: """) cmlenz@790: gettext = lambda s: u"Voh" cmlenz@790: translator = Translator(DummyTranslations({ cmlenz@858: 'Foo': 'Voh', cmlenz@790: 'Foo bar': u'Voh bär' cmlenz@790: })) cmlenz@790: tmpl.filters.insert(0, translator) cmlenz@790: tmpl.add_directives(Translator.NAMESPACE, translator) hodgestar@933: self.assertEqual(u""" cmlenz@790:Voh
cmlenz@790: """, tmpl.generate().render()) cmlenz@790: cmlenz@849: def test_translate_i18n_msg_and_py_strip_directives(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:Foo
cmlenz@849:Foo
cmlenz@849: """) cmlenz@849: translator = Translator(DummyTranslations({'Foo': 'Voh'})) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@849: Voh cmlenz@849: Voh cmlenz@849: """, tmpl.generate().render()) cmlenz@849: cmlenz@849: def test_i18n_msg_ticket_300_extract(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:Translation[ 0 ]: One coin
cmlenz@849: """) cmlenz@849: translator = Translator() cmlenz@849: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@849: messages = list(translator.extract(tmpl.stream)) cmlenz@849: self.assertEqual(1, len(messages)) cmlenz@849: self.assertEqual( cmlenz@849: (3, None, u'[1:[2:Translation\\[\xa00\xa0\\]]: [3:One coin]]', []), messages[0] cmlenz@849: ) cmlenz@849: cmlenz@849: def test_i18n_msg_ticket_251_translate(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:Translation[ 0 ]: One coin
cmlenz@849: """) cmlenz@849: translations = DummyTranslations({ cmlenz@849: u'[1:[2:Translation\\[\xa00\xa0\\]]: [3:One coin]]': cmlenz@849: u'[1:[2:Trandução\\[\xa00\xa0\\]]: [3:Uma moeda]]' cmlenz@849: }) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@849:Trandução[ 0 ]: Uma moeda
hodgestar@933: """.encode('utf-8'), tmpl.generate().render(encoding='utf-8')) cmlenz@849: cmlenz@849: def test_extract_i18n_msg_with_other_directives_nested(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:Before you do that, though, please first try cmlenz@849: searching cmlenz@849: for similar issues, as it is quite likely that this problem cmlenz@849: has been reported before. For questions about installation cmlenz@849: and configuration of Trac, please try the cmlenz@849: mailing list cmlenz@849: instead of filing a ticket. cmlenz@849:
cmlenz@849: """) cmlenz@849: translator = Translator() cmlenz@849: translator.setup(tmpl) cmlenz@849: messages = list(translator.extract(tmpl.stream)) cmlenz@849: self.assertEqual(1, len(messages)) cmlenz@849: self.assertEqual( cmlenz@858: 'Before you do that, though, please first try\n ' cmlenz@858: '[1:[2:searching]\n for similar issues], as it is ' cmlenz@858: 'quite likely that this problem\n has been reported ' cmlenz@858: 'before. For questions about installation\n and ' cmlenz@858: 'configuration of Trac, please try the\n ' cmlenz@858: '[3:mailing list]\n instead of filing a ticket.', cmlenz@849: messages[0][2] cmlenz@849: ) cmlenz@849: cmlenz@849: def test_translate_i18n_msg_with_other_directives_nested(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:Before you do that, though, please first try cmlenz@849: searching cmlenz@849: for similar issues, as it is quite likely that this problem cmlenz@849: has been reported before. For questions about installation cmlenz@849: and configuration of Trac, please try the cmlenz@849: mailing list cmlenz@849: instead of filing a ticket. cmlenz@849:
cmlenz@849: """) cmlenz@849: translations = DummyTranslations({ cmlenz@858: 'Before you do that, though, please first try\n ' cmlenz@858: '[1:[2:searching]\n for similar issues], as it is ' cmlenz@858: 'quite likely that this problem\n has been reported ' cmlenz@858: 'before. For questions about installation\n and ' cmlenz@858: 'configuration of Trac, please try the\n ' cmlenz@858: '[3:mailing list]\n instead of filing a ticket.': cmlenz@849: u'Antes de o fazer, porém,\n ' cmlenz@849: u'[1:por favor tente [2:procurar]\n por problemas semelhantes], uma vez que ' cmlenz@849: u'é muito provável que este problema\n já tenha sido reportado ' cmlenz@849: u'anteriormente. Para questões relativas à instalação\n e ' cmlenz@849: u'configuração do Trac, por favor tente a\n ' cmlenz@849: u'[3:mailing list]\n em vez de criar um assunto.' cmlenz@849: }) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: messages = list(translator.extract(tmpl.stream)) cmlenz@849: self.assertEqual(1, len(messages)) cmlenz@849: ctx = Context() cmlenz@849: ctx.push({'trac': {'homepage': 'http://trac.edgewall.org/'}}) hodgestar@933: self.assertEqual(u""" cmlenz@849:Antes de o fazer, porém, cmlenz@849: por favor tente procurar cmlenz@849: por problemas semelhantes, uma vez que é muito provável que este problema cmlenz@849: já tenha sido reportado anteriormente. Para questões relativas à instalação cmlenz@849: e configuração do Trac, por favor tente a cmlenz@849: mailing list cmlenz@849: em vez de criar um assunto.
cmlenz@849: """, tmpl.generate(ctx).render()) cmlenz@849: cmlenz@849: def test_i18n_msg_with_other_nested_directives_with_reordered_content(self): cmlenz@849: # See: http://genshi.edgewall.org/ticket/300#comment:10 cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849: Note: This repository is defined in
cmlenz@849: trac.ini
cmlenz@849: and cannot be edited on this page.
cmlenz@849:
Nota: Este repositório está definido em
cmlenz@849: trac.ini
cmlenz@849: e não pode ser editado nesta página.
cmlenz@894: Please see Help for details. cmlenz@894:
cmlenz@849: """) cmlenz@894: translator = Translator() cmlenz@894: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@894: messages = list(translator.extract(tmpl.stream)) cmlenz@894: self.assertEqual(1, len(messages)) cmlenz@894: self.assertEqual((3, None, 'Please see [1:Help] for details.', []), cmlenz@894: messages[0]) cmlenz@849: cmlenz@894: def test_extract_i18n_msg_with_py_strip_and_comment(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@894:cmlenz@894: Please see Help for details. cmlenz@894:
cmlenz@849: """) cmlenz@894: translator = Translator() cmlenz@894: tmpl.add_directives(Translator.NAMESPACE, translator) cmlenz@894: messages = list(translator.extract(tmpl.stream)) cmlenz@894: self.assertEqual(1, len(messages)) cmlenz@894: self.assertEqual((3, None, 'Please see [1:Help] for details.', cmlenz@894: ['Foo']), messages[0]) cmlenz@894: cmlenz@894: def test_translate_i18n_msg_and_comment_with_py_strip_directives(self): cmlenz@894: tmpl = MarkupTemplate(""" cmlenz@894:Foo
cmlenz@894:Foo
cmlenz@894: """) cmlenz@894: translator = Translator(DummyTranslations({'Foo': 'Voh'})) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@894: Voh cmlenz@894: Voh cmlenz@849: """, tmpl.generate().render()) cmlenz@849: hodgestar@952: def test_translate_i18n_msg_ticket_404(self): hodgestar@952: tmpl = MarkupTemplate(""" hodgestar@952:hodgestar@952: $first $second KEPT Inside a tag tail hodgestar@952:
""") hodgestar@952: translator = Translator(DummyTranslations()) hodgestar@952: translator.setup(tmpl) hodgestar@952: self.assertEqual(""" hodgestar@952:FIRST SECOND KEPT Inside a tag tail""" hodgestar@952: """
""", hodgestar@952: tmpl.generate(first="FIRST", second="SECOND").render()) hodgestar@952: hodgestar@1016: def test_translate_i18n_msg_ticket_404_regression(self): hodgestar@1016: tmpl = MarkupTemplate(""" hodgestar@1016:FooBar
cmlenz@849:FooBars
cmlenz@849:FooBar
cmlenz@849:FooBars
cmlenz@849:FooBar
cmlenz@849:FooBars
cmlenz@849:FooBar
cmlenz@849:FooBars
cmlenz@849:FooBar
cmlenz@849:FooBars
cmlenz@849:FooBars
cmlenz@849:FooBar
cmlenz@849: """, tmpl.generate(one=1, two=2).render()) cmlenz@892: palgarvio@873: def test_translate_i18n_choose_as_directive_singular_and_plural_with_strip(self): palgarvio@873: tmpl = MarkupTemplate(""" palgarvio@873:FooBar Singular with Strip
palgarvio@873:FooBars Plural without Strip
palgarvio@873:FooBar singular without strip
palgarvio@873:FooBars plural with strip
palgarvio@873:FooBar singular without strip
palgarvio@873:FooBars plural with strip
palgarvio@873:FooBar singular with strip
palgarvio@873:FooBars plural without strip
palgarvio@873:FooBars Plural without Strip
palgarvio@873: FooBars plural with strip palgarvio@873:FooBar singular without strip
palgarvio@873: FooBar singular with strip palgarvio@873: """, tmpl.generate(one=1, two=2).render()) cmlenz@849: palgarvio@871: def test_translate_i18n_choose_plural_singular_as_directive(self): palgarvio@871: # Ticket 371 palgarvio@871: tmpl = MarkupTemplate(""" palgarvio@871:Foo $fname $lname
cmlenz@849:Foos $fname $lname
cmlenz@849:Vohs John Doe
cmlenz@849:Foo $fname $lname
cmlenz@849:Foos $fname $lname
cmlenz@849:Vohs John Doe
cmlenz@849:Foo ${fname} ${lname}
cmlenz@849:Foos ${fname} ${lname}
cmlenz@849:Foo ${fname} ${lname}
cmlenz@849:Foos ${fname} ${lname}
cmlenz@849:Vohs John Doe
cmlenz@849:Voh John Doe
cmlenz@849: """, tmpl.generate(one=1, two=2, cmlenz@849: fname='John', lname='Doe').render()) cmlenz@849: cmlenz@849: def test_translate_i18n_choose_as_directive_with_params_and_domain_as_directive(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:Foo ${fname} ${lname}
cmlenz@849:Foos ${fname} ${lname}
cmlenz@849:Foo ${fname} ${lname}
cmlenz@849:Foos ${fname} ${lname}
cmlenz@849:Vohs John Doe
cmlenz@849:Foo John Doe
cmlenz@849: """, tmpl.generate(one=1, two=2, cmlenz@849: fname='John', lname='Doe').render()) cmlenz@849: cmlenz@849: def test_extract_i18n_choose_as_attribute(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:FooBar
cmlenz@849:FooBars
cmlenz@849:FooBar
cmlenz@849:FooBars
cmlenz@849:FooBar
cmlenz@849:FooBars
cmlenz@849:FooBar
cmlenz@849:FooBars
cmlenz@849:Foo $fname $lname
cmlenz@849:Foos $fname $lname
cmlenz@849:Foo $fname $lname
cmlenz@849:Foos $fname $lname
cmlenz@849:Foo ${fname} ${lname}
cmlenz@849:Foos ${fname} ${lname}
cmlenz@849:Foo ${fname} ${lname}
cmlenz@849:Foos ${fname} ${lname}
cmlenz@849:Foo ${fname} ${lname}
cmlenz@849:Foos ${fname} ${lname}
cmlenz@849:Foo ${fname} ${lname}
cmlenz@849:Foos ${fname} ${lname}
cmlenz@849:Foo $fname $lname
cmlenz@849:Foos $fname $lname
cmlenz@849:Foo ${fname} ${lname}
cmlenz@849:Foos ${fname} ${lname}
cmlenz@849:
cmlenz@892:
cmlenz@892:
cmlenz@892: Da ist 1 Sache. cmlenz@892:
cmlenz@892: """, tmpl.generate(link="/things", num=1).render(encoding=None)) cmlenz@892: self.assertEqual(u""" cmlenz@892:cmlenz@892: Da sind 3 Sachen. cmlenz@892:
cmlenz@892: """, tmpl.generate(link="/things", num=3).render(encoding=None)) cmlenz@892: cmlenz@892: def test_extract_i18n_choose_as_element_with_attributes(self): cmlenz@892: tmpl = MarkupTemplate(""" cmlenz@892:cmlenz@892: There is ${num} thing. cmlenz@892:
cmlenz@892:cmlenz@892: There are ${num} things. cmlenz@892:
cmlenz@892:cmlenz@892: There is ${num} thing. cmlenz@892:
cmlenz@892:cmlenz@892: There are ${num} things. cmlenz@892:
cmlenz@892:Da ist 1 Sache.
cmlenz@892: """, tmpl.generate(link="/things", num=1).render(encoding=None)) cmlenz@892: self.assertEqual(u""" cmlenz@892:Da sind 3 Sachen.
cmlenz@892: """, tmpl.generate(link="/things", num=3).render(encoding=None)) cmlenz@892: cmlenz@849: def test_translate_i18n_choose_and_py_strip(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:Foo $fname $lname
cmlenz@849:Foos $fname $lname
cmlenz@849:Vohs John Doe
cmlenz@849:Foo $fname $lname
cmlenz@849:Foos $fname $lname
cmlenz@849:Vohs John Doe
cmlenz@849:Foo $fname $lname
palgarvio@871:Foos $fname $lname
palgarvio@871:Foo $fname $lname
palgarvio@873:Foos $fname $lname
palgarvio@873:Vohs John Doe
palgarvio@871:Foo $fname $lname
palgarvio@871:Foos $fname $lname
palgarvio@871:FooBar
cmlenz@849:FooBars
cmlenz@849:FooBar
cmlenz@894:Bar
cmlenz@894:BarFoo
cmlenz@894:PT_Foo
cmlenz@894:FooBar
cmlenz@894: """) cmlenz@894: translations = DummyTranslations({'Bar': 'Voh'}) cmlenz@894: translations.add_domain('foo', {'FooBar': 'BarFoo'}) cmlenz@894: translator = Translator(translations) cmlenz@894: translator.setup(tmpl) cmlenz@894: self.assertEqual(""" cmlenz@894:BarFoo
cmlenz@894: """, tmpl.generate().render()) cmlenz@894: cmlenz@894: def test_translate_i18n_domain_without_msg_directives(self): cmlenz@894: #"""translate domain call without i18n:msg directives still uses current domain""" cmlenz@894: cmlenz@894: tmpl = MarkupTemplate(""" cmlenz@894:Bar
cmlenz@894:FooBar
cmlenz@894:Bar
cmlenz@894:Bar
cmlenz@894:Bar
cmlenz@894: """) cmlenz@894: translations = DummyTranslations({'Bar': 'Voh'}) cmlenz@894: translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) cmlenz@894: translator = Translator(translations) cmlenz@894: translator.setup(tmpl) cmlenz@894: self.assertEqual(""" cmlenz@894:Voh
cmlenz@894:BarFoo
cmlenz@894:PT_Foo
cmlenz@894:PT_Foo
cmlenz@894:Voh
cmlenz@894: """, tmpl.generate().render()) cmlenz@894: cmlenz@894: def test_translate_i18n_domain_as_directive_not_attribute(self): cmlenz@894: #"""translate with domain as directive""" cmlenz@894: cmlenz@894: tmpl = MarkupTemplate(""" cmlenz@894:FooBar
cmlenz@894:Bar
cmlenz@894:Bar
cmlenz@894:Bar
cmlenz@894: """) cmlenz@894: translations = DummyTranslations({'Bar': 'Voh'}) cmlenz@894: translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'PT_Foo'}) cmlenz@894: translator = Translator(translations) cmlenz@894: translator.setup(tmpl) cmlenz@894: self.assertEqual(""" cmlenz@894:BarFoo
cmlenz@894:PT_Foo
cmlenz@894:PT_Foo
cmlenz@894:Voh
cmlenz@894: """, tmpl.generate().render()) cmlenz@894: cmlenz@894: def test_translate_i18n_domain_nested_directives(self): cmlenz@894: #"""translate with nested i18n:domain directives""" cmlenz@894: cmlenz@894: tmpl = MarkupTemplate(""" cmlenz@894:Bar
cmlenz@894:FooBar
cmlenz@894:Bar
cmlenz@894:Bar
cmlenz@894:Bar
cmlenz@894: """) cmlenz@894: translations = DummyTranslations({'Bar': 'Voh'}) cmlenz@894: translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'foo_Bar'}) cmlenz@894: translations.add_domain('bar', {'Bar': 'bar_Bar'}) cmlenz@894: translator = Translator(translations) cmlenz@894: translator.setup(tmpl) cmlenz@894: self.assertEqual(""" cmlenz@894:Voh
cmlenz@894:BarFoo
cmlenz@894:bar_Bar
cmlenz@894:foo_Bar
cmlenz@894:Voh
cmlenz@894: """, tmpl.generate().render()) cmlenz@894: cmlenz@894: def test_translate_i18n_domain_with_empty_nested_domain_directive(self): cmlenz@894: #"""translate with empty nested i18n:domain directive does not use dngettext""" cmlenz@894: cmlenz@894: tmpl = MarkupTemplate(""" cmlenz@894:Bar
cmlenz@894:FooBar
cmlenz@894:Bar
cmlenz@894:Bar
cmlenz@894:Bar
cmlenz@894: """) cmlenz@894: translations = DummyTranslations({'Bar': 'Voh'}) cmlenz@894: translations.add_domain('foo', {'FooBar': 'BarFoo', 'Bar': 'foo_Bar'}) cmlenz@894: translations.add_domain('bar', {'Bar': 'bar_Bar'}) cmlenz@894: translator = Translator(translations) cmlenz@894: translator.setup(tmpl) cmlenz@894: self.assertEqual(""" cmlenz@894:Voh
cmlenz@894:BarFoo
cmlenz@894:Voh
cmlenz@894:foo_Bar
cmlenz@894:Voh
cmlenz@894: """, tmpl.generate().render()) cmlenz@894: cmlenz@849: def test_translate_i18n_domain_with_inline_directive_on_START_NS(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:FooBar
cmlenz@849: """) cmlenz@849: translations = DummyTranslations({'Bar': 'Voh'}) cmlenz@849: translations.add_domain('foo', {'FooBar': 'BarFoo'}) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@849:BarFoo
cmlenz@849: """, tmpl.generate().render()) cmlenz@849: cmlenz@849: def test_translate_i18n_domain_with_inline_directive_on_START_NS_with_py_strip(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:FooBar
cmlenz@849: """) cmlenz@849: translations = DummyTranslations({'Bar': 'Voh'}) cmlenz@849: translations.add_domain('foo', {'FooBar': 'BarFoo'}) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@849:BarFoo
cmlenz@849: """, tmpl.generate().render()) cmlenz@446: cmlenz@894: def test_translate_i18n_domain_with_nested_includes(self): cmlenz@894: import os, shutil, tempfile cmlenz@894: from genshi.template.loader import TemplateLoader cmlenz@894: dirname = tempfile.mkdtemp(suffix='genshi_test') cmlenz@894: try: cmlenz@894: for idx in range(7): cmlenz@894: file1 = open(os.path.join(dirname, 'tmpl%d.html' % idx), 'w') cmlenz@894: try: cmlenz@894: file1.write(""" cmlenz@894:Bar $idx
cmlenz@894:Bar
cmlenz@894:Bar $idx
cmlenz@894:Bar $idx
cmlenz@894:foo_Bar 0
cmlenz@894:bar_Bar
cmlenz@894:Voh 0
cmlenz@894:Voh 0
cmlenz@894:foo_Bar 1
cmlenz@894:bar_Bar
cmlenz@894:Voh 1
cmlenz@894:Voh 1
cmlenz@894:foo_Bar 2
cmlenz@894:bar_Bar
cmlenz@894:Voh 2
cmlenz@894:Voh 2
cmlenz@894:foo_Bar 3
cmlenz@894:bar_Bar
cmlenz@894:Voh 3
cmlenz@894:Voh 3
cmlenz@894:foo_Bar 4
cmlenz@894:bar_Bar
cmlenz@894:Voh 4
cmlenz@894:Voh 4
cmlenz@894:foo_Bar 5
cmlenz@894:bar_Bar
cmlenz@894:Voh 5
cmlenz@894:Voh 5
cmlenz@894:foo_Bar 6
cmlenz@894:bar_Bar
cmlenz@894:Voh 6
cmlenz@894:Voh 6
cmlenz@894: """, tmpl.generate(idx=-1).render()) cmlenz@894: finally: cmlenz@894: shutil.rmtree(dirname) cmlenz@894: cmlenz@894: def test_translate_i18n_domain_with_nested_includes_with_translatable_attrs(self): cmlenz@894: import os, shutil, tempfile cmlenz@894: from genshi.template.loader import TemplateLoader cmlenz@894: dirname = tempfile.mkdtemp(suffix='genshi_test') cmlenz@894: try: cmlenz@894: for idx in range(4): cmlenz@894: file1 = open(os.path.join(dirname, 'tmpl%d.html' % idx), 'w') cmlenz@894: try: cmlenz@894: file1.write(""" cmlenz@894:Bar $idx
cmlenz@894:Bar
cmlenz@894:Bar $idx
cmlenz@894:Bar $idx
cmlenz@894:Bar $idx
cmlenz@894:foo_Bar 0
cmlenz@894:bar_Bar
cmlenz@894:Voh 0
cmlenz@894:Voh 0
cmlenz@894:Voh 0
cmlenz@894:foo_Bar 1
cmlenz@894:bar_Bar
cmlenz@894:Voh 1
cmlenz@894:Voh 1
cmlenz@894:Voh 1
cmlenz@894:foo_Bar 2
cmlenz@894:bar_Bar
cmlenz@894:Voh 2
cmlenz@894:Voh 2
cmlenz@894:Voh 2
cmlenz@894:foo_Bar 3
cmlenz@894:bar_Bar
cmlenz@894:Voh 3
cmlenz@894:Voh 3
cmlenz@894:Voh 3
cmlenz@894: """, tmpl.generate(idx=-1, hodgestar@933: dg=dgettext).render()) cmlenz@894: finally: cmlenz@894: shutil.rmtree(dirname) cmlenz@894: cmlenz@892: cmlenz@528: class ExtractTestCase(unittest.TestCase): cmlenz@528: cmlenz@528: def test_markup_template_extraction(self): cmlenz@528: buf = StringIO(""" cmlenz@528: cmlenz@528:${_("Hello, %(name)s") % dict(name=username)}
cmlenz@528:${ngettext("You have %d item", "You have %d items", num)}
cmlenz@528: cmlenz@528: """) cmlenz@528: results = list(extract(buf, ['_', 'ngettext'], [], {})) cmlenz@528: self.assertEqual([ cmlenz@858: (3, None, 'Example', []), cmlenz@858: (6, None, 'Example', []), cmlenz@858: (7, '_', 'Hello, %(name)s', []), cmlenz@858: (8, 'ngettext', ('You have %d item', 'You have %d items', None), cmlenz@565: []), cmlenz@528: ], results) cmlenz@528: cmlenz@596: def test_extraction_without_text(self): cmlenz@596: buf = StringIO(""" cmlenz@596:Foo
cmlenz@596: ${ngettext("Singular", "Plural", num)} cmlenz@596: """) cmlenz@596: results = list(extract(buf, ['_', 'ngettext'], [], { cmlenz@596: 'extract_text': 'no' cmlenz@596: })) cmlenz@596: self.assertEqual([ cmlenz@858: (3, 'ngettext', ('Singular', 'Plural', None), []), cmlenz@596: ], results) cmlenz@596: cmlenz@528: def test_text_template_extraction(self): cmlenz@528: buf = StringIO("""${_("Dear %(name)s") % {'name': name}}, cmlenz@849: cmlenz@528: ${ngettext("Your item:", "Your items", len(items))} cmlenz@528: #for item in items cmlenz@528: * $item cmlenz@528: #end cmlenz@849: cmlenz@528: All the best, cmlenz@528: Foobar""") cmlenz@528: results = list(extract(buf, ['_', 'ngettext'], [], { cmlenz@528: 'template_class': 'genshi.template:TextTemplate' cmlenz@528: })) cmlenz@528: self.assertEqual([ cmlenz@858: (1, '_', 'Dear %(name)s', []), cmlenz@858: (3, 'ngettext', ('Your item:', 'Your items', None), []), cmlenz@858: (7, None, 'All the best,\n Foobar', []) cmlenz@528: ], results) cmlenz@528: cmlenz@565: def test_extraction_with_keyword_arg(self): cmlenz@565: buf = StringIO(""" cmlenz@565: ${gettext('Foobar', foo='bar')} cmlenz@565: """) cmlenz@565: results = list(extract(buf, ['gettext'], [], {})) cmlenz@565: self.assertEqual([ cmlenz@858: (2, 'gettext', ('Foobar'), []), cmlenz@565: ], results) cmlenz@565: cmlenz@565: def test_extraction_with_nonstring_arg(self): cmlenz@565: buf = StringIO(""" cmlenz@565: ${dgettext(curdomain, 'Foobar')} cmlenz@565: """) cmlenz@565: results = list(extract(buf, ['dgettext'], [], {})) cmlenz@565: self.assertEqual([ cmlenz@858: (2, 'dgettext', (None, 'Foobar'), []), cmlenz@565: ], results) cmlenz@565: cmlenz@549: def test_extraction_inside_ignored_tags(self): cmlenz@549: buf = StringIO(""" cmlenz@549: cmlenz@549: """) cmlenz@549: results = list(extract(buf, ['_'], [], {})) cmlenz@549: self.assertEqual([ cmlenz@858: (5, '_', 'Please wait...', []), cmlenz@549: ], results) cmlenz@549: cmlenz@549: def test_extraction_inside_ignored_tags_with_directives(self): cmlenz@549: buf = StringIO(""" cmlenz@549: cmlenz@549: """) cmlenz@549: self.assertEqual([], list(extract(buf, ['_'], [], {}))) cmlenz@549: cmlenz@849: def test_extract_py_def_directive_with_py_strip(self): cmlenz@849: # Failed extraction from Trac cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849: