[Zope-Checkins] CVS: Zope3/lib/python/Zope/I18n/tests - testGettextExportImport.py:1.1 testIReadMessageCatalog.py:1.1 testIReadTranslationService.py:1.1 testISyncTranslationService.py:1.1 testIWriteMessageCatalog.py:1.1 testIWriteTranslationService.py:1.1 testGettextMessageCatalog.py:1.2 testGlobalTranslationService.py:1.3 testMessageCatalog.py:1.4 testSimpleTranslationService.py:1.3 testTranslationService.py:1.6 testIEditableTranslationService.py:NONE testIMessageCatalog.py:NONE testITranslationService.py:NONE

Stephan Richter srichter@cbu.edu
Sun, 16 Jun 2002 14:25:15 -0400


Update of /cvs-repository/Zope3/lib/python/Zope/I18n/tests
In directory cvs.zope.org:/tmp/cvs-serv23163/tests

Modified Files:
	testGettextMessageCatalog.py testGlobalTranslationService.py 
	testMessageCatalog.py testSimpleTranslationService.py 
	testTranslationService.py 
Added Files:
	testGettextExportImport.py testIReadMessageCatalog.py 
	testIReadTranslationService.py testISyncTranslationService.py 
	testIWriteMessageCatalog.py testIWriteTranslationService.py 
Removed Files:
	testIEditableTranslationService.py testIMessageCatalog.py 
	testITranslationService.py 
Log Message:
Commit part 1:

I have done quiet some work this weekend on refining and refactoring the 
Translation Service and it should be ready for EP now:

- Refactored the interfaces into more standard read and write interfaces.

- Implemented an Import and Export feature using geyyexy files.

- Implemented Message Synchronisation mechanism via XML-RPC.

- Improved the overall look and feel of the LocalTranslation Service.

- Added an icon for the Translation Service.


=== Added File Zope3/lib/python/Zope/I18n/tests/testGettextExportImport.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
# 
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
# 
##############################################################################
"""This module tests the Gettext Export and Import funciotnality of the
Translation Service.

$Id: testGettextExportImport.py,v 1.1 2002/06/16 18:25:14 srichter Exp $
"""
import unittest, time

from cStringIO import StringIO

from Zope.ComponentArchitecture.tests.PlacelessSetup import PlacelessSetup
from Zope.App.ComponentArchitecture.metaConfigure import \
     provideService, managerHandler
from Zope.App.ComponentArchitecture.metaConfigure import handler

from Zope.I18n.MessageCatalog import MessageCatalog 
from Zope.I18n.Negotiator import negotiator
from Zope.I18n.INegotiator import INegotiator
from Zope.I18n.IUserPreferredLanguages import IUserPreferredLanguages

from Zope.I18n.TranslationService import TranslationService
from Zope.I18n.GettextImportFilter import GettextImportFilter
from Zope.I18n.GettextExportFilter import GettextExportFilter



class Environment:

    __implements__ = IUserPreferredLanguages

    def __init__(self, langs=()):
        self.langs = langs

    def getPreferredLanguages(self):
        return self.langs


class TestGettextExportImport(PlacelessSetup, unittest.TestCase):


    _data = '''msgid ""
msgstr ""
"Project-Id-Version: Zope 3\\n"
"PO-Revision-Date: %s\\n"
"Last-Translator: Zope 3 Gettext Export Filter\\n"
"Zope-Language: de\\n"
"Zope-Domain: default\\n" 
"MIME-Version: 1.0\\n"
"Content-Type: text/plain; charset=UTF-8\\n"
"Content-Transfer-Encoding: 8bit\\n"

msgid "Choose"
msgstr "Ausw\xc3\xa4hlen!"

msgid "greeting"
msgstr "hallo"
'''

    def setUp(self):
        PlacelessSetup.setUp(self)
        # Setup the negotiator service registry entry
        managerHandler('defineService', 'LanguageNegotiation', INegotiator) 
        provideService('LanguageNegotiation', negotiator, 'Zope.Public')
        self._service = TranslationService('default') 
        handler('Factories', 'provideFactory', 'Message Catalog',
                MessageCatalog)


    def testImportExport(self):
        service = self._service

        imp = GettextImportFilter(service)
        imp.importMessages(['default'], ['de'],
                           StringIO(self._data %'2002/02/02 02:02'))

        exp = GettextExportFilter(service)
        result = exp.exportMessages(['default'], ['de'])
        
        dt = time.time()
        dt = time.localtime(dt)
        dt = time.strftime('%Y/%m/%d %H:%M', dt)

        self.assertEqual(result.strip(), (self._data %dt).strip())


