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: 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@446: cmlenz@522: def test_ignore_tag_with_fixed_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(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: 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_elt_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 hodgestar@933: """.encode('utf-8'), tmpl.generate().render(encoding='utf-8')) cmlenz@869: cmlenz@892: def test_extract_i18n_msg_with_attributes(self): cmlenz@892: tmpl = MarkupTemplate(""" cmlenz@892:

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@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(2, len(messages)) cmlenz@892: self.assertEqual('Click for help', messages[0][2]) cmlenz@892: self.assertEqual(4, messages[0][0]) cmlenz@892: self.assertEqual('Please see [1:Help]', messages[1][2]) cmlenz@892: self.assertEqual(3, messages[1][0]) cmlenz@892: cmlenz@893: def test_translate_i18n_msg_as_element_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: '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@560: def test_extract_i18n_msg_nested(self): cmlenz@560: tmpl = MarkupTemplate(""" cmlenz@560:

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@849: cmlenz@849:
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('[1:[2:] days back]', cmlenz@849: messages[0][2]) cmlenz@849: cmlenz@849: def test_translate_i18n_msg_label_with_nested_input(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849: cmlenz@849:
cmlenz@849: """) cmlenz@849: gettext = lambda s: "[1:[2:] foo bar]" cmlenz@849: translator = Translator(gettext) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@849:
cmlenz@849: """, tmpl.generate().render()) cmlenz@849: cmlenz@560: def test_extract_i18n_msg_empty(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@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: cmlenz@849: Changed ${ '10/12/2008' } ago by ${ 'me, the author' } cmlenz@849: 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@858: (3, None, 'Changed %(date)s ago by %(author)s', []), messages[0] cmlenz@849: ) cmlenz@849: cmlenz@849: def test_i18n_msg_ticket_300_translate(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849: cmlenz@849: Changed ${ date } ago by ${ author } cmlenz@849: cmlenz@849: """) cmlenz@849: translations = DummyTranslations({ cmlenz@858: 'Changed %(date)s ago by %(author)s': u'Modificado à %(date)s por %(author)s' cmlenz@849: }) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) hodgestar@933: self.assertEqual(u""" cmlenz@849: Modificado à um dia por Pedro hodgestar@933: """.encode('utf-8'), tmpl.generate(date='um dia', author="Pedro").render(encoding='utf-8')) cmlenz@849: cmlenz@849: cmlenz@849: def test_i18n_msg_ticket_251_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:

cmlenz@849: """) cmlenz@849: translations = DummyTranslations({ cmlenz@858: '[1:Note:] This repository is defined in\n ' cmlenz@858: '[2:[3:trac.ini]]\n and cannot be edited on this page.': cmlenz@849: u'[1:Nota:] Este repositório está definido em \n ' cmlenz@849: u'[2:[3:trac.ini]]\n e não pode ser editado nesta página.', 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: self.assertEqual( cmlenz@858: '[1:Note:] This repository is defined in\n ' cmlenz@858: '[2:[3:trac.ini]]\n and cannot be edited on this page.', cmlenz@849: messages[0][2] cmlenz@849: ) hodgestar@933: self.assertEqual(u""" cmlenz@849:

Nota: Este repositório está definido em cmlenz@849: trac.ini cmlenz@849: e não pode ser editado nesta página.

hodgestar@933: """.encode('utf-8'), tmpl.generate(editable=False).render(encoding='utf-8')) cmlenz@849: cmlenz@894: def test_extract_i18n_msg_with_py_strip(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: 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:

text $name

hodgestar@1016: """) hodgestar@1016: gettext = lambda s: u'head [1:%(name)s] tail' hodgestar@1016: translator = Translator(gettext) hodgestar@1016: translator.setup(tmpl) hodgestar@1016: self.assertEqual(""" hodgestar@1016:

head NAME tail

hodgestar@1016: """, tmpl.generate(name='NAME').render()) hodgestar@1016: cmlenz@849: cmlenz@894: class ChooseDirectiveTestCase(unittest.TestCase): cmlenz@849: cmlenz@849: def test_translate_i18n_choose_as_attribute(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849:

FooBar

cmlenz@849:

FooBars

cmlenz@849:
cmlenz@849:
cmlenz@849:

FooBar

cmlenz@849:

FooBars

cmlenz@849:
cmlenz@849: """) cmlenz@849: translations = DummyTranslations() cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@849:
cmlenz@849:

FooBar

cmlenz@849:
cmlenz@849:
cmlenz@849:

FooBars

cmlenz@849:
cmlenz@849: """, tmpl.generate(one=1, two=2).render()) cmlenz@849: cmlenz@849: def test_translate_i18n_choose_as_directive(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849: cmlenz@849:

FooBar

cmlenz@849:

FooBars

cmlenz@849:
cmlenz@849: cmlenz@849:

FooBar

cmlenz@849:

FooBars

cmlenz@849:
cmlenz@849: """) cmlenz@849: translations = DummyTranslations() cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" 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: palgarvio@873:

FooBar Singular with Strip

palgarvio@873:

FooBars Plural without Strip

palgarvio@873:
palgarvio@873: palgarvio@873:

FooBar singular without strip

palgarvio@873:

FooBars plural with strip

palgarvio@873:
palgarvio@873: palgarvio@873:

FooBar singular without strip

palgarvio@873:

FooBars plural with strip

palgarvio@873:
palgarvio@873: palgarvio@873:

FooBar singular with strip

palgarvio@873:

FooBars plural without strip

palgarvio@873:
palgarvio@873: """) palgarvio@873: translations = DummyTranslations() palgarvio@873: translator = Translator(translations) palgarvio@873: translator.setup(tmpl) palgarvio@873: self.assertEqual(""" 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: palgarvio@871: FooBar palgarvio@871: FooBars palgarvio@871: palgarvio@871: palgarvio@871: FooBar palgarvio@871: FooBars palgarvio@871: palgarvio@871: """) palgarvio@871: translations = DummyTranslations({ palgarvio@871: ('FooBar', 0): 'FuBar', palgarvio@871: ('FooBars', 1): 'FuBars', palgarvio@871: 'FooBar': 'FuBar', palgarvio@871: 'FooBars': 'FuBars', palgarvio@871: }) palgarvio@871: translator = Translator(translations) palgarvio@871: translator.setup(tmpl) palgarvio@871: self.assertEqual(""" palgarvio@871: FuBars palgarvio@871: FuBar palgarvio@871: """, tmpl.generate(one=1, two=2).render()) palgarvio@871: cmlenz@849: def test_translate_i18n_choose_as_attribute_with_params(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849:

Foo $fname $lname

cmlenz@849:

Foos $fname $lname

cmlenz@849:
cmlenz@849: """) cmlenz@849: translations = DummyTranslations({ cmlenz@849: ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', cmlenz@849: ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', cmlenz@849: 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', cmlenz@849: 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', cmlenz@849: }) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@849:
cmlenz@849:

Vohs John Doe

cmlenz@849:
cmlenz@849: """, tmpl.generate(two=2, fname='John', lname='Doe').render()) cmlenz@849: cmlenz@849: def test_translate_i18n_choose_as_attribute_with_params_and_domain_as_param(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849:

Foo $fname $lname

cmlenz@849:

Foos $fname $lname

cmlenz@849:
cmlenz@849: """) cmlenz@849: translations = DummyTranslations() cmlenz@849: translations.add_domain('foo', { cmlenz@849: ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', cmlenz@849: ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', cmlenz@849: 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', cmlenz@849: 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', cmlenz@849: }) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@849:
cmlenz@849:

