[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