def test_suite():
    loader = unittest.TestLoader()
    return loader.loadTestsFromTestCase(TestGettextExportImport)


if __name__ == '__main__':
    unittest.TextTestRunner().run(test_suite())



=== Added File Zope3/lib/python/Zope/I18n/tests/testIReadMessageCatalog.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
# 
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
# 
##############################################################################
"""This is an 'abstract' test for the IMessageCatalog interface.

$Id: testIReadMessageCatalog.py,v 1.1 2002/06/16 18:25:14 srichter Exp $
"""
import unittest
from Interface.Verify import verifyObject
from Zope.I18n.IMessageCatalog import IReadMessageCatalog


class TestIReadMessageCatalog(unittest.TestCase):


    # This should be overwritten by every class that inherits this test
    def _getMessageCatalog(self):
        pass
    
    def _getUniqueIndentifier(self):
        pass


    def setUp(self):
        self._catalog = self._getMessageCatalog() 
        assert verifyObject(IReadMessageCatalog, self._catalog)


    def testGetMessage(self):
        catalog = self._catalog    
        self.assertEqual(catalog.getMessage('short_greeting'), 'Hello!')
        self.assertRaises(KeyError, catalog.getMessage, 'foo')
        

    def testQueryMessage(self):
        catalog = self._catalog    
        self.assertEqual(catalog.queryMessage('short_greeting'), 'Hello!')
        self.assertEqual(catalog.queryMessage('foo'), 'foo')
        self.assertEqual(catalog.queryMessage('foo', 'bar'), 'bar')

        
    def testGetLanguage(self):
        catalog = self._catalog    
        self.assertEqual(catalog.getLanguage(), 'en')


    def testGetDomain(self):
        catalog = self._catalog    
        self.assertEqual(catalog.getDomain(), 'default')


    def testGetIdentifier(self):
        catalog = self._catalog    
        self.assertEqual(catalog.getIdentifier(), self._getUniqueIndentifier())


def test_suite():
    pass


=== Added File Zope3/lib/python/Zope/I18n/tests/testIReadTranslationService.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
# 
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
# 
##############################################################################
"""This is an 'abstract' test for the ITranslationService interface.

$Id: testIReadTranslationService.py,v 1.1 2002/06/16 18:25:14 srichter Exp $
"""

import unittest
from Interface.Verify import verifyObject
from Zope.ComponentArchitecture.tests.PlacelessSetup import PlacelessSetup
from Zope.App.ComponentArchitecture.metaConfigure import \
     provideService, managerHandler
from Zope.I18n.Negotiator import negotiator
from Zope.I18n.INegotiator import INegotiator
from Zope.I18n.IUserPreferredLanguages import IUserPreferredLanguages
from Zope.I18n.ITranslationService import IReadTranslationService
from Zope.I18n.IDomain import IDomain


class Environment:

    __implements__ = IUserPreferredLanguages

    def __init__(self, langs=()):
        self.langs = langs

    def getPreferredLanguages(self):
        return self.langs