Vohs John Doe

cmlenz@849:
cmlenz@849: """, tmpl.generate(two=2, fname='John', lname='Doe').render()) cmlenz@849: cmlenz@849: def test_translate_i18n_choose_as_directive_with_params(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849: cmlenz@849:

Foo ${fname} ${lname}

cmlenz@849:

Foos ${fname} ${lname}

cmlenz@849:
cmlenz@849: cmlenz@849:

Foo ${fname} ${lname}

cmlenz@849:

Foos ${fname} ${lname}

cmlenz@849:
cmlenz@849: """) cmlenz@849: translations = DummyTranslations({ cmlenz@849: ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', cmlenz@849: ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', cmlenz@849: 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', cmlenz@849: 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', cmlenz@849: }) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" 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: cmlenz@849: cmlenz@849:

Foo ${fname} ${lname}

cmlenz@849:

Foos ${fname} ${lname}

cmlenz@849:
cmlenz@849:
cmlenz@849: cmlenz@849:

Foo ${fname} ${lname}

cmlenz@849:

Foos ${fname} ${lname}

cmlenz@849:
cmlenz@849: """) cmlenz@849: translations = DummyTranslations() cmlenz@849: translations.add_domain('foo', { cmlenz@849: ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', cmlenz@849: ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', cmlenz@849: 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', cmlenz@849: 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', cmlenz@849: }) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" 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:
cmlenz@849:

FooBar

cmlenz@849:

FooBars

cmlenz@849:
cmlenz@849:
cmlenz@849:

FooBar

cmlenz@849:

FooBars

cmlenz@849:
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(2, len(messages)) cmlenz@858: self.assertEqual((3, 'ngettext', ('FooBar', 'FooBars'), []), messages[0]) cmlenz@858: self.assertEqual((7, 'ngettext', ('FooBar', 'FooBars'), []), messages[1]) cmlenz@849: cmlenz@849: def test_extract_i18n_choose_as_directive(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849: cmlenz@849:

FooBar

cmlenz@849:

FooBars

cmlenz@849:
cmlenz@849: cmlenz@849:

FooBar

cmlenz@849:

FooBars

cmlenz@849:
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(2, len(messages)) cmlenz@858: self.assertEqual((3, 'ngettext', ('FooBar', 'FooBars'), []), messages[0]) cmlenz@858: self.assertEqual((7, 'ngettext', ('FooBar', 'FooBars'), []), messages[1]) cmlenz@849: cmlenz@849: def test_extract_i18n_choose_as_attribute_with_params(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849:

Foo $fname $lname

cmlenz@849:

Foos $fname $lname

cmlenz@849:
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, 'ngettext', ('Foo %(fname)s %(lname)s', cmlenz@858: 'Foos %(fname)s %(lname)s'), []), cmlenz@849: messages[0]) cmlenz@849: cmlenz@849: def test_extract_i18n_choose_as_attribute_with_params_and_domain_as_param(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849:

Foo $fname $lname

cmlenz@849:

Foos $fname $lname

cmlenz@849:
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((4, 'ngettext', ('Foo %(fname)s %(lname)s', cmlenz@858: 'Foos %(fname)s %(lname)s'), []), cmlenz@849: messages[0]) cmlenz@849: cmlenz@849: def test_extract_i18n_choose_as_directive_with_params(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849: cmlenz@849:

Foo ${fname} ${lname}

cmlenz@849:

Foos ${fname} ${lname}

cmlenz@849:
cmlenz@849: cmlenz@849:

Foo ${fname} ${lname}

cmlenz@849:

Foos ${fname} ${lname}

cmlenz@849:
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(2, len(messages)) cmlenz@858: self.assertEqual((3, 'ngettext', ('Foo %(fname)s %(lname)s', cmlenz@858: 'Foos %(fname)s %(lname)s'), []), cmlenz@849: messages[0]) cmlenz@858: self.assertEqual((7, 'ngettext', ('Foo %(fname)s %(lname)s', cmlenz@858: 'Foos %(fname)s %(lname)s'), []), cmlenz@849: messages[1]) cmlenz@849: cmlenz@849: def test_extract_i18n_choose_as_directive_with_params_and_domain_as_directive(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849: cmlenz@849: cmlenz@849:

Foo ${fname} ${lname}

cmlenz@849:

Foos ${fname} ${lname}

cmlenz@849:
cmlenz@849:
cmlenz@849: cmlenz@849:

Foo ${fname} ${lname}

cmlenz@849:

Foos ${fname} ${lname}

cmlenz@849:
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(2, len(messages)) cmlenz@858: self.assertEqual((4, 'ngettext', ('Foo %(fname)s %(lname)s', cmlenz@858: 'Foos %(fname)s %(lname)s'), []), cmlenz@849: messages[0]) cmlenz@858: self.assertEqual((9, 'ngettext', ('Foo %(fname)s %(lname)s', cmlenz@858: 'Foos %(fname)s %(lname)s'), []), cmlenz@849: messages[1]) cmlenz@849: cmlenz@849: def test_extract_i18n_choose_as_attribute_with_params_and_comment(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849:

Foo $fname $lname

cmlenz@849:

Foos $fname $lname

cmlenz@849:
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, 'ngettext', ('Foo %(fname)s %(lname)s', cmlenz@858: 'Foos %(fname)s %(lname)s'), cmlenz@858: ['As in Foo Bar']), cmlenz@849: messages[0]) cmlenz@849: cmlenz@849: def test_extract_i18n_choose_as_directive_with_params_and_comment(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849: cmlenz@849:

Foo ${fname} ${lname}

cmlenz@849:

Foos ${fname} ${lname}

cmlenz@849:
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, 'ngettext', ('Foo %(fname)s %(lname)s', cmlenz@858: 'Foos %(fname)s %(lname)s'), cmlenz@858: ['As in Foo Bar']), cmlenz@849: messages[0]) cmlenz@849: cmlenz@892: def test_extract_i18n_choose_with_attributes(self): cmlenz@892: tmpl = MarkupTemplate(""" cmlenz@892:

cmlenz@892: cmlenz@892: There is ${num} thing. cmlenz@892: cmlenz@892: cmlenz@892: There are ${num} things. cmlenz@892: 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(4, len(messages)) cmlenz@892: self.assertEqual((3, None, 'Things', []), messages[0]) cmlenz@892: self.assertEqual((5, None, 'View thing', []), messages[1]) cmlenz@892: self.assertEqual((8, None, 'View things', []), messages[2]) cmlenz@892: self.assertEqual( cmlenz@892: (3, 'ngettext', ('There is [1:%(num)s thing].', cmlenz@892: 'There are [1:%(num)s things].'), []), cmlenz@892: messages[3]) cmlenz@892: cmlenz@894: def test_translate_i18n_choose_with_attributes(self): cmlenz@892: tmpl = MarkupTemplate(""" cmlenz@892:

cmlenz@892: cmlenz@892: There is ${num} thing. cmlenz@892: cmlenz@892: cmlenz@892: There are ${num} things. cmlenz@892: cmlenz@892:

cmlenz@892: """) cmlenz@892: translations = DummyTranslations({ cmlenz@892: 'Things': 'Sachen', cmlenz@892: 'View thing': 'Sache betrachten', cmlenz@892: 'View things': 'Sachen betrachten', cmlenz@892: ('There is [1:%(num)s thing].', 0): 'Da ist [1:%(num)s Sache].', cmlenz@892: ('There is [1:%(num)s thing].', 1): 'Da sind [1:%(num)s Sachen].' cmlenz@892: }) cmlenz@892: translator = Translator(translations) cmlenz@892: translator.setup(tmpl) cmlenz@892: self.assertEqual(u""" 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:

cmlenz@892: There is ${num} thing. cmlenz@892:

cmlenz@892:

cmlenz@892: There are ${num} things. cmlenz@892:

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(5, len(messages)) cmlenz@892: self.assertEqual((4, None, 'Things', []), messages[0]) cmlenz@892: self.assertEqual((5, None, 'View thing', []), messages[1]) cmlenz@892: self.assertEqual((7, None, 'Things', []), messages[2]) cmlenz@892: self.assertEqual((8, None, 'View things', []), messages[3]) cmlenz@892: self.assertEqual( cmlenz@892: (3, 'ngettext', ('There is [1:%(num)s thing].', cmlenz@892: 'There are [1:%(num)s things].'), []), cmlenz@892: messages[4]) cmlenz@892: cmlenz@894: def test_translate_i18n_choose_as_element_with_attributes(self): cmlenz@892: tmpl = MarkupTemplate(""" cmlenz@892: cmlenz@892:

cmlenz@892: There is ${num} thing. cmlenz@892:

cmlenz@892:

cmlenz@892: There are ${num} things. cmlenz@892:

cmlenz@892:
cmlenz@892: """) cmlenz@892: translations = DummyTranslations({ cmlenz@892: 'Things': 'Sachen', cmlenz@892: 'View thing': 'Sache betrachten', cmlenz@892: 'View things': 'Sachen betrachten', cmlenz@892: ('There is [1:%(num)s thing].', 0): 'Da ist [1:%(num)s Sache].', cmlenz@892: ('There is [1:%(num)s thing].', 1): 'Da sind [1:%(num)s Sachen].' cmlenz@892: }) cmlenz@892: translator = Translator(translations) cmlenz@892: translator.setup(tmpl) cmlenz@892: self.assertEqual(u""" 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:
cmlenz@849:

Foo $fname $lname

cmlenz@849:

Foos $fname $lname

cmlenz@849:
cmlenz@849: """) cmlenz@849: translations = DummyTranslations({ cmlenz@849: ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', cmlenz@849: ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', cmlenz@849: 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', cmlenz@849: 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', cmlenz@849: }) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@849:
cmlenz@849:

Vohs John Doe

cmlenz@849:
cmlenz@849: """, tmpl.generate(two=2, fname='John', lname='Doe').render()) cmlenz@849: cmlenz@849: def test_translate_i18n_choose_and_domain_and_py_strip(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849:

Foo $fname $lname

cmlenz@849:

Foos $fname $lname

cmlenz@849:
cmlenz@849: """) cmlenz@849: translations = DummyTranslations() cmlenz@849: translations.add_domain('foo', { cmlenz@849: ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', cmlenz@849: ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', cmlenz@849: 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', cmlenz@849: 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', cmlenz@849: }) cmlenz@849: translator = Translator(translations) cmlenz@849: translator.setup(tmpl) cmlenz@849: self.assertEqual(""" cmlenz@849:
cmlenz@849:

Vohs John Doe

cmlenz@849:
cmlenz@849: """, tmpl.generate(two=2, fname='John', lname='Doe').render()) palgarvio@871: palgarvio@871: def test_translate_i18n_choose_and_singular_with_py_strip(self): palgarvio@871: tmpl = MarkupTemplate(""" palgarvio@871:
palgarvio@871:

Foo $fname $lname

palgarvio@871:

Foos $fname $lname

palgarvio@871:
palgarvio@873:
palgarvio@873:

Foo $fname $lname

palgarvio@873:

Foos $fname $lname

palgarvio@873:
palgarvio@871: """) palgarvio@871: translations = DummyTranslations({ palgarvio@871: ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', palgarvio@871: ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', palgarvio@871: 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', palgarvio@871: 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', palgarvio@871: }) palgarvio@871: translator = Translator(translations) palgarvio@871: translator.setup(tmpl) palgarvio@871: self.assertEqual(""" palgarvio@871:
palgarvio@873:

Vohs John Doe

palgarvio@871:
palgarvio@873:
palgarvio@873: Voh John Doe palgarvio@873:
palgarvio@873: """, tmpl.generate( palgarvio@873: one=1, two=2, fname='John',lname='Doe').render()) palgarvio@871: palgarvio@871: def test_translate_i18n_choose_and_plural_with_py_strip(self): palgarvio@871: tmpl = MarkupTemplate(""" palgarvio@871:
palgarvio@871:

Foo $fname $lname

palgarvio@871:

Foos $fname $lname

palgarvio@871:
palgarvio@871: """) palgarvio@871: translations = DummyTranslations({ palgarvio@871: ('Foo %(fname)s %(lname)s', 0): 'Voh %(fname)s %(lname)s', palgarvio@871: ('Foo %(fname)s %(lname)s', 1): 'Vohs %(fname)s %(lname)s', palgarvio@871: 'Foo %(fname)s %(lname)s': 'Voh %(fname)s %(lname)s', palgarvio@871: 'Foos %(fname)s %(lname)s': 'Vohs %(fname)s %(lname)s', palgarvio@871: }) palgarvio@871: translator = Translator(translations) palgarvio@871: translator.setup(tmpl) palgarvio@871: self.assertEqual(""" palgarvio@871:
palgarvio@871: Voh John Doe palgarvio@871:
palgarvio@871: """, tmpl.generate(two=1, fname='John', lname='Doe').render()) cmlenz@849: cmlenz@849: def test_extract_i18n_choose_as_attribute_and_py_strip(self): cmlenz@849: tmpl = MarkupTemplate(""" cmlenz@849:
cmlenz@849:

FooBar

cmlenz@849:

FooBars

cmlenz@849:
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, 'ngettext', ('FooBar', 'FooBars'), []), messages[0]) cmlenz@849: cmlenz@894: cmlenz@894: class DomainDirectiveTestCase(unittest.TestCase): cmlenz@894: cmlenz@894: def test_translate_i18n_domain_with_msg_directives(self): cmlenz@894: #"""translate with i18n:domain and nested i18n:msg directives """ cmlenz@894: cmlenz@894: tmpl = MarkupTemplate(""" cmlenz@894:
cmlenz@894:

FooBar

cmlenz@894:

Bar

cmlenz@894:
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:
cmlenz@894:

BarFoo

cmlenz@894:

PT_Foo

cmlenz@894:
cmlenz@894: """, tmpl.generate().render()) cmlenz@894: cmlenz@894: def test_translate_i18n_domain_with_inline_directives(self): cmlenz@894: #"""translate with inlined i18n:domain and i18n:msg directives""" cmlenz@894: tmpl = MarkupTemplate(""" 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:
cmlenz@894:

FooBar

cmlenz@894:

Bar

cmlenz@894:

Bar

cmlenz@894:
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:
cmlenz@894:

BarFoo

cmlenz@894:

PT_Foo

cmlenz@894:

PT_Foo

cmlenz@894:
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: cmlenz@894:

FooBar

cmlenz@894:

Bar

cmlenz@894:

Bar

cmlenz@894:
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:
cmlenz@894:

FooBar

cmlenz@894:

Bar

cmlenz@894:

Bar

cmlenz@894:
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:
cmlenz@894:

BarFoo

cmlenz@894:

bar_Bar

cmlenz@894:

foo_Bar

cmlenz@894:
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:
cmlenz@894:

FooBar

cmlenz@894:

Bar

cmlenz@894:

Bar

cmlenz@894:
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:
cmlenz@894:

BarFoo

cmlenz@894:

Voh

cmlenz@894:

foo_Bar

cmlenz@894:
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:
Included tmpl$idx
cmlenz@894:

Bar $idx

cmlenz@894:

Bar

cmlenz@894:

Bar $idx

cmlenz@894:

Bar $idx

cmlenz@894: cmlenz@894: cmlenz@894: cmlenz@894: """) cmlenz@894: finally: cmlenz@894: file1.close() cmlenz@894: cmlenz@894: file2 = open(os.path.join(dirname, 'tmpl10.html'), 'w') cmlenz@894: try: cmlenz@894: file2.write(""" cmlenz@894: cmlenz@894: """) cmlenz@894: finally: cmlenz@894: file2.close() cmlenz@894: cmlenz@894: def callback(template): cmlenz@894: translations = DummyTranslations({'Bar %(idx)s': 'Voh %(idx)s'}) cmlenz@894: translations.add_domain('foo', {'Bar %(idx)s': 'foo_Bar %(idx)s'}) cmlenz@894: translations.add_domain('bar', {'Bar': 'bar_Bar'}) cmlenz@894: translator = Translator(translations) cmlenz@894: translator.setup(template) cmlenz@894: loader = TemplateLoader([dirname], callback=callback) cmlenz@894: tmpl = loader.load('tmpl10.html') cmlenz@894: cmlenz@894: self.assertEqual(""" cmlenz@894:
Included tmpl0
cmlenz@894:

foo_Bar 0

cmlenz@894:

bar_Bar

cmlenz@894:

Voh 0

cmlenz@894:

Voh 0

cmlenz@894:
Included tmpl1
cmlenz@894:

foo_Bar 1

cmlenz@894:

bar_Bar

cmlenz@894:

Voh 1

cmlenz@894:

Voh 1

cmlenz@894:
Included tmpl2
cmlenz@894:

foo_Bar 2

cmlenz@894:

bar_Bar

cmlenz@894:

Voh 2

cmlenz@894:

Voh 2

cmlenz@894:
Included tmpl3
cmlenz@894:

foo_Bar 3

cmlenz@894:

bar_Bar

cmlenz@894:

Voh 3

cmlenz@894:

Voh 3

cmlenz@894:
Included tmpl4
cmlenz@894:

foo_Bar 4

cmlenz@894:

bar_Bar

cmlenz@894:

Voh 4

cmlenz@894:

Voh 4

cmlenz@894:
Included tmpl5
cmlenz@894:

foo_Bar 5

cmlenz@894:

bar_Bar

cmlenz@894:

Voh 5

cmlenz@894:

Voh 5

cmlenz@894:
Included tmpl6
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:
Included tmpl$idx
cmlenz@894:

Bar $idx

cmlenz@894:

Bar

cmlenz@894:

Bar $idx

cmlenz@894:

Bar $idx

cmlenz@894:

Bar $idx

cmlenz@894: cmlenz@894: cmlenz@894: cmlenz@894: """) cmlenz@894: finally: cmlenz@894: file1.close() cmlenz@894: cmlenz@894: file2 = open(os.path.join(dirname, 'tmpl10.html'), 'w') cmlenz@894: try: cmlenz@894: file2.write(""" cmlenz@894: cmlenz@894: """) cmlenz@894: finally: cmlenz@894: file2.close() cmlenz@894: cmlenz@894: translations = DummyTranslations({'Bar %(idx)s': 'Voh %(idx)s', cmlenz@894: 'Bar': 'Voh'}) cmlenz@894: translations.add_domain('foo', {'Bar %(idx)s': 'foo_Bar %(idx)s'}) cmlenz@894: translations.add_domain('bar', {'Bar': 'bar_Bar'}) cmlenz@894: translator = Translator(translations) cmlenz@894: cmlenz@894: def callback(template): cmlenz@894: translator.setup(template) cmlenz@894: loader = TemplateLoader([dirname], callback=callback) cmlenz@894: tmpl = loader.load('tmpl10.html') cmlenz@894: hodgestar@933: if IS_PYTHON2: hodgestar@933: dgettext = translations.dugettext hodgestar@933: else: hodgestar@933: dgettext = translations.dgettext hodgestar@933: cmlenz@894: self.assertEqual(""" cmlenz@894:
Included tmpl0
cmlenz@894:

foo_Bar 0

cmlenz@894:

bar_Bar

cmlenz@894:

Voh 0

cmlenz@894:

Voh 0

cmlenz@894:

Voh 0

cmlenz@894:
Included tmpl1
cmlenz@894:

foo_Bar 1

cmlenz@894:

bar_Bar

cmlenz@894:

Voh 1

cmlenz@894:

Voh 1

cmlenz@894:

Voh 1

cmlenz@894:
Included tmpl2
cmlenz@894:

foo_Bar 2

cmlenz@894:

bar_Bar

cmlenz@894:

Voh 2

cmlenz@894:

Voh 2

cmlenz@894:

Voh 2

cmlenz@894:
Included tmpl3
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: Example cmlenz@528: cmlenz@528: cmlenz@528:

Example

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: cmlenz@849: cmlenz@849: cmlenz@849:
cmlenz@849: Show cmlenz@849: cmlenz@849:
cmlenz@849:
cmlenz@849: Ignore: cmlenz@849:
cmlenz@849: cmlenz@849: cmlenz@849:
cmlenz@849:
cmlenz@849: cmlenz@849: cmlenz@849:
cmlenz@849:
cmlenz@849: cmlenz@849: cmlenz@849:
cmlenz@849:
cmlenz@849:
cmlenz@849: cmlenz@849:
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(10, len(messages)) cmlenz@849: self.assertEqual([ cmlenz@858: (3, None, 'View differences', []), cmlenz@858: (6, None, 'inline', []), cmlenz@858: (8, None, 'side by side', []), cmlenz@858: (10, None, 'Show', []), cmlenz@858: (13, None, 'lines around each change', []), cmlenz@858: (16, None, 'Ignore:', []), cmlenz@858: (20, None, 'Blank lines', []), cmlenz@858: (25, None, 'Case changes',[]), cmlenz@858: (30, None, 'White space changes', []), cmlenz@858: (34, '_', 'Update', [])], messages) cmlenz@849: cmlenz@528: cmlenz@446: def suite(): cmlenz@446: suite = unittest.TestSuite() athomas@709: suite.addTest(doctest.DocTestSuite(Translator.__module__)) cmlenz@485: suite.addTest(unittest.makeSuite(TranslatorTestCase, 'test')) cmlenz@894: suite.addTest(unittest.makeSuite(MsgDirectiveTestCase, 'test')) cmlenz@894: suite.addTest(unittest.makeSuite(ChooseDirectiveTestCase, 'test')) cmlenz@894: suite.addTest(unittest.makeSuite(DomainDirectiveTestCase, 'test')) cmlenz@528: suite.addTest(unittest.makeSuite(ExtractTestCase, 'test')) cmlenz@446: return suite cmlenz@446: cmlenz@446: if __name__ == '__main__': cmlenz@446: unittest.main(defaultTest='suite')