Test for Messages ================= >>> from Products.CMFPlone import PloneMessageFactory as _ Messages without translation service set up ------------------------------------------- Very simple message: >>> _(u'hello') u'hello' The domain is predefinied through the factory: >>> _(u'hello').domain 'plone' You can also define a default text: >>> msg = _(u'id', default=u'This is the text.') >>> msg u'id' >>> msg.default u'This is the text.' And at last there is the possibility of variable substition: >>> project = u'Plone' >>> msg = _(u'id', default=u'Hello ${name}', mapping={u'name' : project}) >>> msg u'id' >>> msg.default u'Hello ${name}' >>> msg.mapping {u'name': u'Plone'} Messages with translation service set up ---------------------------------------- Now we fake a translation domain. Usually you will have translations stored in a po file and automatically translated by PTS or the Z3 translation service. >>> from zope.i18n.simpletranslationdomain import SimpleTranslationDomain >>> from zope.i18n.interfaces import ITranslationDomain >>> messages = { ... ('de', u'This is a message.'): u'Dieses ist eine Nachricht.', ... ('de', u'mail-notification'): u'Sie haben ${number} neue E-Mails.'} >>> mails = SimpleTranslationDomain('plone', messages) >>> from zope.component import provideUtility >>> provideUtility(mails, ITranslationDomain, name='plone') Define the simple message: >>> msg = _(u'This is a message.') >>> msg u'This is a message.' We are still using the plone domain: >>> msg.domain 'plone' Verify that the translation succeeds: >>> from zope.i18n import translate >>> translate(msg, target_language='de') u'Dieses ist eine Nachricht.' Now try a message with variable substitution: >>> num = 42 >>> note = _(u'mail-notification', default=u'You have ${number} new mails.', ... mapping={u'number': num}) >>> note u'mail-notification' >>> note.default u'You have ${number} new mails.' Try simple interpolation: >>> translate(note, target_language='en') u'You have 42 new mails.' And now try the real translation: >>> translate(note, target_language='de') u'Sie haben 42 neue E-Mails.' Messages inside page templates / tal ------------------------------------ We need a simple tal engine for the tests. The DummyEngine automatically upper-cases all text. >>> from zope.tal.dummyengine import DummyEngine >>> engine = DummyEngine() We use the Messages defined earlier. >>> msg u'This is a message.' >>> note u'mail-notification' Inform the engine of our variables. >>> engine.setLocal('msg', msg) >>> engine.setLocal('note', note) We also need a HTMLParser and TALInterpreter and add a simple convience function to get the parsed and interpreted text. >>> from zope.tal.htmltalparser import HTMLTALParser >>> from zope.tal.talinterpreter import TALInterpreter >>> from StringIO import StringIO >>> def compile(source): ... parser = HTMLTALParser() ... parser.parseString(source) ... program, macros = parser.getCode() ... result = StringIO() ... interpreter = TALInterpreter(program, {}, engine, stream=result) ... interpreter() ... return result.getvalue() >>> text = compile('') >>> u'THIS IS A MESSAGE.' in text True >>> text = compile('') >>> u'MAIL-NOTIFICATION' in text True