class TestIReadTranslationService(PlacelessSetup, unittest.TestCase):

    # This should be overwritten by every clas that inherits this test
    def _getTranslationService(self):
        pass
    
    def setUp(self):
        PlacelessSetup.setUp(self)
        self._service = self._getTranslationService() 
        assert verifyObject(IReadTranslationService, self._service)
        # Setup the negotiator service registry entry
        managerHandler('defineService', 'LanguageNegotiation', INegotiator) 
        provideService('LanguageNegotiation', negotiator, 'Zope.Public')

    # I know, I know. This is not part of the interface, but it is implemented
    # in every Translation Service, so it fits well here.
    def testInterpolation(self):
        service = self._service
        interp = service.interpolate
        eq = self.assertEqual
        mapping = {'name': 'Zope', 'version': '3x'}
        # Test simple interpolations
        eq(interp('This is $name.', mapping), 'This is Zope.')
        eq(interp('This is ${name}.', mapping), 'This is Zope.')
        # Test more than one interpolation variable
        eq(interp('This is $name version $version.', mapping),
           'This is Zope version 3x.')
        eq(interp('This is ${name} version $version.', mapping),
           'This is Zope version 3x.')
        eq(interp('This is $name version ${version}.', mapping),
           'This is Zope version 3x.')
        eq(interp('This is ${name} version ${version}.', mapping),
           'This is Zope version 3x.')
        # Test escaping the $
        eq(interp('This is $$name.', mapping), 'This is $$name.')
        eq(interp('This is $${name}.', mapping), 'This is $${name}.')
        
    def testSimpleNoTranslate(self):
        translate = self._service.translate
        raises = self.assertRaises
        eq = self.assertEqual
        # Test that we have at least the minimum required arguments
        raises(TypeError, translate, 'Hello')
        # Test that a translation in an unsupported language returns the
        # original message id unchanged.
        eq(translate('default', 'short_greeting', target_language='es'),
           'short_greeting')
        # Same test, but use the context argument instead of target_language
        context = Environment()
        eq(translate('default', 'short_greeting', context=context),
           'short_greeting')
        # Test that at least one of context or target_language is given
        raises(TypeError, translate, 'short_greeting', context=None)
    
    def testSimpleTranslate(self):
        translate = self._service.translate
        eq = self.assertEqual
        # Test that a given message id is properly translated in a supported
        # language
        eq(translate('default', 'short_greeting', target_language='de'),
           'Hallo!')
        # Same test, but use the context argument
        context = Environment(('de', 'en'))
        eq(translate('default', 'short_greeting', context=context),
           'Hallo!')
    
    def testDynamicTranslate(self):
        translate = self._service.translate
        eq = self.assertEqual
        # Testing both translation and interpolation
        eq(translate('default', 'greeting', mapping={'name': 'Stephan'},
                     target_language='de'),
           'Hallo Stephan, wie geht es Dir?')

    def testGetDomain(self):
        service = self._service    
        domain = service.getDomain('default')
        self.assertEqual(verifyObject(IDomain, domain), 1)

    def testDomainTranslate(self):
        service = self._service    
        domain = service.getDomain('default')
        translate = domain.translate
        eq = self.assertEqual
        # target language argument
        eq(translate('short_greeting', target_language='de'), 'Hallo!')
        # context argument
        context = Environment(('de', 'en'))
        eq(translate('short_greeting', context=context), 'Hallo!')
        
def test_suite():
    pass


=== Added File Zope3/lib/python/Zope/I18n/tests/testISyncTranslationService.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
# 
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
# 
##############################################################################
"""This is an 'abstract' test for the Synchronization Support interface.

$Id: testISyncTranslationService.py,v 1.1 2002/06/16 18:25:14 srichter Exp $
"""

import unittest
from Interface.Verify import verifyObject
from Zope.ComponentArchitecture.tests.PlacelessSetup import PlacelessSetup
from Zope.I18n.ITranslationService import ISyncTranslationService


