[Erp5-report] r29329 - /experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Sep 30 16:20:23 CEST 2009


Author: leonardo
Date: Wed Sep 30 16:20:20 2009
New Revision: 29329

URL: http://svn.erp5.org?rev=29329&view=rev
Log:
sync with Localizer in git to get the latest changes for Zope2.12 compat and itools

Added:
    experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/.gitignore
Modified:
    experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/   (props changed)
    experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LanguageManager.py
    experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LocalContent.py
    experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/MessageCatalog.py
    experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/README.txt
    experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/__init__.py

Propchange: experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Sep 30 16:20:20 2009
@@ -1,0 +1,1 @@
+.git

Added: experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/.gitignore
URL: http://svn.erp5.org/experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/.gitignore?rev=29329&view=auto
==============================================================================
--- experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/.gitignore (added)
+++ experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/.gitignore [utf8] Wed Sep 30 16:20:20 2009
@@ -1,0 +1,4 @@
+*.pyc
+*.swp
+locale/*.mo
+locale/*~

Modified: experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LanguageManager.py
URL: http://svn.erp5.org/experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LanguageManager.py?rev=29329&r1=29328&r2=29329&view=diff
==============================================================================
--- experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LanguageManager.py [utf8] (original)
+++ experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LanguageManager.py [utf8] Wed Sep 30 16:20:20 2009
@@ -18,7 +18,7 @@
 from urlparse import urlparse
 
 # Import from itools
-from itools.i18n import Multilingual, get_language_name, get_languages
+from itools.i18n import get_language_name, get_languages
 
 # Import from Zope
 from Globals import InitializeClass
@@ -29,17 +29,84 @@
 from utils import lang_negotiator
 
 
-class LanguageManager(Multilingual):
+class LanguageManager(object):
     """ """
 
     security = ClassSecurityInfo()
 
-    manage_options = ({'label': u'Languages', 'action': 'manage_languages',
-                       'help': ('Localizer', 'LM_languages.stx')},)
+    # TODO For backwards compatibility with Python 2.1 the variable
+    # _languages is a tuple.  Change it to a frozenset.
+    _languages = ()
+    _default_language = None
 
 
     ########################################################################
     # API
+    ########################################################################
+    def get_languages(self):
+        """Returns all the object languages.
+        """
+        return self._languages
+
+
+    def set_languages(self, languages):
+        """Sets the object languages.
+        """
+        self._languages = tuple(languages)
+
+
+    def add_language(self, language):
+        """Adds a new language.
+        """
+        if language not in self._languages:
+            self._languages = tuple(self._languages) + (language,)
+
+
+    def del_language(self, language):
+        """Removes a language.
+        """
+        if language in self._languages:
+            languages = [ x for x in self._languages if x != language ]
+            self._languages = tuple(languages)
+
+
+    def get_languages_mapping(self):
+        """Returns a list of dictionary, one for each objects language. The
+        dictionary contains the language code, its name and a boolean value
+        that tells wether the language is the default one or not.
+        """
+        return [ {'code': x,
+                  'name': get_language_name(x),
+                  'default': x == self._default_language}
+                 for x in self._languages ]
+
+
+    def get_available_languages(self, **kw):
+        """Returns the langauges available. For example, a language could be
+        considered as available only if there is some data associated to it.
+
+        This method is used by the language negotiation code (see
+        'get_selected_language'), sometimes you will want to redefine it in
+        your classes.
+        """
+        return self._languages
+
+
+    def get_default_language(self):
+        """Returns the default language.
+
+        This method is used by the language negotiation code (see
+        'get_selected_language'), sometimes you will want to redefine it in
+        your classes.
+
+        For example, maybe you will want to define it to return always a
+        default language, even when internally it is None.
+        """
+        return self._default_language
+
+
+    ########################################################################
+    # Web API
     ########################################################################
 
     # Security settings
@@ -85,6 +152,12 @@
     ########################################################################
     # ZMI
     ########################################################################
+    manage_options = (
+        {'label': u'Languages', 'action': 'manage_languages',
+         'help': ('Localizer', 'LM_languages.stx')},
+    )
+
+
     security.declareProtected('View management screens', 'manage_languages')
     manage_languages = LocalDTMLFile('ui/LM_languages', globals())
 

Modified: experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LocalContent.py
URL: http://svn.erp5.org/experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LocalContent.py?rev=29329&r1=29328&r2=29329&view=diff
==============================================================================
--- experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LocalContent.py [utf8] (original)
+++ experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/LocalContent.py [utf8] Wed Sep 30 16:20:20 2009
@@ -23,8 +23,8 @@
 
 # Import from itools
 from itools.datatypes import LanguageTag
-from itools.tmx import TMX, Sentence, Message
-from itools.xliff import XLIFF, Translation, File as xliff_File
+from itools.tmx import TMXFile, Sentence, TMXUnit
+from itools.xliff import XLFFile
 
 # Import from Zope
 from OFS.SimpleItem import SimpleItem
@@ -40,8 +40,7 @@
 
 
 def md5text(str):
-    """
-    Create an MD5 sum (or hash) of a text. It is guaranteed to be 32 bytes
+    """Create an MD5 sum (or hash) of a text. It is guaranteed to be 32 bytes
     long.
     """
     return md5.new(str.encode('utf-8')).hexdigest()
@@ -142,67 +141,57 @@
     manage_export = LocalDTMLFile('ui/LC_export_form', globals())
 
     security.declareProtected('Manage messages', 'tmx_export')
-    def tmx_export(self, REQUEST, RESPONSE=None):
+    def tmx_export(self, REQUEST, RESPONSE):
+        """Exports the content of the message catalog to a TMX file.
         """
-        Exports the content of the message catalog to a TMX file
-        """
-        langorg = self._default_language
-
-        # build data structure for the xml header
-        xml_header = {}
-        xml_header['standalone'] = -1
-        xml_header['xml_version'] = u'1.0'
-        xml_header['document_type'] = (u'tmx',
-                                       u'http://www.lisa.org/tmx/tmx14.dtd')
-        # build data structure for the tmx header
-        version = u'1.4'
-        tmx_header = {}
-        tmx_header['creationtool'] = u'Localizer'
-        tmx_header['creationtoolversion'] = u'1.x'
-        tmx_header['datatype'] = u'plaintext'
-        tmx_header['segtype'] = u'paragraph'
-        tmx_header['adminlang'] = u'%s' % langorg
-        tmx_header['srclang'] = u'%s' % langorg
-        tmx_header['o-encoding'] = u'utf-8'
-
-
-        # Get the messages, and perhaps its translations.
-        d = {}
-        filename = '%s.tmx' % self.id
-
-        for k in self._local_properties.keys():
-            sentences = {}
+
+        src_lang = self._default_language
+
+        # Init the TMX handler
+        tmx = TMXFile()
+        tmx.header['creationtool'] = u'Localizer'
+        tmx.header['creationtoolversion'] = u'1.x'
+        tmx.header['datatype'] = u'plaintext'
+        tmx.header['segtype'] = u'paragraph'
+        tmx.header['adminlang'] = src_lang
+        tmx.header['srclang'] = src_lang
+        tmx.header['o-encoding'] = u'utf-8'
+
+        # Add the translation units
+        for key in self._local_properties.keys():
+            unit = TMXUnit({})
             for lang in self._languages:
-                trans, fuzzy = self.get_localproperty(k, lang)
-                sentences[lang] = Sentence(trans, {'lang':lang})
-            d[self.get_localproperty(k, langorg)[0]] = Message(sentences)
-
-        tmx = TMX()
-        tmx.build(xml_header, version, tmx_header, d)
-
-        if RESPONSE is not None:
-            RESPONSE.setHeader('Content-type','application/data')
-            RESPONSE.setHeader('Content-Disposition',
-                               'attachment; filename="%s"' % filename)
-
-        return tmx.to_str()
+                sentence = Sentence({'lang': lang})
+                trans, fuzzy = self.get_localproperty(key, lang)
+                sentence.text = trans
+                unit.msgstr[lang] = sentence
+            tmx.messages[self.get_localproperty(key, src_lang)[0]] = unit
+
+        # Serialize
+        data = tmx.to_str()
+        # Set response headers
+        RESPONSE.setHeader('Content-type','application/data')
+        RESPONSE.setHeader('Content-Disposition',
+                           'attachment; filename="%s.tmx"' % self.id)
+        # Ok
+        return data
 
 
 
     security.declareProtected('Manage messages', 'tmx_import')
     def tmx_import(self, file, REQUEST=None, RESPONSE=None):
-        """ Imports a TMX level 1 file.
+        """Imports a TMX level 1 file.
         """
         try:
             data = file.read()
-            tmx = TMX(string=data)
+            tmx = TMXFile(string=data)
         except:
             return MessageDialog(title = 'Parse error',
                                message = _('impossible to parse the file') ,
                                action = 'manage_import',)
 
-        for (id, msg) in tmx.state.messages.items():
-            for (prop, d) in self._local_properties.items():
+        for id, msg in tmx.messages.items():
+            for prop, d in self._local_properties.items():
                 if d[self._default_language][0] == id:
                     msg.msgstr.pop(self._default_language)
                     for lang in msg.msgstr.keys():
@@ -226,61 +215,50 @@
 
 
     security.declareProtected('Manage messages', 'xliff_export')
-    def xliff_export(self, targetlang, export_all=1, REQUEST=None,
-                     RESPONSE=None):
+    def xliff_export(self, dst_lang, export_all=1, REQUEST, RESPONSE):
         """ Exports the content of the message catalog to an XLIFF file
         """
-        orglang = self._default_language
+        from DateTime import DateTime
+
+        src_lang = self._default_language
         export_all = int(export_all)
-        from DateTime import DateTime
-
-        # Generate the XLIFF file header
-        RESPONSE.setHeader('Content-Type', 'text/xml; charset=UTF-8')
-        RESPONSE.setHeader('Content-Disposition',
-           'attachment; filename="%s_%s_%s.xlf"' % ( self.id, orglang,
-                                                     targetlang ))
-
-        # build data structure for the xml header
-        xml_header = {}
-        xml_header['standalone'] = -1
-        xml_header['xml_version'] = u'1.0'
-        xml_header['document_type'] = (u'xliff',
-              u'http://www.oasis-open.org/committees/xliff/documents/xliff.dtd')
-
-        version = u'1.0'
-
-        # build the data-stucture for the File tag
-        attributes = {}
-        attributes['original'] = u'/%s' % self.absolute_url(1)
+
+        # Init the XLIFF handler
+        xliff = XLFFile()
+        # Add the translation units
+        original = '/%s' % self.absolute_url(1)
+        for prop in self._local_properties.keys():
+            target, fuzzy = self.get_localproperty(prop, dst_lang)
+            msgkey, fuzzy = self.get_localproperty(prop, src_lang)
+            # If 'export_all' is true export all messages, otherwise export
+            # only untranslated messages
+            if export_all or not target:
+                unit = xliff.add_unit(original, msgkey, None)
+                unit.attributes['id'] = md5text(msgkey)
+                if target:
+                    unit.target = target
+
+        # Set the file attributes
+        file = xliff.files[original]
+        attributes = file.attributes
+        attributes['original'] = original
         attributes['product-name'] = u'Localizer'
         attributes['product-version'] = u'1.1.x'
         attributes['data-type'] = u'plaintext'
-        attributes['source-language'] = orglang
-        attributes['target-language'] = targetlang
+        attributes['source-language'] = src_lang
+        attributes['target-language'] = dst_lang
         attributes['date'] = DateTime().HTML4()
 
-        # Get the messages, and perhaps its translations.
-        d = {}
-
-        for prop in self._local_properties.keys():
-            target, fuzzy = self.get_localproperty(prop, targetlang)
-            msgkey, fuzzy = self.get_localproperty(prop, self._default_language)
-            # if export_all=1 export all messages otherwise export
-            # only untranslated messages
-            if export_all or not target:
-                id = md5text(msgkey)
-                if target:
-                    t = Translation(msgkey, target, {'id':id})
-                else:
-                    t = Translation(msgkey, msgkey, {'id':id})
-                d[msgkey] = t
-
-        files = [xliff_File(d, attributes)]
-
-        xliff = XLIFF()
-        xliff.build(xml_header, version, files)
-
-        return xliff.to_str()
+        # Serialize
+        xliff = xliff.to_str()
+        # Set response headers
+        RESPONSE.setHeader('Content-Type', 'text/xml; charset=UTF-8')
+        filename = '%s_%s_%s.xlf' % (self.id, src_lang, dst_lang)
+        RESPONSE.setHeader('Content-Disposition',
+           'attachment; filename="%s"' % filename)
+        # Ok
+        return xliff
+
 
     security.declareProtected('Manage messages', 'xliff_import')
     def xliff_import(self, file, REQUEST=None):
@@ -290,7 +268,7 @@
         """
         try:
             data = file.read()
-            xliff = XLIFF(string=data)
+            xliff = XLFFile(string=data)
         except:
             return MessageDialog(title = 'Parse error',
                                  message = _('impossible to parse the file') ,
@@ -309,7 +287,7 @@
                 self._languages += (lang,)
 
         # get messages
-        for file in xliff.state.files:
+        for file in xliff.files:
             cur_target = file.attributes.get('target-language', '')
             for msg in file.body.keys():
                 for (prop, val) in self._local_properties.items():

Modified: experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/MessageCatalog.py
URL: http://svn.erp5.org/experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/MessageCatalog.py?rev=29329&r1=29328&r2=29329&view=diff
==============================================================================
--- experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/MessageCatalog.py [utf8] (original)
+++ experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/MessageCatalog.py [utf8] Wed Sep 30 16:20:20 2009
@@ -31,9 +31,8 @@
 # Import from itools
 from itools.datatypes import LanguageTag
 import itools.gettext
-from itools.tmx import TMX, Sentence, Message, Note
-from itools.xliff import XLIFF, Translation, Note as xliff_Note, \
-    File as xliff_File
+from itools.tmx import TMXFile, Sentence, TMXUnit, TMXNote
+from itools.xliff import XLFFile, XLFNote
 
 # Import from Zope
 from AccessControl import ClassSecurityInfo
@@ -152,6 +151,9 @@
     meta_type = 'MessageCatalog'
 
     security = ClassSecurityInfo()
+
+    implements(ITranslationDomain)
+
 
     def __init__(self, id, title, sourcelang, languages):
         self.id = id
@@ -272,28 +274,33 @@
 
     __call__ = gettext
 
-    implements(ITranslationDomain)
 
     def translate(self, msgid, mapping=None, context=None,
                   target_language=None, default=None):
-        """See zope.i18n.interfaces.ITranslationDomain."""
+        """See zope.i18n.interfaces.ITranslationDomain.
+        """
         msgstr = self.gettext(msgid, lang=target_language, default=default)
         return interpolate(msgstr, mapping)
 
-    def getdomain(self): return unicode(self.id)
-    domain = property(fget=getdomain, 
+
+    def getdomain(self):
+        return unicode(self.id)
+
+
+    domain = property(fget=getdomain,
                       doc="See zope.i18n.interfaces.ITranslationDomain.")
+
 
     def manage_afterAdd(self, item, container):
         if item is self:
             sm = getSiteManager(container)
             sm.registerUtility(item, ITranslationDomain, item.domain)
 
+
     def manage_beforeDelete(self, item, container):
         if item is self:
             sm = getSiteManager(container)
             sm.unregisterUtility(item, ITranslationDomain, item.domain)
-        
 
 
     #######################################################################
@@ -677,56 +684,45 @@
     def tmx_export(self, REQUEST, RESPONSE=None):
         """Exports the content of the message catalog to a TMX file
         """
-        orglang = self._default_language
+        src_lang = self._default_language
 
         # Get the header info
-        header = self.get_po_header(orglang)
+        header = self.get_po_header(src_lang)
         charset = header['charset']
 
-        # build data structure for the xml header
-        xml_header = {}
-        xml_header['standalone'] = -1
-        xml_header['xml_version'] = u'1.0'
-        xml_header['document_type'] = (u'tmx',
-                                       u'http://www.lisa.org/tmx/tmx14.dtd')
-        # build data structure for the tmx header
-        version = u'1.4'
-        tmx_header = {}
-        tmx_header['creationtool'] = u'Localizer'
-        tmx_header['creationtoolversion'] = u'1.x'
-        tmx_header['datatype'] = u'plaintext'
-        tmx_header['segtype'] = u'paragraph'
-        tmx_header['adminlang'] = u'%s' % orglang
-        tmx_header['srclang'] = u'%s' % orglang
-        tmx_header['o-encoding'] = u'%s' % charset.lower()
+        # Init the TMX handler
+        tmx = TMXFile()
+        tmx.header['creationtool'] = u'Localizer'
+        tmx.header['creationtoolversion'] = u'1.x'
+        tmx.header['datatype'] = u'plaintext'
+        tmx.header['segtype'] = u'paragraph'
+        tmx.header['adminlang'] = src_lang
+        tmx.header['srclang'] = src_lang
+        tmx.header['o-encoding'] = u'%s' % charset.lower()
 
         # handle messages
-        d = {}
-        filename = '%s.tmx' % self.id
         for msgkey, transunit in self._messages.items():
-            sentences = {}
+            unit = TMXUnit({})
             for lang in transunit.keys():
                 if lang != 'note':
-                    s = Sentence(transunit[lang], {'lang':'%s'%lang})
-                    sentences[lang] = s
-
-            if orglang not in transunit.keys():
-                s = Sentence(msgkey, {'lang':'%s' % orglang})
-                sentences[orglang] = s
+                    sentence = Sentence({'lang': lang})
+                    sentence.text = transunit[lang]
+                    unit.msgstr[lang] = sentence
+
+            if src_lang not in transunit.keys():
+                sentence = Sentence({'lang': src_lang})
+                sentence.text = msgkey
+                unit.msgstr[src_lang] = sentence
 
             if transunit.has_key('note'):
-                d[msgkey] = Message(sentences, {},
-                                    [Note(transunit.get('note'))])
-            else:
-                d[msgkey] = Message(sentences)
-
-        tmx = TMX()
-        tmx.build(xml_header, version, tmx_header, d)
+                note = TMXNote(transunit.get('note'))
+                unit.notes.append(note)
+            tmx.messages[msgkey] = unit
 
         if RESPONSE is not None:
             RESPONSE.setHeader('Content-type','application/data')
             RESPONSE.setHeader('Content-Disposition',
-                               'attachment; filename="%s"' % filename)
+                               'attachment; filename="%s.tmx"' % self.id)
 
         return tmx.to_str()
 
@@ -738,7 +734,7 @@
         """
         try:
             data = file.read()
-            tmx = TMX(string=data)
+            tmx = TMXFile(string=data)
         except:
             return MessageDialog(title = 'Parse error',
                                  message = _('impossible to parse the file') ,
@@ -753,37 +749,36 @@
             self._languages = ()
             self._default_language = tmx.get_srclang()
 
-        for (id, msg) in tmx.state.messages.items():
+        for id, msg in tmx.messages.items():
             if not self._messages.has_key(id) and howmuch == 'existing':
-                pass
-            else:
-                msg.msgstr.pop(self._default_language)
-                if not self._messages.has_key(id):
-                    self._messages[id] = {}
-                for lang in msg.msgstr.keys():
-                    # normalize the languageTag and extract the core
-                    (core, local) = LanguageTag.decode(lang)
-                    lang = LanguageTag.encode((core, local))
-                    if lang not in self._languages:
-                        self._languages += (lang,)
-                    if msg.msgstr[lang].text:
-                        self._messages[id][lang] = msg.msgstr[lang].text
-                        if core != lang and core != self._default_language:
-                            if core not in self._languages:
-                                self._languages += (core,)
-                            if not msg.msgstr.has_key(core):
-                                self._messages[id][core] = msg.msgstr[lang].text
-                if msg.notes:
-                    ns = [m.text for m in msg.notes]
-                    self._messages[id]['note'] = u' '.join(ns)
-                    num_notes += 1
-                num_trans += 1
+                continue
+            msg.msgstr.pop(self._default_language)
+            if not self._messages.has_key(id):
+                self._messages[id] = {}
+            for lang in msg.msgstr.keys():
+                # normalize the languageTag and extract the core
+                (core, local) = LanguageTag.decode(lang)
+                lang = LanguageTag.encode((core, local))
+                if lang not in self._languages:
+                    self._languages += (lang,)
+                if msg.msgstr[lang].text:
+                    self._messages[id][lang] = msg.msgstr[lang].text
+                    if core != lang and core != self._default_language:
+                        if core not in self._languages:
+                            self._languages += (core,)
+                        if not msg.msgstr.has_key(core):
+                            self._messages[id][core] = msg.msgstr[lang].text
+            if msg.notes:
+                ns = [m.text for m in msg.notes]
+                self._messages[id]['note'] = u' '.join(ns)
+                num_notes += 1
+            num_trans += 1
 
         if REQUEST is not None:
+            message = _(u'Imported %d messages and %d notes')
             return MessageDialog(
                 title = _(u'Messages imported'),
-                message = _(u'Imported %d messages and %d notes')
-                          % (num_trans, num_notes),
+                message = message % (num_trans, num_notes),
                 action = 'manage_messages')
 
 
@@ -796,60 +791,54 @@
     hasLS = message_exists  # CMFLocalizer uses it
 
     security.declareProtected('Manage messages', 'xliff_export')
-    def xliff_export(self, x, export_all=1, REQUEST=None, RESPONSE=None):
+    def xliff_export(self, dst_lang, export_all=1, REQUEST=None,
+                     RESPONSE=None):
         """Exports the content of the message catalog to an XLIFF file
         """
-        orglang = self._default_language
+        from DateTime import DateTime
+
+        src_lang = self._default_language
         export_all = int(export_all)
-        from DateTime import DateTime
-
-        # Generate the XLIFF file header
-        RESPONSE.setHeader('Content-Type', 'text/xml; charset=UTF-8')
-        RESPONSE.setHeader(
-            'Content-Disposition',
-            'attachment; filename="%s_%s_%s.xlf"' % (self.id, orglang, x))
-        # build data structure for the xml header
-        xml_header = {}
-        xml_header['standalone'] = -1
-        xml_header['xml_version'] = u'1.0'
-        xml_header['document_type'] = (u'xliff',
-              u'http://www.oasis-open.org/committees/xliff/documents/xliff.dtd')
-
-        version = u'1.0'
+
+        # Init the XLIFF handler
+        xliff = XLFFile()
+        # Add the translation units
+        original = '/%s' % self.absolute_url(1)
+        for msgkey, transunit in self._messages.items():
+            target = transunit.get(dst_lang, '')
+            # If 'export_all' is true export all messages, otherwise export
+            # only untranslated messages
+            if export_all or not target:
+                unit = xliff.add_unit(original, msgkey, None)
+                unit.attributes['id'] = md5text(msgkey)
+                if target:
+                    unit.target = target
+                # Add note
+                note = transunit.get('note')
+                if note:
+                    unit.notes.append(XLFNote(note))
 
         # build the data-stucture for the File tag
-        attributes = {}
-        attributes['original'] = u'/%s' % self.absolute_url(1)
+        file = xliff.files[original]
+        attributes = file.attributes
+        attributes['original'] = original
         attributes['product-name'] = u'Localizer'
         attributes['product-version'] = u'1.1.x'
         attributes['data-type'] = u'plaintext'
-        attributes['source-language'] = orglang
-        attributes['target-language'] = x
+        attributes['source-language'] = src_lang
+        attributes['target-language'] = dst_lang
         attributes['date'] = DateTime().HTML4()
 
-        # Get the messages, and perhaps its translations.
-        d = {}
-        for msgkey, transunit in self._messages.items():
-            target = transunit.get(x, '')
-            # if export_all=1 export all messages otherwise export
-            # only untranslated messages
-            if export_all or not target:
-                id = md5text(msgkey)
-                notes = []
-                if transunit.has_key('note') and transunit['note']:
-                    notes = [xliff_Note(transunit['note'])]
-                if target:
-                    t = Translation(msgkey, target, {'id':id}, notes)
-                else:
-                    t = Translation(msgkey, msgkey, {'id':id}, notes)
-                d[msgkey] = t
-
-        files = [xliff_File(d, attributes)]
-
-        xliff = XLIFF()
-        xliff.build(xml_header, version, files)
-
-        return xliff.to_str()
+        # Serialize
+        xliff = xliff.to_str()
+        # Set response headers
+        RESPONSE.setHeader('Content-Type', 'text/xml; charset=UTF-8')
+        filename = '%s_%s_%s.xlf' % (self.id, src_lang, dst_lang)
+        RESPONSE.setHeader('Content-Disposition',
+           'attachment; filename="%s"' % filename)
+        # Ok
+        return xliff
+
 
     security.declareProtected('Manage messages', 'xliff_import')
     def xliff_import(self, howmuch, file, REQUEST=None):
@@ -858,7 +847,7 @@
         """
         try:
             data = file.read()
-            xliff = XLIFF(string=data)
+            xliff = XLFFile(string=data)
         except:
             return MessageDialog(title = 'Parse error',
                                  message = _('impossible to parse the file') ,
@@ -884,7 +873,7 @@
                 self._languages += (lang,)
 
         # get messages
-        for file in xliff.state.files:
+        for file in xliff.files:
             cur_target = file.attributes.get('target-language', '')
             for msg in file.body.keys():
                 if not self._messages.has_key(msg) and howmuch == 'existing':

Modified: experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/README.txt
URL: http://svn.erp5.org/experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/README.txt?rev=29329&r1=29328&r2=29329&view=diff
==============================================================================
--- experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/README.txt [utf8] (original)
+++ experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/README.txt [utf8] Wed Sep 30 16:20:20 2009
@@ -7,11 +7,11 @@
 
 Requirements
 
-  - Python 2.4 or later
+  - Python 2.5.2 or later
 
-  - Zope 2.9 or later
+  - Zope 2.12 or later
 
-  - itools 0.20.6 or later (download from
+  - itools 0.50.6 or later (download from
     "http://www.hforge.org/itools":http://www.hforge.org/itools)
 
 
@@ -20,12 +20,12 @@
   Download Localizer. Unpack the tarball and install it in the "Products"
   directory::
 
-    $ tar xzf Localizer-1.2.3.tar.gz
-    $ cp -r Localizer-1.2.3 <Zope instance>/Products/Localizer
+    $ tar xzf Localizer-1.3.0.tar.gz
+    $ cp -r Localizer-1.3.0 <Zope instance>/Products/Localizer
 
   Another option, case you are running Unix, is to use symbolic links::
 
-    $ ln -s Localizer-1.2.3 <Zope instance>/Products/Localizer
+    $ ln -s Localizer-1.3.0 <Zope instance>/Products/Localizer
 
 
 Resources
@@ -58,7 +58,7 @@
 
 Author and License
 
-  Copyright 2001-2008  J. David Ib�z (jdavid at itaapy.com)
+  Copyright 2001-2009  J. David Ib�z (jdavid at itaapy.com)
             2001 Universitat Jaume I
 
   This program is free software: you can redistribute it and/or modify

Modified: experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/__init__.py
URL: http://svn.erp5.org/experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/__init__.py?rev=29329&r1=29328&r2=29329&view=diff
==============================================================================
--- experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/__init__.py [utf8] (original)
+++ experimental/erp5.buildout-zope-2.12/trunk/src/Products/Localizer/__init__.py [utf8] Wed Sep 30 16:20:20 2009
@@ -15,14 +15,14 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # Check whether itools is installed
-msg = ('itools 0.16 or later is needed, download from '
-       'http://www.ikaaro.org/itools')
+msg = ('itools 0.50 or later is needed, download from '
+       'http://www.hforge.org/itools')
 try:
     import itools
 except ImportError:
     raise ImportError, msg
-# Check itools is version 0.16 or later
-if itools.__version__ < '0.16':
+# Check itools is version 0.50 or later
+if itools.__version__ < '0.50':
     raise ImportError, msg
 
 # Import from the Standard Library




More information about the Erp5-report mailing list