class TestISyncTranslationService(PlacelessSetup, unittest.TestCase):


    foreign_messages = [
        # Message that is not locally available
        {'domain': 'default', 'language': 'en', 'msgid': 'test',
         'msgstr': 'Test', 'mod_time': 0}, 
        # This message is newer than the local one.
        {'domain': 'default', 'language': 'de', 'msgid': 'short_greeting',
         'msgstr': 'Hallo.', 'mod_time': 20},
        # This message is older than the local one.
        {'domain': 'default', 'language': 'en', 'msgid': 'short_greeting',
         'msgstr': 'Hello', 'mod_time': 0},
        # This message is up-to-date.
        {'domain': 'default', 'language': 'en', 'msgid': 'greeting',
         'msgstr': 'Hello $name, how are you?', 'mod_time': 0}]


    local_messages = [
        # This message is older than the foreign one.
        {'domain': 'default', 'language': 'de', 'msgid': 'short_greeting',
         'msgstr': 'Hallo!', 'mod_time': 10},
        # This message is newer than the foreign one.
        {'domain': 'default', 'language': 'en', 'msgid': 'short_greeting',
         'msgstr': 'Hello!', 'mod_time': 10},
        # This message is up-to-date.
        {'domain': 'default', 'language': 'en', 'msgid': 'greeting',
         'msgstr': 'Hello $name, how are you?', 'mod_time': 0},
        # This message is only available locally. 
        {'domain': 'default', 'language': 'de', 'msgid': 'greeting',
         'msgstr': 'Hallo $name, wie geht es Dir?', 'mod_time': 0},
        ]
   

    # This should be overwritten by every clas that inherits this test
    def _getTranslationService(self):
        pass

    
    def setUp(self):
        PlacelessSetup.setUp(self)
        self._service = self._getTranslationService() 
        assert verifyObject(ISyncTranslationService, self._service)


    def testGetMessagesMapping(self):
        mapping = self._service.getMessagesMapping(['default'], ['de', 'en'],
                                                  self.foreign_messages)
        self.assertEqual(mapping[('test', 'default', 'en')],
                         (self.foreign_messages[0], None))
        self.assertEqual(mapping[('short_greeting', 'default', 'de')],
                         (self.foreign_messages[1], self.local_messages[0]))
        self.assertEqual(mapping[('short_greeting', 'default', 'en')],
                         (self.foreign_messages[2], self.local_messages[1]))
        self.assertEqual(mapping[('greeting', 'default', 'en')],
                         (self.foreign_messages[3], self.local_messages[2]))
        self.assertEqual(mapping[('greeting', 'default', 'de')],
                         (None, self.local_messages[3]))


    def testSynchronize(self):
        service = self._service
        mapping = service.getMessagesMapping(['default'], ['de', 'en'],
                                             self.foreign_messages)
        service.synchronize(mapping)

        self.assertEqual(service.getMessage('test', 'default', 'en'),
                         self.foreign_messages[0])
        self.assertEqual(service.getMessage('short_greeting', 'default', 'de'),
                         self.foreign_messages[1])
        self.assertEqual(service.getMessage('short_greeting', 'default', 'en'),
                         self.local_messages[1])
        self.assertEqual(service.getMessage('greeting', 'default', 'en'),
                         self.local_messages[2])
        self.assertEqual(service.getMessage('greeting', 'default', 'en'),
                         self.foreign_messages[3])
        self.assertEqual(service.getMessage('greeting', 'default', 'de'),
                         None)
        


        
def test_suite():
    pass


=== Added File Zope3/lib/python/Zope/I18n/tests/testIWriteMessageCatalog.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
# 
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
# 
##############################################################################
"""This is an 'abstract' test for the IMessageCatalog interface.

$Id: testIWriteMessageCatalog.py,v 1.1 2002/06/16 18:25:14 srichter Exp $
"""

import unittest
from Interface.Verify import verifyObject
from Zope.I18n.IMessageCatalog import IWriteMessageCatalog


class TestIWriteMessageCatalog(unittest.TestCase):


    # This should be overwritten by every class that inherits this test
    def _getMessageCatalog(self):
        pass
    
    def _getUniqueIndentifier(self):
        pass


    def setUp(self):
        self._catalog = self._getMessageCatalog() 
        assert verifyObject(IWriteMessageCatalog, self._catalog)


    def testGetFullMessage(self):
        catalog = self._catalog
        self.assertEqual(catalog.getFullMessage('short_greeting'),
                         {'domain': 'default',
                          'language': 'en',
                          'msgid': 'short_greeting',
                          'msgstr': 'Hello!',
                          'mod_time': 0})
                         

    def testSetMessage(self):
        catalog = self._catalog
        catalog.setMessage('test', 'Test', 1)
        self.assertEqual(catalog.getFullMessage('test'),
                         {'domain': 'default',
                          'language': 'en',
                          'msgid': 'test',
                          'msgstr': 'Test',
                          'mod_time': 1})
        catalog.deleteMessage('test')        
        

    def testDeleteMessage(self):
        catalog = self._catalog
        self.assertEqual(catalog.queryMessage('test'), 'test')
        catalog.setMessage('test', 'Test', 1)
        self.assertEqual(catalog.queryMessage('test'), 'Test')
        catalog.deleteMessage('test')        
        self.assertEqual(catalog.queryMessage('test'), 'test')


    def testGetMessageIds(self):
        catalog = self._catalog
        ids = catalog.getMessageIds()
        ids.sort()
        self.assertEqual(ids, ['greeting', 'short_greeting'])


    def testGetMessages(self):
        catalog = self._catalog
        ids = catalog.getMessageIds()
        ids.sort()
        self.assertEqual(ids, ['greeting', 'short_greeting'])


def test_suite():
    pass


=== Added File Zope3/lib/python/Zope/I18n/tests/testIWriteTranslationService.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
# 
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
# 
##############################################################################
"""This is an 'abstract' test for the ITranslationService interface.

$Id: testIWriteTranslationService.py,v 1.1 2002/06/16 18:25:14 srichter Exp $
"""

import unittest

from Interface.Verify import verifyObject
from Zope.ComponentArchitecture.tests.PlacelessSetup import PlacelessSetup
from Zope.App.ComponentArchitecture.metaConfigure import \
     provideService, managerHandler
from Zope.App.ComponentArchitecture.metaConfigure import handler

from Zope.I18n.Negotiator import negotiator
from Zope.I18n.INegotiator import INegotiator
from Zope.I18n.IUserPreferredLanguages import IUserPreferredLanguages
from Zope.I18n.ITranslationService import ITranslationService
from Zope.I18n.IDomain import IDomain
from Zope.I18n.MessageCatalog import MessageCatalog 

class Environment:

    __implements__ = IUserPreferredLanguages

    def __init__(self, langs=()):
        self.langs = langs

    def getPreferredLanguages(self):
        return self.langs



class TestIWriteTranslationService(PlacelessSetup, unittest.TestCase):

    def _getTranslationService(self):
        """This should be overwritten by every clas that inherits this test.

           We expect the TranslationService to contain exactly 2 languages:
           de and en
        """

    
    def setUp(self):
        PlacelessSetup.setUp(self)
        self._service = self._getTranslationService() 
        assert verifyObject(ITranslationService, self._service)

        # Setup the negotiator service registry entry
        managerHandler('defineService', 'LanguageNegotiation', INegotiator) 
        provideService('LanguageNegotiation', negotiator, 'Zope.Public')

        handler('Factories', 'provideFactory', 'Message Catalog',
                MessageCatalog)


    def _getDomains(self, service):
        domains = service.getAllDomains()
        domains.sort()
        return domains


    def testGetAddDeleteDomain(self):
        service = self._service
        service.addLanguage('de')
        d = self._getDomains(service)
        self.assertEqual(service.getAllDomains(), d+[])
        service.addDomain('test')
        self.assertEqual(service.getAllDomains(), d+['test'])        
        service.addDomain('test2')
        self.assertEqual(service.getAllDomains(), d+['test', 'test2'])
        self.assertEqual(service.getAvailableDomains('de'),
                         d+['test', 'test2'])
        service.deleteDomain('test')
        self.assertEqual(service.getAllDomains(), d+['test2'])        
        service.deleteDomain('test2')
        self.assertEqual(service.getAllDomains(), d+[])


    def _getLanguages(self, service):
        languages = service.getAllLanguages()
        languages.sort()
        return languages


    def testGetAddDeleteLanguage(self):
        service = self._service
        service.addDomain('test')
        langs = self._getLanguages(service)
        service.addLanguage('es')
        self.assertEqual(self._getLanguages(service), langs+['es'])        
        service.addLanguage('fr')
        self.assertEqual(self._getLanguages(service), langs+['es', 'fr'])
        self.assertEqual(service.getAvailableLanguages('test'),
                         langs+['es', 'fr'])
        service.deleteLanguage('es')
        self.assertEqual(self._getLanguages(service), langs+['fr'])        
        service.deleteLanguage('fr')
        self.assertEqual(self._getLanguages(service), langs)


    def testAddUpdateDeleteMessage(self):
        service = self._service
        self.assertEqual(service.translate('test', 'greeting',
                                           target_language='de'), 'greeting')
        service.addMessage('test', 'greeting', 'Hallo!', 'de')
        self.assertEqual(service.translate('test', 'greeting',
                                           target_language='de'), 'Hallo!')
        service.updateMessage('test', 'greeting', 'Hallo Ihr da!', 'de')
        self.assertEqual(service.translate('test', 'greeting',
                                           target_language='de'),
                         'Hallo Ihr da!')
        service.deleteMessage('test', 'greeting', 'de')
        self.assertEqual(service.translate('test', 'greeting',
                                           target_language='de'), 'greeting')


    def _getMessageIds(self, service, domain, filter="%"):
        ids = service.getMessageIdsOfDomain(domain, filter)
        ids.sort()
        return ids


    def testFilteredGetAllMessageIdsOfDomain(self):
        service = self._service
        service.addMessage('test',  'greeting', 'Greeting!', 'en')
        service.addMessage('test',  'greeting2', 'Greeting 2!', 'en')
        service.addMessage('test2', 'greeting3', 'Greeting 3!', 'en')
        service.addMessage('test2', 'greeting4', 'Greeting 4!', 'en')

        self.assertEqual(self._getMessageIds(service, 'test'),
                         ['greeting', 'greeting2'])
        self.assertEqual(self._getMessageIds(service, 'test2'),
                         ['greeting3', 'greeting4'])
        self.assertEqual(self._getMessageIds(service, 'test', 'greeting'),
                         ['greeting', 'greeting2'])
        self.assertEqual(self._getMessageIds(service, 'test', '%2'),
                         ['greeting2'])
        self.assertEqual(self._getMessageIds(service, 'test', 'gre%2'),
                         ['greeting2'])
        self.assertEqual(self._getMessageIds(service, 'test2', 'gre%'),
                         ['greeting3', 'greeting4'])

        
def test_suite():
    pass


=== Zope3/lib/python/Zope/I18n/tests/testGettextMessageCatalog.py 1.1 => 1.2 ===
 import unittest, sys, os
 from Zope.I18n.GettextMessageCatalog import GettextMessageCatalog
-from testIMessageCatalog import TestIMessageCatalog
+from testIReadMessageCatalog import TestIReadMessageCatalog
 
 
-class GettextMessageCatalogTest(TestIMessageCatalog):
+class GettextMessageCatalogTest(TestIReadMessageCatalog):
 
 
     def _getMessageCatalog(self):


=== Zope3/lib/python/Zope/I18n/tests/testGlobalTranslationService.py 1.2 => 1.3 ===
 from Zope.I18n.GlobalTranslationService import GlobalTranslationService
 from Zope.I18n.GettextMessageCatalog import GettextMessageCatalog 
-from testITranslationService import TestITranslationService
+from testIReadTranslationService import TestIReadTranslationService
 
 def testdir():
     from Zope.I18n import tests
     return os.path.dirname(tests.__file__)
 
 
-class TestGlobalTranslationService(TestITranslationService):
+class TestGlobalTranslationService(TestIReadTranslationService):
 
     def _getTranslationService(self):
         service = GlobalTranslationService('default') 


=== Zope3/lib/python/Zope/I18n/tests/testMessageCatalog.py 1.3 => 1.4 ===
 
 from Zope.I18n.MessageCatalog import MessageCatalog
-from testIMessageCatalog import TestIMessageCatalog
+from testIReadMessageCatalog import TestIReadMessageCatalog
+from testIWriteMessageCatalog import TestIWriteMessageCatalog
 
 
-class MessageCatalogTest(TestIMessageCatalog):
+class MessageCatalogTest(TestIReadMessageCatalog, TestIWriteMessageCatalog):
+
+
+    def startUp(self):
+        TestIReadMessageCatalog.startUp(self)
+        TestIWriteMessageCatalog.startUp(self)
 
 
     def _getMessageCatalog(self):
         catalog = MessageCatalog('en', 'default')
-        catalog.setMessage('short_greeting', 'Hello!')
-        catalog.setMessage('greeting', 'Hello $name, how are you?')
+        catalog.setMessage('short_greeting', 'Hello!', 0)
+        catalog.setMessage('greeting', 'Hello $name, how are you?', 0)
         return catalog
     
     def _getUniqueIndentifier(self):
         return ('en', 'default')
-
-
-    def testSetMessage(self):
-        catalog = self._catalog
-        catalog.setMessage('new', 'New Test')
-        self.assertEqual(catalog.getMessage('new'), 'New Test')
-
-
-    def testGetMessageIds(self):
-        catalog = self._catalog
-        ids = catalog.getMessageIds()
-        ids.sort()
-        self.assertEqual(ids, ['greeting', 'short_greeting'])
 
 
 def test_suite():


=== Zope3/lib/python/Zope/I18n/tests/testSimpleTranslationService.py 1.2 => 1.3 ===
 import unittest
 from Zope.I18n.SimpleTranslationService import SimpleTranslationService
-from testITranslationService import TestITranslationService
+from testIReadTranslationService import TestIReadTranslationService
 
 
-class TestSimpleTranslationService(TestITranslationService):
+class TestSimpleTranslationService(TestIReadTranslationService):
 
     def _getTranslationService(self):
         service = SimpleTranslationService(


=== Zope3/lib/python/Zope/I18n/tests/testTranslationService.py 1.5 => 1.6 ===
 from Zope.I18n.TranslationService import TranslationService
 from Zope.I18n.MessageCatalog import MessageCatalog 
-from testITranslationService import TestITranslationService
-from testIEditableTranslationService import TestIEditableTranslationService
+from testIReadTranslationService import TestIReadTranslationService
+from testIWriteTranslationService import TestIWriteTranslationService
+from testISyncTranslationService import TestISyncTranslationService
+
+
+class TestTranslationService(TestIReadTranslationService,
+                             TestIWriteTranslationService,
+                             TestISyncTranslationService):
+
+
+    def setUp(self):
+        TestISyncTranslationService.setUp(self)
+        TestIReadTranslationService.setUp(self)
+        TestIWriteTranslationService.setUp(self)
 
-class TestTranslationService(TestIEditableTranslationService,
-                             TestITranslationService):
 
     def _getTranslationService(self):
         service = TranslationService('default') 
@@ -31,11 +41,11 @@
         en_catalog = MessageCatalog('en', 'default')
         de_catalog = MessageCatalog('de', 'default')
         # Populate the catalogs with translations of a message id
-        en_catalog.setMessage('short_greeting', 'Hello!')
-        de_catalog.setMessage('short_greeting', 'Hallo!')
+        en_catalog.setMessage('short_greeting', 'Hello!', 10)
+        de_catalog.setMessage('short_greeting', 'Hallo!', 10)
         # And another message id with interpolation placeholders
-        en_catalog.setMessage('greeting', 'Hello $name, how are you?')
-        de_catalog.setMessage('greeting', 'Hallo $name, wie geht es Dir?')
+        en_catalog.setMessage('greeting', 'Hello $name, how are you?', 0)
+        de_catalog.setMessage('greeting', 'Hallo $name, wie geht es Dir?', 0)
 
         service.setObject('en-default-1', en_catalog)
         service.setObject('de-default-1', de_catalog)
@@ -53,6 +63,7 @@
         # This is what the argument used to be called
         raises(TypeError, translate, 'default', source='short_greeting',
                target_language='en')
+
 
 def test_suite():
     loader = unittest.TestLoader()

=== Removed File Zope3/lib/python/Zope/I18n/tests/testIEditableTranslationService.py ===

=== Removed File Zope3/lib/python/Zope/I18n/tests/testIMessageCatalog.py ===

=== Removed File Zope3/lib/python/Zope/I18n/tests/testITranslationService.py ===