From 8aabfd285408bf031e53c23fbfc5a2763a941dda Mon Sep 17 00:00:00 2001 From: Leonardo Rochael Almeida <leonardo@nexedi.com> Date: Fri, 15 Jun 2012 11:54:38 +0200 Subject: [PATCH] Clean-up Localizer fork Remove files/functionalities not needed by ERP5 --- product/Localizer/LocalAttributes.py | 60 ---- product/Localizer/LocalContent.py | 299 ----------------- product/Localizer/LocalFiles.py | 28 +- product/Localizer/LocalFolder.py | 96 ------ product/Localizer/LocalPropertyManager.py | 317 ------------------ product/Localizer/Locale.py | 30 -- product/Localizer/LocalizerSupport.py | 126 ------- product/Localizer/Makefile | 23 -- product/Localizer/MessageCatalog.py | 213 ------------ product/Localizer/README.txt | 59 +--- product/Localizer/RELEASE-1.3.0 | 43 --- product/Localizer/TODO.txt | 161 --------- product/Localizer/UPGRADE.txt | 218 ------------ product/Localizer/__init__.py | 33 +- product/Localizer/archive/CHANGES.txt | 295 ---------------- product/Localizer/archive/RELEASE-0.9.0 | 82 ----- product/Localizer/archive/RELEASE-0.9.1 | 49 --- product/Localizer/archive/RELEASE-0.9.2 | 42 --- product/Localizer/archive/RELEASE-0.9.3 | 37 -- product/Localizer/archive/RELEASE-1.0.0 | 26 -- product/Localizer/archive/RELEASE-1.0.1 | 41 --- product/Localizer/archive/RELEASE-1.1.0 | 102 ------ product/Localizer/archive/RELEASE-1.1.3 | 40 --- product/Localizer/doc/RELEASE-1.2.0 | 37 -- product/Localizer/doc/RELEASE-1.2.1 | 28 -- product/Localizer/doc/RELEASE-1.2.2 | 32 -- product/Localizer/doc/RELEASE-1.2.3 | 31 -- product/Localizer/ui/LC_export_form.dtml | 66 ---- product/Localizer/ui/LC_import_form.dtml | 46 --- product/Localizer/ui/LPM_properties.dtml | 113 ------- product/Localizer/ui/LPM_translations.dtml | 92 ----- product/Localizer/ui/LocalContent_add.dtml | 43 --- product/Localizer/ui/LocalFolder_add.dtml | 44 --- .../Localizer/ui/LocalFolder_attributes.dtml | 56 ---- product/Localizer/ui/MC_Export_form.dtml | 61 ---- product/Localizer/ui/MC_Import_form.dtml | 65 ---- product/Localizer/utils.py | 21 +- product/Localizer/zgettext.py | 261 -------------- 38 files changed, 21 insertions(+), 3395 deletions(-) delete mode 100644 product/Localizer/LocalAttributes.py delete mode 100644 product/Localizer/LocalContent.py delete mode 100644 product/Localizer/LocalFolder.py delete mode 100644 product/Localizer/LocalPropertyManager.py delete mode 100644 product/Localizer/Locale.py delete mode 100644 product/Localizer/LocalizerSupport.py delete mode 100644 product/Localizer/Makefile delete mode 100644 product/Localizer/RELEASE-1.3.0 delete mode 100644 product/Localizer/TODO.txt delete mode 100644 product/Localizer/UPGRADE.txt delete mode 100644 product/Localizer/archive/CHANGES.txt delete mode 100644 product/Localizer/archive/RELEASE-0.9.0 delete mode 100644 product/Localizer/archive/RELEASE-0.9.1 delete mode 100644 product/Localizer/archive/RELEASE-0.9.2 delete mode 100644 product/Localizer/archive/RELEASE-0.9.3 delete mode 100644 product/Localizer/archive/RELEASE-1.0.0 delete mode 100644 product/Localizer/archive/RELEASE-1.0.1 delete mode 100644 product/Localizer/archive/RELEASE-1.1.0 delete mode 100644 product/Localizer/archive/RELEASE-1.1.3 delete mode 100644 product/Localizer/doc/RELEASE-1.2.0 delete mode 100644 product/Localizer/doc/RELEASE-1.2.1 delete mode 100644 product/Localizer/doc/RELEASE-1.2.2 delete mode 100644 product/Localizer/doc/RELEASE-1.2.3 delete mode 100644 product/Localizer/ui/LC_export_form.dtml delete mode 100644 product/Localizer/ui/LC_import_form.dtml delete mode 100644 product/Localizer/ui/LPM_properties.dtml delete mode 100644 product/Localizer/ui/LPM_translations.dtml delete mode 100644 product/Localizer/ui/LocalContent_add.dtml delete mode 100644 product/Localizer/ui/LocalFolder_add.dtml delete mode 100644 product/Localizer/ui/LocalFolder_attributes.dtml delete mode 100755 product/Localizer/zgettext.py diff --git a/product/Localizer/LocalAttributes.py b/product/Localizer/LocalAttributes.py deleted file mode 100644 index 5e9e70e4f6..0000000000 --- a/product/Localizer/LocalAttributes.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (C) 2000-2002 Juan David Ibáñez Palomar <jdavid@itaapy.com> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# Import from Zope -from ExtensionClass import Base - - -class LocalAttribute(Base): - """ - Provides a way to override class variables, useful for example - for title (defined in SimpleItem). - """ - - def __init__(self, id): - self.id = id - - def __of__(self, parent): - return parent.getLocalAttribute(self.id) - - -class LocalAttributesBase: - def getLocalAttribute(self, name, lang=None): - """ """ - raise NotImplemented - - -class LocalAttributes(LocalAttributesBase): - """ - Example of a 'LocalAttributesBase' derived class, this also a base class - for 'LocalFolder.LocalFolder' and 'Locale.Locale', it can be considered - the default implementation. - - Returns attributes of the form <name>_<lang>. When <lang> has more than - one level, for example es-CO, the dashes are transformed to underscores, - as dashes aren't valid charecters for identifiers in Python. For example, - the call 'getLocalAttribute("long_date", "es-CO")' would return - 'self.long_date_es_CO'. - """ - - def getLocalAttribute(self, name, lang=None): - if lang is None: - lang = self.get_selected_language() - - lang = lang.replace('-', '_') - name = '%s_%s' % (name, lang) - - return getattr(self, name) diff --git a/product/Localizer/LocalContent.py b/product/Localizer/LocalContent.py deleted file mode 100644 index 3da781e804..0000000000 --- a/product/Localizer/LocalContent.py +++ /dev/null @@ -1,299 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (C) 2000-2005 Juan David Ibáñez Palomar <jdavid@itaapy.com> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# Import from the Standard Library -from hashlib import md5 - -# Import from itools -from itools.datatypes import LanguageTag -from itools.tmx import TMXFile, Sentence, TMXUnit -from itools.xliff import XLFFile - -# Import from Zope -from Acquisition import aq_base, aq_parent -from App.class_init import InitializeClass -from App.Dialogs import MessageDialog -from OFS.SimpleItem import SimpleItem -from OFS.PropertyManager import PropertyManager -from Products.ZCatalog.CatalogPathAwareness import CatalogAware -from AccessControl import ClassSecurityInfo - -# Import from Localizer -from LocalAttributes import LocalAttribute -from LocalFiles import LocalDTMLFile -from LocalPropertyManager import LocalPropertyManager -from utils import _ - - -def md5text(str): - """Create an MD5 sum (or hash) of a text. It is guaranteed to be 32 bytes - long. - """ - return md5(str.encode('utf-8')).hexdigest() - - -manage_addLocalContentForm = LocalDTMLFile('ui/LocalContent_add', globals()) -def manage_addLocalContent(self, id, sourcelang, languages, REQUEST=None): - """ """ - languages.append(sourcelang) # Make sure source is one of the target langs - self._setObject(id, LocalContent(id, sourcelang, tuple(languages))) - - if REQUEST is not None: - return self.manage_main(self, REQUEST) - - -class LocalContent(CatalogAware, LocalPropertyManager, PropertyManager, - SimpleItem): - """ """ - - meta_type = 'LocalContent' - - security = ClassSecurityInfo() - - # Properties metadata - _local_properties_metadata = ({'id': 'title', 'type': 'string'}, - {'id': 'body', 'type': 'text'}) - - _properties = () - - title = LocalAttribute('title') # Override title from SimpleItem - body = LocalAttribute('body') - - - manage_options = \ - LocalPropertyManager.manage_options \ - + PropertyManager.manage_options[:1] \ - + ({'action': 'manage_import', 'label': u'Import', - 'help': ('Localizer', 'MC_importExport.stx')}, - {'action': 'manage_export', 'label': u'Export', - 'help': ('Localizer', 'MC_importExport.stx')}) \ - + PropertyManager.manage_options[1:] \ - + SimpleItem.manage_options - - - def __init__(self, id, sourcelang, languages): - self.id = id - self._default_language = sourcelang - self._languages = languages - - - index_html = None # Prevent accidental acquisition - - - def __call__(self, client=None, REQUEST=None, RESPONSE=None, **kw): - if REQUEST is None: - REQUEST = self.REQUEST - - # Get the template to use - template_id = 'default_template' - if hasattr(aq_base(self), 'default_template'): - template_id = self.default_template - - # Render the object - template = getattr(aq_parent(self), template_id) - template = template.__of__(self) - return apply(template, ((client, self), REQUEST), kw) - - - # Override some methods to be sure that LocalContent objects are - # reindexed when changed. - def set_localpropvalue(self, id, lang, value): - LocalContent.inheritedAttribute('set_localpropvalue')(self, id, lang, - value) - - self.reindex_object() - - - def del_localproperty(self, id): - LocalContent.inheritedAttribute('del_localproperty')(self, id) - - self.reindex_object() - - security.declareProtected('View management screens', 'manage_import') - manage_import = LocalDTMLFile('ui/LC_import_form', globals()) - - ####################################################################### - # TMX support - security.declareProtected('View management screens', 'manage_export') - manage_export = LocalDTMLFile('ui/LC_export_form', globals()) - - security.declareProtected('Manage messages', 'tmx_export') - def tmx_export(self, REQUEST, RESPONSE): - """Exports the content of the message catalog to a TMX file. - """ - - 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: - 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. - """ - try: - data = file.read() - tmx = TMXFile(string=data) - except: - return MessageDialog(title = 'Parse error', - message = _('impossible to parse the file') , - action = 'manage_import',) - - 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(): - # 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,) - texte = msg.msgstr[lang].text - if texte: - self.set_localpropvalue(prop, lang, texte) - 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.set_localpropvalue(prop, lang, texte) - - if REQUEST is not None: - RESPONSE.redirect('manage_localPropertiesForm') - - - - security.declareProtected('Manage messages', 'xliff_export') - def xliff_export(self, dst_lang, export_all=1, REQUEST=None, - RESPONSE=None): - """ Exports the content of the message catalog to an XLIFF file - """ - from DateTime import DateTime - - src_lang = self._default_language - export_all = int(export_all) - - # 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'] = src_lang - attributes['target-language'] = dst_lang - attributes['date'] = DateTime().HTML4() - - # 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): - """ XLIFF is the XML Localization Interchange File Format - designed by a group of software providers. - It is specified by www.oasis-open.org - """ - try: - data = file.read() - xliff = XLFFile(string=data) - except: - return MessageDialog(title = 'Parse error', - message = _('impossible to parse the file') , - action = 'manage_import',) - - num_trans = 0 - (file_ids, sources, targets) = xliff.get_languages() - - # update languages - if len(sources) > 1 or sources[0] != self._default_language: - return MessageDialog(title = 'Language error', - message = _('incompatible language sources') , - action = 'manage_import',) - for lang in targets: - if lang != self._default_language and lang not in self._languages: - self._languages += (lang,) - - # get messages - 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(): - if val[self._default_language][0] == msg: - if cur_target and file.body[msg].target: - texte = file.body[msg].target - self.set_localpropvalue(prop, cur_target, texte) - num_trans += 1 - - if REQUEST is not None: - return MessageDialog( - title = _(u'Messages imported'), - message = (_(u'Imported %d messages to %s') % - (num_trans, ' '.join(targets))), - action = 'manage_localPropertiesForm') - - -InitializeClass(LocalContent) diff --git a/product/Localizer/LocalFiles.py b/product/Localizer/LocalFiles.py index 48be2f7e65..cdbe4dbd4b 100644 --- a/product/Localizer/LocalFiles.py +++ b/product/Localizer/LocalFiles.py @@ -1,4 +1,4 @@ -# -*- coding: UTF-8 -*- +# -*- coding: utf-8 -*- # Copyright (C) 2000-2005 Juan David Ibáñez Palomar <jdavid@itaapy.com> # # This program is free software: you can redistribute it and/or modify @@ -47,29 +47,3 @@ class LocalDTMLFile(DomainAware, DTMLFile): bound_data['gettext'] = self.gettext return apply(LocalDTMLFile.inheritedAttribute('_exec'), (self, bound_data, args, kw)) - - - -# Zope Page Templates (ZPT) -# XXX Deprecated, use the i18n namespace instead. -try: - from Products.PageTemplates.PageTemplateFile import PageTemplateFile -except ImportError: - # If ZPT is not installed - class LocalPageTemplateFile: - pass -else: - class LocalPageTemplateFile(DomainAware, PageTemplateFile): - """ """ - - def __init__(self, name, _prefix=None, **kw): - PageTemplateFile.__init__(self, name, _prefix, **kw) - DomainAware.__init__(self, _prefix) - - - def _exec(self, bound_data, args, kw): - # Add our gettext first - bound_data['gettext'] = self.gettext - return apply(LocalPageTemplateFile.inheritedAttribute('_exec'), - (self, bound_data, args, kw)) - diff --git a/product/Localizer/LocalFolder.py b/product/Localizer/LocalFolder.py deleted file mode 100644 index f001938b74..0000000000 --- a/product/Localizer/LocalFolder.py +++ /dev/null @@ -1,96 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (C) 2000-2004 Juan David Ibáñez Palomar <jdavid@itaapy.com> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# Import from Zope -from App.Common import package_home -from OFS.Folder import Folder - -# Import from Localizer -from LanguageManager import LanguageManager -from LocalFiles import LocalDTMLFile -from LocalAttributes import LocalAttribute, LocalAttributes -from utils import _ - - - -manage_addLocalFolderForm = LocalDTMLFile('ui/LocalFolder_add', globals()) -def manage_addLocalFolder(self, id, title, languages, REQUEST=None): - """ """ - id = id.strip() - self._setObject(id, LocalFolder(id, title, languages)) - - if REQUEST is not None: - return self.manage_main(self, REQUEST) - - - -class LocalFolder(LanguageManager, LocalAttributes, Folder): - """ """ - - meta_type = 'LocalFolder' - - _properties = ({'id': 'title', 'type': 'string'},) - - - def __init__(self, id, title, languages): - self.id = id - self.title = title - - # Language Manager data - self._languages = tuple(languages) - self._default_language = languages[0] - - # Local attributes - self._local_attributes = () - - - manage_options = \ - Folder.manage_options[:1] \ - + ({'action': 'manage_attributes', 'label': u'Attributes'},) \ - + LanguageManager.manage_options \ - + Folder.manage_options[1:] - - - # Manage attributes - manage_attributes = LocalDTMLFile('ui/LocalFolder_attributes', globals()) - - def get_local_attributes(self): - return self._local_attributes - - - def manage_delAttributes(self, attributes, REQUEST=None, RESPONSE=None): - """ """ - local_attributes = list(self._local_attributes) - - for attr in attributes: - local_attributes.remove(attr) - delattr(self, attr) - - self._local_attributes = tuple(local_attributes) - - if RESPONSE is not None: - RESPONSE.redirect("%s/manage_attributes" % REQUEST['URL1']) - - - def manage_addAttribute(self, id, REQUEST=None, RESPONSE=None): - """ """ - id = id.strip() - setattr(self, id, LocalAttribute(id)) - - self._local_attributes = self._local_attributes + (id,) - - if RESPONSE is not None: - RESPONSE.redirect("%s/manage_attributes" % REQUEST['URL1']) diff --git a/product/Localizer/LocalPropertyManager.py b/product/Localizer/LocalPropertyManager.py deleted file mode 100644 index cadced27c1..0000000000 --- a/product/Localizer/LocalPropertyManager.py +++ /dev/null @@ -1,317 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (C) 2000-2004 Juan David Ibáñez Palomar <jdavid@itaapy.com> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# Import from the Standard Library -from urllib import quote -from time import time - -# Import from Zope -from AccessControl import ClassSecurityInfo -from Acquisition import aq_base -from App.class_init import InitializeClass - -# Import from Localizer -from LanguageManager import LanguageManager -from LocalAttributes import LocalAttribute, LocalAttributesBase -from LocalFiles import LocalDTMLFile - - -# FIXME -# For backwards compatibility (<= 0.8.0): other classes import 'LocalProperty' -# Since this may be stored as a persistent value, we cannot remove it, first -# we must provide an upgrade facility -LocalProperty = LocalAttribute - - -class LocalPropertyManager(LanguageManager, LocalAttributesBase): - """ - Mixin class that allows to manage localized properties. - Somewhat similar to OFS.PropertyManager. - """ - - security = ClassSecurityInfo() - - # Metadata for local properties - # Example: ({'id': 'title', 'type': 'string'},) - _local_properties_metadata = () - - # Local properties are stored here - # Example: {'title': {'en': ('Title', timestamp), 'es': ('TÃtul', timestamp)}} - _local_properties = {} - - # Useful to find or index all LPM instances - isLocalPropertyManager = 1 - - - def getLocalPropertyManager(self): - """ - Returns the instance, useful to get the object through acquisition. - """ - return self - - manage_options = ( - {'action': 'manage_localPropertiesForm', - 'label': u'Local properties', - 'help': ('Localizer', 'LPM_properties.stx')}, - {'action': 'manage_transPropertiesForm', - 'label': u'Translate properties', - 'help': ('Localizer', 'LPM_translate.stx')}) \ - + LanguageManager.manage_options - - - security.declarePublic('hasLocalProperty') - def hasLocalProperty(self, id): - """Return true if object has a property 'id'""" - for property in self._local_properties_metadata: - if property['id'] == id: - return 1 - return 0 - - - security.declareProtected('View management screens', - 'manage_localPropertiesForm') - manage_localPropertiesForm = LocalDTMLFile('ui/LPM_properties', globals()) - - security.declareProtected('View management screens', - 'manage_transPropertiesForm') - manage_transPropertiesForm = LocalDTMLFile('ui/LPM_translations', globals()) - - - security.declareProtected('Manage properties', 'set_localpropvalue') - def set_localpropvalue(self, id, lang, value): - # Get previous value - old_value, timestamp = self.get_localproperty(id, lang) - if old_value is None: - old_value = '' - # Update value only if it is different - if value != old_value: - properties = self._local_properties.copy() - if not properties.has_key(id): - properties[id] = {} - - properties[id][lang] = (value, time()) - - self._local_properties = properties - - - def get_localproperty(self, name, language): - if name not in self._local_properties: - return None, None - property = self._local_properties[name] - if language not in property: - return None, None - value = property[language] - if isinstance(value, tuple): - return value - return value, None - - - security.declareProtected('Manage properties', 'set_localproperty') - def set_localproperty(self, id, type, lang=None, value=None): - """Adds a new local property""" - if not self.hasLocalProperty(id): - self._local_properties_metadata += ({'id': id, 'type': type},) - setattr(self, id, LocalAttribute(id)) - - if lang is not None: - self.set_localpropvalue(id, lang, value) - - - security.declareProtected('Manage properties', 'del_localproperty') - def del_localproperty(self, id): - """Deletes a property""" - # Update properties metadata - p = [ x for x in self._local_properties_metadata if x['id'] != id ] - self._local_properties_metadata = tuple(p) - - # delete attribute - try: - del self._local_properties[id] - except KeyError: - pass - - try: - delattr(self, id) - except KeyError: - pass - - - security.declareProtected('Manage properties', 'manage_addLocalProperty') - def manage_addLocalProperty(self, id, type, REQUEST=None, RESPONSE=None): - """Adds a new local property""" - self.set_localproperty(id, type) - - if RESPONSE is not None: - url = "%s/manage_localPropertiesForm?manage_tabs_message=Saved changes." % REQUEST['URL1'] - RESPONSE.redirect(url) - - - security.declareProtected('Manage properties', 'manage_editLocalProperty') - def manage_editLocalProperty(self, REQUEST, RESPONSE=None): - """Edit a property""" - def_lang = self.get_default_language() - - form = REQUEST.form - for prop in self.getLocalProperties(): - name = prop['id'] - if form.has_key(name): - value = form[name].strip() - self.set_localpropvalue(name, def_lang, value) - - if REQUEST is not None: - url = "%s/%s?manage_tabs_message=Saved changes." \ - % (REQUEST['URL1'], REQUEST['destination']) - REQUEST.RESPONSE.redirect(url) - - - security.declareProtected('Manage properties', 'manage_delLocalProperty') - def manage_delLocalProperty(self, ids=[], REQUEST=None, RESPONSE=None): - """Deletes a property""" - for id in ids: - self.del_localproperty(id) - - if RESPONSE is not None: - url = "%s/manage_localPropertiesForm?manage_tabs_message=Saved changes." % REQUEST['URL1'] - RESPONSE.redirect(url) - - - security.declareProtected('Manage properties', 'manage_transLocalProperty') - def manage_transLocalProperty(self, id, code, value, REQUEST, - RESPONSE=None): - """Translate a property.""" - self.set_localpropvalue(id, code, value.strip()) - - if RESPONSE is not None: - url = "%s/%s?lang=%s&prop=%s&manage_tabs_message=Saved changes." \ - % (REQUEST['URL1'], REQUEST['destination'], code, id) - RESPONSE.redirect(url) - - - security.declareProtected('Manage properties', 'is_obsolete') - def is_obsolete(self, prop, lang): - default_language = self.get_default_language() - - value, t0 = self.get_localproperty(prop, default_language) - value, t1 = self.get_localproperty(prop, lang) - - if t0 is None: - return False - if t1 is None: - return True - return t1 < t0 - - - security.declarePublic('getTargetLanguages') - def get_targetLanguages(self): - """Get all languages except the default one.""" - def_lang = self.get_default_language() - all_langs = self.get_languages_mapping() - for record in all_langs: - if def_lang == record['code']: - all_langs.remove(record) - return all_langs - - - security.declarePublic('getLocalProperties') - def getLocalProperties(self): - """Returns a copy of the properties metadata.""" - return tuple([ x.copy() for x in self._local_properties_metadata ]) - - - security.declarePublic('getLocalAttribute') - def getLocalAttribute(self, id, lang=None): - """Returns a local property""" - # No language, look for the first non-empty available version - if lang is None: - lang = self.get_selected_language(property=id) - - value, timestamp = self.get_localproperty(id, lang) - if value is None: - return '' - return value - - - # Languages logic - security.declarePublic('get_available_languages') - def get_available_languages(self, **kw): - """ """ - languages = self.get_languages() - id = kw.get('property', None) - if id is None: - # Is this thing right?? - return languages - else: - if id in self._local_properties: - property = self._local_properties[id] - return [ x for x in languages if property.get(x, None) ] - else: - return [] - - - security.declarePublic('get_default_language') - def get_default_language(self): - """ """ - if self._default_language: - return self._default_language - - languages = self.get_languages() - if languages: - return languages[0] - - return None - - - # Upgrading.. - def _needs_upgrade(self): - return hasattr(aq_base(self), 'original_language') - - - def _upgrade(self): - # In version 0.7 the language management logic moved to the - # mixin class LanguageManager, as a consequence the attribute - # "original_language" changes its name to "_default_language". - if hasattr(aq_base(self), 'original_languge'): - self._default_language = self.original_language - del self.original_language - - # XXX With version 1.1.0b5 (as of patch 14) the '_local_properties' - # data structure keeps a timestamp to mark obsolete translations. - # The upgrade code below must be activated once the new upgrade - # framework is deployed, something that should happen for the 1.2 - # release. -## for k, v in self._local_properties.items(): -## for i, j in v.items(): -## if type(j) is not tuple: -## # XXX add the timestamp for every property -## self._local_properties[k][i] = (j, time()) -## self._p_changed = 1 - - - # Define <id>_<lang> attributes, useful for example to catalog - def __getattr__(self, name): - try: - index = name.rfind('_') - id, lang = name[:index], name[index+1:] - property = self._local_properties[id] - except: - raise AttributeError, "%s instance has no attribute '%s'" \ - % (self.__class__.__name__, name) - - return self.getLocalAttribute(id, lang) - - - -InitializeClass(LocalPropertyManager) diff --git a/product/Localizer/Locale.py b/product/Localizer/Locale.py deleted file mode 100644 index 13c63d2ea3..0000000000 --- a/product/Localizer/Locale.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (C) 2000-2002 Juan David Ibáñez Palomar <jdavid@itaapy.com> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# Import from Localizer -from LocalAttributes import LocalAttributes, LocalAttribute - - -class Locale(LocalAttributes): - - # Time, hours and minutes - time = LocalAttribute('time') - - def time_en(self, datetime): - return datetime.strftime('%H:%M') - - def time_es(self, datetime): - return datetime.strftime('%H.%M') diff --git a/product/Localizer/LocalizerSupport.py b/product/Localizer/LocalizerSupport.py deleted file mode 100644 index 8995f0ffc1..0000000000 --- a/product/Localizer/LocalizerSupport.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (C) 2002-2004 Juan David Ibáñez Palomar <jdavid@itaapy.com> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -""" -This module makes more easy to implement multilingual Zope products based -on Localizer that also work when Localizer is not installed (they are -monolingual in this situation). - -It provides dummy versions of some Localizer features. To internationalize -your code copy and paste this module to your product directory and, in the -modules you need it, just type: - - from LocalizerSupport import _ - from LocalizerSupport import LocalDTMLFile as DTMLFile - from LocalizerSupport import LocalPageTemplateFile as PageTemplateFile - -Another option is not to rename the classes, then you will have to -change from 'DTMLFile' to 'LocalDTMLFile' and from 'PageTemplateFile' -to 'LocalPageTemplateFile' wherever you need it. - -Note that Localizer requieres Python 2.4 or above, so the multilingual -version of your product will also requiere Python 2.4 or above. - -Of course, you don't need to import the features you don't need. -""" - -# The version information refers to the Localizer product version. -# If you change this module, please update the version number to -# show it. -__version__ = '1.2.0' - - -try: - from Products.Localizer import LocalDTMLFile, LocalPageTemplateFile - from Products.Localizer import _ -except ImportError: - # For Python code - def _(message, language=None): - """ - Used to markup a string for translation but without translating it, - this is known as deferred translations. - """ - return message - - - # For DTML and Page Templates - def gettext(self, message, language=None): - """ """ - return message - - - # Document Template Markup Langyage (DTML) - from Globals import DTMLFile - - class LocalDTMLFile(DTMLFile): - def _exec(self, bound_data, args, kw): - # Add our gettext first - bound_data['gettext'] = self.gettext - return apply(LocalDTMLFile.inheritedAttribute('_exec'), - (self, bound_data, args, kw)) - - gettext = gettext - - - # Zope Page Templates (ZPT) - try: - from Products.PageTemplates.PageTemplateFile import PageTemplateFile - except ImportError: - # If ZPT is not installed - class LocalPageTemplateFile: - pass - else: - class LocalPageTemplateFile(PageTemplateFile): - def _exec(self, bound_data, args, kw): - # Add our gettext first - bound_data['gettext'] = self.gettext - - return apply(LocalPageTemplateFile.inheritedAttribute('_exec'), - (self, bound_data, args, kw)) - - gettext = gettext - - - - - -# Dummy dtml-gettext tag -from DocumentTemplate.DT_Util import InstanceDict, namespace, render_blocks - -class GettextTag: - """ """ - - name = 'gettext' - blockContinuations = () - - def __init__(self, blocks): - tname, args, section = blocks[0] - self.section = section.blocks - - - def __call__(self, md): - ns = namespace(md)[0] - md._push(InstanceDict(ns, md)) - message = render_blocks(self.section, md) - md._pop(1) - - return message - - -# Register the dtml-gettext tag -from DocumentTemplate.DT_String import String -if not String.commands.has_key('gettext'): - String.commands['gettext'] = GettextTag diff --git a/product/Localizer/Makefile b/product/Localizer/Makefile deleted file mode 100644 index 3615c67ae7..0000000000 --- a/product/Localizer/Makefile +++ /dev/null @@ -1,23 +0,0 @@ - -PYTHON=python - - -po: - ${PYTHON} zgettext.py *.py ui/*.dtml -l ca de es eu fr hu it ja pt ru - -mo: - ${PYTHON} zgettext.py -m - -clean: - rm -f *~ *.pyc - rm -f locale/*~ locale/locale.pot.bak locale/*.mo - rm -f help/*~ - rm -f tests/*~ tests/*.pyc - rm -f ui/*~ - -test: - ${PYTHON} tests/test_zgettext.py - - -binary: clean mo - rm -f refresh.txt diff --git a/product/Localizer/MessageCatalog.py b/product/Localizer/MessageCatalog.py index 04f4e47ce8..261c4a5cd0 100644 --- a/product/Localizer/MessageCatalog.py +++ b/product/Localizer/MessageCatalog.py @@ -665,109 +665,6 @@ class MessageCatalog(LanguageManager, ObjectManager, SimpleItem): manage_Export_form = LocalDTMLFile('ui/MC_Export_form', globals()) - security.declareProtected('Manage messages', 'tmx_export') - def tmx_export(self, REQUEST, RESPONSE=None): - """Exports the content of the message catalog to a TMX file - """ - src_lang = self._default_language - - # Get the header info - header = self.get_po_header(src_lang) - charset = header['charset'] - - # 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 - for msgkey, transunit in self._messages.items(): - unit = TMXUnit({}) - for lang in transunit.keys(): - if lang != 'note': - 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'): - 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.tmx"' % self.id) - - return tmx.to_str() - - - - security.declareProtected('Manage messages', 'tmx_import') - def tmx_import(self, howmuch, file, REQUEST=None, RESPONSE=None): - """Imports a TMX level 1 file. - """ - try: - data = file.read() - tmx = TMXFile(string=data) - except: - return MessageDialog(title = 'Parse error', - message = _('impossible to parse the file') , - action = 'manage_Import_form',) - - num_notes = 0 - num_trans = 0 - - if howmuch == 'clear': - # Clear the message catalogue prior to import - self._messages = {} - self._languages = () - self._default_language = tmx.get_srclang() - - for id, msg in tmx.messages.items(): - if not self._messages.has_key(id) and howmuch == 'existing': - 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 = message % (num_trans, num_notes), - action = 'manage_messages') - - - ####################################################################### # Backwards compatibility (XXX) ####################################################################### @@ -775,116 +672,6 @@ class MessageCatalog(LanguageManager, ObjectManager, SimpleItem): hasmsg = message_exists hasLS = message_exists # CMFLocalizer uses it - security.declareProtected('Manage messages', 'xliff_export') - def xliff_export(self, dst_lang, export_all=1, REQUEST=None, - RESPONSE=None): - """Exports the content of the message catalog to an XLIFF file - """ - from DateTime import DateTime - - src_lang = self._default_language - export_all = int(export_all) - - # 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 - 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'] = src_lang - attributes['target-language'] = dst_lang - attributes['date'] = DateTime().HTML4() - - # 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): - """XLIFF is the XML Localization Interchange File Format designed by a - group of software providers. It is specified by www.oasis-open.org - """ - try: - data = file.read() - xliff = XLFFile(string=data) - except: - return MessageDialog(title = 'Parse error', - message = _('impossible to parse the file') , - action = 'manage_Import_form',) - - num_notes = 0 - num_trans = 0 - (file_ids, sources, targets) = xliff.get_languages() - - if howmuch == 'clear': - # Clear the message catalogue prior to import - self._messages = {} - self._languages = () - self._default_language = sources[0] - - # update languages - if len(sources) > 1 or sources[0] != self._default_language: - return MessageDialog(title = 'Language error', - message = _('incompatible language sources') , - action = 'manage_Import_form',) - for lang in targets: - if lang != self._default_language and lang not in self._languages: - self._languages += (lang,) - - # get messages - 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': - pass - else: - if not self._messages.has_key(msg): - self._messages[msg] = {} - - if cur_target and file.body[msg].target: - self._messages[msg][cur_target] = file.body[msg].target - num_trans += 1 - if file.body[msg].notes: - ns = [n.text for n in file.body[msg].notes] - comment = ' '.join(ns) - self._messages[msg]['note'] = comment - num_notes += 1 - - if REQUEST is not None: - return MessageDialog( - title = _(u'Messages imported'), - message = (_(u'Imported %d messages and %d notes to %s') % \ - (num_trans, num_notes, ' '.join(targets))), - action = 'manage_messages') - - - class POFile(SimpleItem): """ """ diff --git a/product/Localizer/README.txt b/product/Localizer/README.txt index d50ec01d3b..0737439eab 100644 --- a/product/Localizer/README.txt +++ b/product/Localizer/README.txt @@ -1,60 +1,13 @@ +This is a fork of the Localizer product, as found originally at: -Localizer is the de-facto standard to build multilingual applications with -Zope. It helps to internationalize and localize Zope products and to build -multilingual web sites through the Management Interface. It deals with -both user interfaces and content. +https://github.com/hforge/Localizer +All functionality not explicitly used by ERP5 has been or will be removed. -Requirements - - - Python 2.5.2 or later - - - Zope 2.12.2 or later - - - itools 0.50.6 or later (download from - "http://www.hforge.org/itools":http://www.hforge.org/itools) - - -Installation - - Download Localizer. Unpack the tarball and install it in the "Products" - directory:: - - $ 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.3.0 <Zope instance>/Products/Localizer - - -Resources - - - "Home site":http://www.localizer.org/ - - - "Mailing list subscription":http://www.hforge.org/community - - - "Mailing list archives":http://archives.hforge.org/index.cgi?list=localizer - - - "Bug Tracker":http://bugs.hforge.org/ - - -Examples of sites powered by Localizer - - - "European Environment Agency":http://www.eea.eu.int/ - - - "Bank Winter":http://www.bankwinter.com/ - - - "Castagnari":http://www.castagnari.com/ - - - "Hiru":http://www.hiru.com/ - - - "Hotsak":http://www.hotsak.com/ - - - "Ego Ibarra":http://www.egoibarra.com/ - - - "Udaleuskaltegiak":http://www.udaleuskaltegiak.net/ +Moreover, all monkey-patches, and all dependencies on itools should be +moved into native Zope APIs. +The copyright notice of the original code is as follows: Author and License diff --git a/product/Localizer/RELEASE-1.3.0 b/product/Localizer/RELEASE-1.3.0 deleted file mode 100644 index 1d3cf28b42..0000000000 --- a/product/Localizer/RELEASE-1.3.0 +++ /dev/null @@ -1,43 +0,0 @@ -Localizer 1.3.0 (2009/XX/XX) -============================ - -Localizer is a Zope product for developers and web masters. Localizer -solves the problem of building multilingual products and web sites, -ranging from internationalization and localization of the user -interface to management of multilingual content. - -What is new? ------------- - -Upgraded to Zope 2.12, Python 2.5 and itools 0.50 (previous versions are -not supported). - -Some API obsolete since at least 2004 has been removed: - -- The 'ugettext' function has been removed from DTML and ZPT templates, - use instead 'gettext'. - -- Four methods from the 'LocalPropertyManger' class have been removed: - - _setLocalPropValue => set_localpropvalue - _setLocalProperty => set_localproperty - _delLocalProperty => del_localproperty - getLocalProperty => getLocalAttribute - - -Resources ---------- - -Download -http://download.hforge.org/localizer/Localizer-1.3.0.tar.gz -http://download.hforge.org/itools/0.50/itools-0.50.7.tar.gz - -Home -http://www.localizer.org/ - -Mailing list -http://www.hforge.org/community -http://archives.hforge.org/index.cgi?list=localizer - -Bug Tracker -http://bugs.hforge.org/ diff --git a/product/Localizer/TODO.txt b/product/Localizer/TODO.txt deleted file mode 100644 index 57d0f55126..0000000000 --- a/product/Localizer/TODO.txt +++ /dev/null @@ -1,161 +0,0 @@ - -See http://in-girum.net/cgi-bin/bugzilla/index.cgi - -Things should be removed from here and added to the bug tracker. - - - -Bugs ----- - - - Bo M. Maryniuck: - - "I can't reproduce the error anymore though I can't send you traceback, - but I just found, that Localizer crashes Medusa threads if someone else - object uses "register before traverse". In my case there is an product, - which is always modifies the request. So if I put there also Localizer, - you'll never enter the site. - - -Quality Assurance ------------------ - - - Audit the code, update the idioms (e.g. use "get_context" to access the - request and response objects). - - -API ---- - - - When importing modules from Localizer, either the sort or the long - way should always be used. Update the documentation to reflect it - (Rainer Thaden). - - Where the sort form is: - - from Products.Localizer import LocalPropertyManager - - and the long form is: - - from Products.Localizer.LocalPropertyManager import LocalPropertyManager - - See if this can be addressed without compromising backwards compatibility, - if not document exactly which is the current situation. - - - Develop an API to get messages and translations from the message catalog, - see email from Pierre-Yves Delens. - - - Implement the whole mapping interface in the "AcceptLanguage" and - "AcceptCharset" classes (itools.i18n.accept). Sugested by Bjorn. - - -Documentation -------------- - - - Update (rewrite) the documentation. Most likely to be in latex, and - distributed with the source. - - - Add a section "Localizer application anatomy" to the tutorial: - - "One thing you may want to consider is an overview of how a site - using all the products should be laid out. The examples and guide - you are providing are very very good and explain all the techcinal - components of the variouse packages quite well. What seems to be - missing is a higher level view that ties it all together in terms - of layout for a demo site. - - An example of a 2-3 language basic site that uses the variouse - components would be very attractive for new programs and users - (moi) and help the adoption of this most excellent product." - - - Comment about "management_page_charset" to switch the ZMI to utf-8, - or maybe patch Zope so they're in utf-8 by default. - - -Localizer.org -------------- - - - Kill "http://www.j-david.net/software/localizer", everything should be - in "http://www.ikaaro.org/localizer". - - -User Interface (ZMI) --------------------- - - - Complete the help screens. - - - Be sure the framed messages appear in all the management screens every - time an action is performed, i.e. "Content changed (2002-02-08 15:26)". - - - Add PrincipiaSearchSource - - -Standards Support ------------------ - - - Support fuzzy in "itools.handlers.PO". - - - Use the library libgettextpo introduced in gettext 0.12 to parse the - PO files?? See the docs: "Writing your own programs that process PO - files" - - -Message Extraction ------------------- - - - Kill "zgettext", use "igettext" from "itools.i18n" instead. - - - Add support for ZPT to "igettext". This means to implement part of - the "i18n" namespace in "itools.xml.ZPT". See [1] for a sample code. - - -[1] http://savannah.nongnu.org/cgi-bin/viewcvs/opental/opental/OpenPTi18n/i18n_xgettext.py?rev=1.8&content-type=text/vnd.viewcvs-markup - - -Not yet classified ------------------- - - - (Zope bug) See if something feasible can be done to remove the hardcoded - use of Latin-1 encoding from Zope and Localizer. - - If not, explain which the problems are and what the developer can - do (add this as a task for the documentation). - - - - When importing a message catalog, should be done something with - the header? When managing the message catalog through FTP, should - the header also be editable? - - - François Meehan: - - "Also found that using the import/export function in Localizer/zope - can bring corruption to the po file, a problem with the accents it - seems." - - - Document the path where Localizer.changeLanguage sets the cookie, - which is the path from where it is called, not its physical path. - See the mails exchanged with Claus Rosenberger. Maybe a FAQ? - - - - Work on locale information: dates, money, etc.. - - - Integrate the File System Message Catalog from CMFLocalizer. - - - Add the ability to manage localized versions of standard files - in a product: the on-line help system, README.txt, etc.. - - - Let to implement ZClasses that inherite from 'MessageCatalog' - - - Set the 'Vary' header. - - The problem is: which value should it have? - - This could allow to remove the patch to Zope for images, if UA - take care of the 'Vary' header. - - - Rework 'changeLanguageForm' to support browsers without javascript. - - - Build user management interfaces similar to the ZMI - (standard_html_header/footer instead of manage_page_header/footer - and manage_tabs). - diff --git a/product/Localizer/UPGRADE.txt b/product/Localizer/UPGRADE.txt deleted file mode 100644 index ee35d7841f..0000000000 --- a/product/Localizer/UPGRADE.txt +++ /dev/null @@ -1,218 +0,0 @@ - -*************************************************************************** -Localizer 0.8.1 -*************************************************************************** - - * The request variable USER_PREF_LANGUAGES isn't a list anymore, - now it's an object that represents a tree. Any code that directly - reads or modifies USER_PREF_LANGUAGES will be broken. Tell me - if you did it. - - * The Localizer class provides a feature known as "locale folders" - that lets to manage any kind of multilingual content. Now this - feature is deprecated. A new class named "LocalFolder" provides - a better solution for this, please move to it as soon as posible, - in the next release the deprecated feature will be removed!! - - The quickest way to move from "Localizer" to "LocalFolder" is: - - 0. Do a backup of the database; - - 1. Create in the root of your web site a "LocalFolder" instance called, - for example, "locale"; - - 2. Go to the management screens of "locale" and create an attribute - named, for example, "folder"; - - 3. Add as many languages as needed in the tab "Languages"; - - 4. Create a folder for every language in the "Contents" tab, for - example, "folder_en", "folder_es", etc..; - - 5. For each language copy all the stuff from the Localizer instance - to "locale". For example, copy everything in "Localizer/es" to - "locale/folder_es"; - - 6. Now the most time expensive step, go to all the templates and scripts - that refer to any object in the "Localizer" instance and change to - use "locale" instead. - - For example, if you had an image named "logo" and you called it with: - - <dtml-var logo> - - change it to: - - <dtml-with locale><dtml-var logo></dtml-with> - - or to: - - <dtml-var "locale.logo()"> - - Hopefully you will have to modify few methods; - - 7. And finally, remove the "Localizer" instance!! - - * The previous way to internationalize Python code from Python - products has been deprecated. Read the documentation to know - how it should be done from now on. However, the deprecated - way will be preserved for a while, probably a long while. - - -*************************************************************************** -Localizer 0.8.0 -*************************************************************************** - - * The 0.7 version saw a big redesign of message catalogs, and - also of the way they're used. Before they were implicitly called, - through a globaly available "gettext" method, this feature - was implemented in the "Localizer" class. - - In the 0.7 version message catalogs became an independent class, - its instances are explicitly called. The old way to use message - catalogs was preserved for backwards compatibility. - - Now, in version 0.8, the old way to use message catalogs (through - the global "gettext" method) has been removed. To upgrade to this - version follow the steps: - - 0. If you upgrade from a version previous to 0.7 upgrade first - to 0.7.x - - 1. Move all your 'MessageCatalog' instances with the id - 'Messages' that are inside of a 'Localizer' instance - to the same level in the hierarchy where is the - 'Localizer' object, but with the name 'gettext'. - - For example if you have "/a/b/c/Localizer/Messages" you - should move the 'Messages' object to "/a/b/c/gettext". - - [!] This will work in most situations, you only could get - wrong behaviour if you're using Localizer instances - inside other Localizer instances. For example if you - have the objects "/a/b/c/Localizer/Messages" and - "/a/b/c/d/Localizer/Messages". - - I guess very few people, if any, will have a configuration - like this one, so I don't provide any upgrade path. If - you've something like this send me an email before doing - anything. - - 2. Don't do anything for a few days, just to be sure that - everything works. - - 3. Upgrade to the 0.8 version. - - Don't hesitate to contact me if you have any problem or doubt. - - - -*************************************************************************** -Localizer 0.7.0 -*************************************************************************** - - * There're several changes that require all Localizer instances - to be upgraded, to do so go to the management interfaces of - each Localizer instance and click the "upgrade" button that - will appear. - - Be careful, the upgrading must be done with access rules - deactivated, for example: "www.foo.com/bar/Z/manage" - - * LocalContent instances and other instances of classes that - inherit from LocalPropertyManager also need to be upgraded. - To do it just run the same script used to upgrade to the - 0.6 version, it is: - - obs = context.ZopeFind(context, None, None, None, - 'isLocalPropertyManager == 1', - None, None, None, None, 1) - - for path, ob in obs: - ob.manage_upgrade() - - return '%d objects upgraded' % len(obs) - - * There're several changes in the API that could break your - code if you have used directly the Localizer API, if in - doubt send me an email. - - -*************************************************************************** -Localizer 0.6.1 -*************************************************************************** - - Before 0.6.0 changeLanguageForm was a LocalDTMLFile, in 0.6.0 - I changed it to a DTML Method. Now it's again a LocalDTMLFile. - - To upgrade go to each Localizer instance and remove the - changeLanguageForm method. If you don't do it nothing will - break, but anyway it's encouraged. - - If you're curious about this change, it's because I've finally - discovered which is the difference between DTMLFile and HTMLFile: - bindings can be used from a DTMLFile. - - -*************************************************************************** -Localizer 0.6 -*************************************************************************** - - * LocalContent and LocalPropertyManager - - All LocalContent objects and instances of classes that inherit - from LocalPropertyManager need to be upgraded. - - Create and run a Python script in the root with the code: - - obs = context.ZopeFind(context, None, None, None, - 'isLocalPropertyManager == 1', - None, None, None, None, 1) - - for path, ob in obs: - ob.manage_upgrade() - - return '%d objects upgraded' % len(obs) - - * All Localizer instances also need to be upgraded, but it's done - automatically. To verify it: - - - test that the 'hook_traversal' property has been removed. - - - test that the Localizer has a DTML Method called changeLanguageForm. - - Some future release, probably 0.7, will be incompatible with - versions < 0.6. So it won't be possible, for example, to upgrade - from 0.5.1 to 0.7 directly; it must be from 0.5.1 to 0.6.x to 0.7. - - In short: upgrade to 0.6 as soon as posible!! - - * Other minor changes: - - - Now get_available_languages returns a list of tuples of two - elements: [(id, title), ..] - - For example, [('en', 'English'), ('es', 'Spanish'), ...] - - - Now the title of local folders is not used in changeLanguageForm. - - Perhaps there're other minor changes that could break something. - - -*************************************************************************** -Localizer 0.3 -*************************************************************************** - -In Localizer versions < 0.3 the way to localize DTML files was: - - from Products.Localizer.LocalizedDTMLFile import LocalizedDTMLFile - xxx = LocalizedDTMLFile('xxx', globals()) - -Since version 0.3 the right way to do it is: - - from Products.Localizer import LocalDTMLFile - xxx = LocalDTMLFile('xxx', globals()) - -In 0.3 version the old way was still supported, but deprecated. Since -version 0.4 the old way is no longer available, so products using it -will break. diff --git a/product/Localizer/__init__.py b/product/Localizer/__init__.py index 3547801875..d13417c443 100644 --- a/product/Localizer/__init__.py +++ b/product/Localizer/__init__.py @@ -1,4 +1,4 @@ -# -*- coding: UTF-8 -*- +# -*- coding: utf-8 -*- # Copyright (C) 2000-2005 Juan David Ibáñez Palomar <jdavid@itaapy.com> # # This program is free software: you can redistribute it and/or modify @@ -14,17 +14,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -# Check whether itools is installed -msg = ('itools 0.50 or later is needed, download from ' - 'http://download.hforge.org/itools/0.50') -try: - import itools -except ImportError: - raise ImportError, msg -# Check itools is version 0.50 or later -if itools.__version__ < '0.50': - raise ImportError, msg - # Import from the Standard Library import os.path @@ -34,10 +23,8 @@ from DocumentTemplate.DT_String import String # Import from Localizer from patches import get_request -import Localizer, LocalContent, MessageCatalog, LocalFolder -from LocalAttributes import LocalAttribute -from LocalFiles import LocalDTMLFile, LocalPageTemplateFile -from LocalPropertyManager import LocalPropertyManager, LocalProperty +import Localizer, MessageCatalog +from LocalFiles import LocalDTMLFile from GettextTag import GettextTag @@ -72,13 +59,6 @@ def initialize(context): Localizer.manage_addLocalizer), icon = 'img/localizer.gif') - # Register LocalContent - context.registerClass( - LocalContent.LocalContent, - constructors = (LocalContent.manage_addLocalContentForm, - LocalContent.manage_addLocalContent), - icon='img/local_content.gif') - # Register MessageCatalog context.registerClass( MessageCatalog.MessageCatalog, @@ -86,13 +66,6 @@ def initialize(context): MessageCatalog.manage_addMessageCatalog), icon='img/message_catalog.gif') - # Register LocalFolder - context.registerClass( - LocalFolder.LocalFolder, - constructors = (LocalFolder.manage_addLocalFolderForm, - LocalFolder.manage_addLocalFolder), - icon='img/local_folder.gif') - context.registerHelp() # Register the dtml-gettext tag diff --git a/product/Localizer/archive/CHANGES.txt b/product/Localizer/archive/CHANGES.txt deleted file mode 100644 index 7d67c91336..0000000000 --- a/product/Localizer/archive/CHANGES.txt +++ /dev/null @@ -1,295 +0,0 @@ - -*************************************************************************** -See the "RELEASE.txt" file -*************************************************************************** - -1.1.2 (2005/10/21) - - Upgrade to itools 0.9 - - -1.1.1 (2005/05/26) - - User Interface - - Improved message catalog user interface, suggested by Christopher - Lozinski. - - Fixes - - Fix "LPM.get_available_languages" when property is empty. - - Backwards compatility improvements by Yoshinori Okuji. - - Fix Localizer with Zope 2.8, problem found by Lennart Regebro. - - Fixed english of the release notes, by Chris H. - - -1.1.0 (2005/04/10) - - Nothing new, just some information files have been updated. - - -1.1.0rc1 (2005/03/21) - - User Interface - - The text area to edit local properties is bigger now. - - Packaging - - Check itools and iHotfix are installed. - - -1.1.0b5 (2005/01/28) - - ZPT - - More robust support for the "i18n" namespace, check the domain object is - a message catalog. - - User Interface - - New LocalPropertyManager/LocalContent interface, by Cornel Nitu. - - Translations - - Updated the portuguese translation, by Rodrigo Senra. - - Plone - - Remove conflict with PlacelessTranslationService, Plone and Localizer - work again together. - - -1.1.0b4 (2005/01/09) - - ZPT - - Add support for i18n:domain - - -1.1.0b3 (2004/12/17) - - Translations - - Added the italian version, by Marco Bizzarri - - -*************************************************************************** -See "RELEASE.txt" for the changes between 0.8.1 and 1.1.0b3 -*************************************************************************** - -0.8.1 (2002/02/25) - - Now the language selection algorithm is compliant with the - RFC 2068 (HTTP 1.1). - - New meta type LocalFolder. Now the "locale folders" feature of - the Localizer meta type are is deprecated, the new meta type - LocalFolder should be used instead. - - Change internationalization of Python code from Python products. - - Little cleanups: LocalObjects moved to LocalFiles;.. - - -0.8.0 (2002/01/31) - - Fixed bug in the ZMI reported by Magnus Heino. - - Fixed use of file system message catalogs from ZPT. - - Some improvements in the LanguageManager API. - - Updated the few tests available to use PyUnit. - - Fixed export of message catalogs, now the empty message is included. - - Now LocalContent is CatalogAware, still remains to update the catalog - each time it's edited. - - Now LocalPropertyManager implements __getattr__ to define attributes - of the form <name>_<lang>. - - Moved the changeLanguageForm and changeLanguage helper methods to - the LanguageManager class. - - Added the ugettext method in LocalObjects, beginning to work with - unicode. - - Disabled the global gettext method that was added with a dynamnic patch - to to the Application class. - - Improvements in the LocalPropertyManager web interface. - - Now it's possible to change the default template for a LocalContent object. - - -0.7.1 (2001/10/26) - - Improved zgettext.py script - - First unit tests. - - More online help screens. - - Several security fixes. - - Several bugs fixed. - - Some minor improvements in the user interfaces. - - Completed internationalization. - - Updated several translations: french, hungarian and spanish. - - -0.7.0 (2001/10/10) - - Several fixes in zgettext.py - - New meta type MessageCatalog, it's possible to create message catalogs - with any id. Now the Localizer class no longer stores messages, but it - can contain MessageCatalog instances; specifically, if it contains a - MC named "Messages" gettext will behave in a similar way than before. - - New mixin class LanguageManager that allows to manage list of available - languages and a default language. Used in LocalPropertyManager, - MessageCatalog and Localizer classes. - - Added a dtml-gettext tag, useful for long messages. - - Added the hungarian translation, thanks to Gabor Suveg. - - Updated documentation. - - More online help screens, improved some web interfaces. - -0.6.2 (2001/10/01) - - Completed the list of languages, ISO 639 compliance. - - Now the language negotation algortithm is implemented in - a helper function (before this code was replicated in several - places). - - Improvements in the message catalog user interface. Added a - help screen. - - Minor changes in standard files (VERSION.txt and LICENSE.txt) - to comply ZDG guidelines. - -0.6.1 (2001/09/28) - - Added "original language" to LocalPropertyManager. - - Minor improvements in the LocalPropertyManager user interface. - - Now Localizer can be refreshed, except if Zope version >= 2.4.1b1. - - Added the basque translation. - - changeLanguageForm is a LocalDTMLFile again. Read UPGRADE.txt if - you're upgrading from 0.6.0 - - Some internal changes in the way message translations are searched. - Sometimes the translations were looked for in the wrong place, this - bug is fixed. - - Now the localizer tutorial works with Zope < 2.4 - -0.6.0 (2001/09/25) - - LocalPropertyManager - - LocalProperty must be used always. - - Improved user interface: posibility to add/delete languages; - show only few properties at a time. - - Added a isLocalPropertyManager class attribute. - - LocalPropertyManager can be used as base class for ZClasses. - - LocalContent - - Inherit also from PropertyManeger. - - Localizer - - Export and import message catalogs to and from .pot/.po files. - - Changed the way to hook/unhook the traversal machinery. - - Now changeLanguageForm is a DTML Method. - - Now get_available_languages returns a list of tuples: [(id, title),..] - - New method get_languages_map, used from changeLanguageForm. - - Securtiy - - Use "Declarative Assertions". - - Several bugs fixed, mainly related with local folders. Also fixes - in zgettext.py, and probably others I don't remember now. - - -0.5.1 (2001/07/19) - - Several fixes for LocalPropertyManager and LocalContent. - - Added a tutorial (localizer_tutorial.zexp). - - Now __version__ module attributes show the CVS revision number. - -0.5.0 (2001/07/17) - - Reorganization of the directory structure. - - Added the LocalPropertyManager and LocalContent classes. - - Patch OFS.Image to prevent browsers to cache images in localized folders. - -0.4.0 (2001/07/10) - - The gettext and locale modules have been removed, Python 2.x required. - - License changed to GPL. - - Management interface tabs internationalized, spanish and catalan - translations updated. - - Fixed a bug in changeLanguage when the Localizer was used with other - SiteAccess, virtual hosting for example. - - The script zgettext now keeps the locale.pot changes and uses msgmerge - to build the .po files. - - Added new files BUGS.txt, TODO.txt and UPGRADE.txt - - Old LocalizedDTMLFile removed. - -0.3.0 (2001/06/..) - - Fixed a bug that prevented proper copy&paste of Localized objects. - - Changed the usage of localized dtml files, old usage preserved for - backwards compatibility. - - Added support for page template files. Added documentation about - how to localize zpt. - - -0.2.1 (2001/05/23) - - Ops, 0.2.0 bug fixed, I should test the code before releasing it, - apologies. - - -0.2.0 (2001/05/22) - - Localized strings are looked for in all the Localizer instances in the path. - - Now it's possible to override the user prefered language with the path. - - Added the german version. - - Some bugs fixed. - -0.1.1 (2001/??/??) - - Bug fixing release. - -0.1.0 (2001/??/??) - - Initial version. diff --git a/product/Localizer/archive/RELEASE-0.9.0 b/product/Localizer/archive/RELEASE-0.9.0 deleted file mode 100644 index 846b377e29..0000000000 --- a/product/Localizer/archive/RELEASE-0.9.0 +++ /dev/null @@ -1,82 +0,0 @@ -Localizer 0.9.0 -=============== - -General arquitecture - - In the version 0.9 there're four meta types (Localizer, MessageCatalog, - LocalContent and LocalFolder), each one specialized in one task, finishing - this way with the confusion present in previous versions, where the - different features weren't clearly separated. - - Previous versions mixed two features in the Localizer meta type, language - negotiation and generic support of multilingual objects. - - Now the Localizer meta type is specialized in language negotiation. And a - new meta type, named LocalFolder, provides the generic support for language - negotiation following a different approach. - - The old "locale folders" feature that was present in the Localizer meta - type has been definitely removed. - - -Language negotiation - - This is one of the areas that has seen mayor improvements since version - 0.8, now there's a simple default criteria to choose the language, based - only in the browser configuration. But the developer has much more power - to customize the language negotiation policy through the Localizer meta - type. - - Also, the algorithm that chooses the language is finally standards compliant. - - -Unicode - - The Unicode support is another of the big new features in this version. - To implement it now Localizer depends on the Unicode patches from Toby - Dickenson (http://www.zope.org/Members/htrd/wstring), which are part of - Zope since the version 2.6. - - Now the policy is to use Python Unicode strings for everything: - - - translations in the message catalog are stored as unicode strings; - - - multilingual properties of LocalContent objects are stored as unicode - strings; - - - the gettext method, when used from the file system, always returns - unicode strings (as the "ugettext" method of the "gettext" python - module). - - The problem could raise when unicode and normal strings are mixed. By - default Python converts the normal strings to unicode as if they were - in ASCII. However, in Zope the default is considered to be iso-8859-1, - which is hardcoded in several places. Just be careful if you mix normal - and unicode strings, specially if they're in an encoding different than - iso-8859-1. - - But maybe the main problem is the lack of proper unicode support in ZPT, - this will cause problems to anybody that wants to use ZPT and Unicode. - - So it's likely that both Zope and Localizer will need a bit of work before - the Unicode support becomes stable. - - -Message Catalog - - The message catalog interface has been completely redone. Now it correctly - supports multiline messages, including correct import and export from and - to PO files (thanks to Jean-Paul Smets). - - -There're other minor changes, like some improvements in the management -screens. The relevant links are: - - - Home page - http://www.j-david.net/localizer - - - Download - http://sourceforge.net/projects/lleu - - - Mailing list - http://mail.freesoftware.fsf.org/mailman/listinfo/nuxeo-localizer diff --git a/product/Localizer/archive/RELEASE-0.9.1 b/product/Localizer/archive/RELEASE-0.9.1 deleted file mode 100644 index c14e436df6..0000000000 --- a/product/Localizer/archive/RELEASE-0.9.1 +++ /dev/null @@ -1,49 +0,0 @@ -Localizer 0.9.1 -=============== - -Localizer is a Zope [1] product that provides a set of facilities -to develop multilingual web applications. It offers solutions to -internationalize the user interfaces and to manage multilingual -content. - - -Localizer becomes beta ----------------------- - -Finally I've decided to officially declare Localizer as beta. This -means that no new features will be added for the 1.0 release, the -focus will be stability and documentation. - - -What's new ----------- - -Added unicode support to ZPT. Final version by Florent Guillaume. - -New icons for all the meta types. Now Localizer has a logo (see logo.gif). -This is a contribution of Maite Rementeria, from Code&Syntax [2]. - -Spanish translation updated. New japanese version!, by Kazuya Fukamachi. - -Some minor bugs fixed. - - -Resources ---------- - -Home page -http://www.j-david.net/software/localizer - -Download -http://sourceforge.net/projects/lleu - -Mailing list -http://mail.freesoftware.fsf.org/mailman/listinfo/nuxeo-localizer - - -Footnotes ---------- - -[1] http://www.zope.org - -[2] http://www.codesyntax.com diff --git a/product/Localizer/archive/RELEASE-0.9.2 b/product/Localizer/archive/RELEASE-0.9.2 deleted file mode 100644 index 9c8d9a6540..0000000000 --- a/product/Localizer/archive/RELEASE-0.9.2 +++ /dev/null @@ -1,42 +0,0 @@ -Localizer 0.9.2 -=============== - -Localizer is a Zope product that provides a set of facilities -to develop multilingual web applications. It offers solutions to -internationalize the user interfaces and to manage multilingual -content. - -This is a bug fix release, the changes are: - - - The "zgettext.py" script correctly parses Python files, to do - it the xgettext program from the GNU Gettext utilities is used. - - - Now "zgettext.py" don't preserves the old messages in the - locale.pot file. - - - Updated the Unicode patch, by Florent Guillaume. - - - In some rare conditions the request object dissapears from the - global dictionary, this produces a key error when it's tried to be - removed. Fixed catching the exception (I couldn't reproduce the - error). - -And a new "feature": - - - Added the new module "LocalizerSupport.py", it helps to develop - Localizer based products that become monolingual when Localizer - is not installed (instead of becoming broken). It provides dummy - versions for some of the features of Localizer, not all. - - -Resources ---------- - -Home page -http://www.j-david.net/software/localizer - -Download -http://sourceforge.net/projects/lleu - -Mailing list -http://mail.freesoftware.fsf.org/mailman/listinfo/nuxeo-localizer diff --git a/product/Localizer/archive/RELEASE-0.9.3 b/product/Localizer/archive/RELEASE-0.9.3 deleted file mode 100644 index cf085f347a..0000000000 --- a/product/Localizer/archive/RELEASE-0.9.3 +++ /dev/null @@ -1,37 +0,0 @@ -Localizer 0.9.3 -=============== - -Localizer is a Zope product that provides a set of facilities -to develop multilingual web applications. It offers solutions to -internationalize the user interfaces and to manage multilingual -content. - -This is a bug fix release, the changes are: - - - Open MO files as binary files, this caused problems on Windows. - Thanks to Johan Carlsson - - - Correctly copy and paste Localizer instances. - - - Correctly detect Netscape 4.x, before Internet Explorer was thought - to be NS, this caused problems with the language negotiation. Thanks - to Olivier Nibart. - - - Add the languages from a Localizer instance (if it exists) to the - languages input box of the LocalFolder add screen (as it already - was done with LocalContent). - - - Quote messages in the Message Catalog interface, thanks to Geir Bækholt. - - -Resources ---------- - -Home page -http://www.localizer.org - -Download -http://sourceforge.net/projects/lleu - -Mailing list -http://mail.freesoftware.fsf.org/mailman/listinfo/nuxeo-localizer diff --git a/product/Localizer/archive/RELEASE-1.0.0 b/product/Localizer/archive/RELEASE-1.0.0 deleted file mode 100644 index ad597fbcca..0000000000 --- a/product/Localizer/archive/RELEASE-1.0.0 +++ /dev/null @@ -1,26 +0,0 @@ -Localizer 1.0.0 -=============== - -Localizer is a Zope product that provides a set of facilities -to develop multilingual web applications. It offers solutions to -internationalize the user interfaces and to manage multilingual -content. - -This is a bug fix release, the changes are: - - - The dynamic global request patch is not installed if the static - version (by Tim McLaughlin) is already applied. - - - -Resources ---------- - -Home page -http://www.localizer.org - -Download -http://sourceforge.net/projects/lleu - -Mailing list -http://mail.freesoftware.fsf.org/mailman/listinfo/nuxeo-localizer diff --git a/product/Localizer/archive/RELEASE-1.0.1 b/product/Localizer/archive/RELEASE-1.0.1 deleted file mode 100644 index c71467fc3d..0000000000 --- a/product/Localizer/archive/RELEASE-1.0.1 +++ /dev/null @@ -1,41 +0,0 @@ -Localizer 1.0.1 -=============== - -Localizer is a Zope product that provides a set of facilities -to develop multilingual web applications. It offers solutions to -internationalize the user interfaces and to manage multilingual -content. - -The changes of this release are: - - - Added missing docstring to the Localizer class, thanks to - Christian Scholz. - - - Strip the quality when parsing an accept header, this lets the - browser w3m and mobile phones to work, thanks to Helge Tesdal. - - - Don't trigger Localizer instances when traversing if the request - variable AcceptLanguage does not exist. Thanks to Florent Guillaume. - - - Now LocalPropertyManager.get_default_language returns None if - there isn't _default_language and get_languages returns an - empty list. Thanks to Greg Ward. - - - Renamed the VERSION.txt file to version.txt, this lets to see the - version string from the control panel in the Zope management screens. - Thanks to Gilles Lenfant. - - - Fixed bug in MessageCatalog.manage_export, thanks to Joachim Werner. - - -Resources ---------- - -Home page -http://www.localizer.org - -Download -http://sourceforge.net/projects/lleu - -Mailing list -http://mail.freesoftware.fsf.org/mailman/listinfo/nuxeo-localizer diff --git a/product/Localizer/archive/RELEASE-1.1.0 b/product/Localizer/archive/RELEASE-1.1.0 deleted file mode 100644 index 52bf977e63..0000000000 --- a/product/Localizer/archive/RELEASE-1.1.0 +++ /dev/null @@ -1,102 +0,0 @@ -Localizer 1.1 -============= - -April 11, 2005 - Two years after release of Localizer 1.0, I am -pleased to announce the availability of the next major version, -Localizer 1.1. - -Localizer is a Zope [1] product for developers and web masters. -Localizer solves the problem of building multilingual products -and web sites, ranging from internationalization and localization -of the user interface to management of multilingual content. - -jdavid at itaapy.com [2] - - -What's new in 1.1 ------------------ - -This release brings several new features. Specifically Localizer -now supports industry standards such as TMX [3] and XLIFF [4], -which enhance the interoperability of Localizer based applications -within mainstream environments. - -Native support for 'i18n' namespaces for ZPT (Zope Page Templates) -is included avoiding the need to install other products. - -The user interfaces have been vastly improved, specially for -'LocalContent' objects. - -Four new translations are available: Danish, Italian, Portuguese -and Russian. - -Localizer 1.1 has been re-packaged and now depends on itools Python -package and iHotfix Zope product. While these changes make installation -a bit more complex, the added benefit is simplified source management. -Furthermore this subtle change makes Localizer Services available to -the wider audience of Python [5] developers. - -Last but not least, Localizer's stability has been dramatically -improved by resolution of many bugs resulting in a mature and even -more reliable product. - - -Credits -------- - -This is the first release where the majority of work has been -contributed by community users and the original author. Credit -where credit is due. - -To Eduardo Corrales and Roberto Quero from the Deusto University [6], -for the original implementation of the TMX standard. - -To Søren Roug and Cornel Nitu from the European Environment Agency [7], -for their work on the TMX code, the implementation of the XLIFF standard, -the overhaul of the LocalContent interfaces, and the Danish translation. - -To Alexey Lubimov for the Russian translation. - -To Mario Olimpio de Menezes for the original Portuguese translation. - -To Rodrigo Senra for updating the Portuguese translation, and for improving -the Localizer API. - -To Marco Bizzarri for the Italian translation, and for improving the -stability. - - -Download and Install --------------------- - - 1. Download the Localizer meta-package from http://www.localizer.org - - 2. Unpack the tarball - - 3. Follow the instructions within the README file - - -Resources ---------- - -Home -http://www.localizer.org - -Mailing list -http://in-girum.net/mailman/listinfo/localizer - -Bug Tracker -http://in-girum.net/cgi-bin/bugzilla/index.cgi - - -References ----------- - -[1] http://www.zope.org -[2] http://www.itaapy.com -[3] http://www.lisa.org/tmx/ -[4] http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=xliff -[5] http://www.python.org -[6] http://www.deusto.es/ -[7] http://www.eea.eu.int/ - diff --git a/product/Localizer/archive/RELEASE-1.1.3 b/product/Localizer/archive/RELEASE-1.1.3 deleted file mode 100644 index 947235034c..0000000000 --- a/product/Localizer/archive/RELEASE-1.1.3 +++ /dev/null @@ -1,40 +0,0 @@ -Localizer 1.1.3 (2006/12/13) -============================ - -Localizer is a Zope product for developers and web masters. Localizer -solves the problem of building multilingual products and web sites, -ranging from internationalization and localization of the user interface -to management of multilingual content. - -The 1.1.3 release brings some new features for ZPT. Most important is -the support of interpolation. And now message catalogs are searched for -within the "Localizer" objects, if it exists. - -There are also a couple of bugs fixed: - - - The method "LocalPropertyManager.__getattr__" works again. - - - The function "Utils.lang_negotiator" works now when the context - is not available. - -Credits: - - - Mikel Larreategi fixed "LocalPropertyManager.__getattr__". - - Josef Meile worked on ZPT. - - Yoshinori Okuji fixed "Utils.lang_negotiator". - - -Resources ---------- - -Download -http://download.ikaaro.org/localizer/Localizer-1.1.3.tar.gz - -Home -http://www.localizer.org - -Mailing list -http://mail.ikaaro.org/mailman/listinfo/localizer - -Bug Tracker -http://bugs.ikaaro.org/ diff --git a/product/Localizer/doc/RELEASE-1.2.0 b/product/Localizer/doc/RELEASE-1.2.0 deleted file mode 100644 index 4d5ff60d34..0000000000 --- a/product/Localizer/doc/RELEASE-1.2.0 +++ /dev/null @@ -1,37 +0,0 @@ -Localizer 1.2.0 (2006/12/22) -============================ - -Localizer is a Zope product for developers and web masters. Localizer -solves the problem of building multilingual products and web sites, -ranging from internationalization and localization of the user interface -to management of multilingual content. - -The release 1.2.0 is a version update: it requires Python 2.4 and -itools 0.13.10, and the product iHotfix is not required anymore (it -has been merged back into Localizer). - -This grid show the possible software combinations: - - Localizer Python Zope itools - 1.2 2.4 2.9, 2.10 0.13 - 1.1 (+iHotfix) 2.3 2.7, 2.8 0.9 - 1.0 2.1 2.6 --- - -Of course it is recommended to use Localizer 1.2 with Zope 2.9 or later. - - -Resources ---------- - -Download -http://download.ikaaro.org/localizer/Localizer-1.2.0.tar.gz -http://download.ikaaro.org/itools/itools-0.13.10.tar.gz - -Home -http://www.localizer.org - -Mailing list -http://mail.ikaaro.org/mailman/listinfo/localizer - -Bug Tracker -http://bugs.ikaaro.org/ diff --git a/product/Localizer/doc/RELEASE-1.2.1 b/product/Localizer/doc/RELEASE-1.2.1 deleted file mode 100644 index 0788988c8f..0000000000 --- a/product/Localizer/doc/RELEASE-1.2.1 +++ /dev/null @@ -1,28 +0,0 @@ -Localizer 1.2.1 (2007/02/12) -============================ - -Localizer is a Zope product for developers and web masters. Localizer -solves the problem of building multilingual products and web sites, -ranging from internationalization and localization of the user interface -to management of multilingual content. - -Fixed a serious regression, with 1.2.0 the Localizer object (used to -customize the language negotiation policy) stopped working. Thanks to -Igor Leturia for pointing out the problem. - - -Resources ---------- - -Download -http://download.ikaaro.org/localizer/Localizer-1.2.1.tar.gz -http://download.ikaaro.org/itools/itools-0.13.10.tar.gz - -Home -http://www.localizer.org - -Mailing list -http://mail.ikaaro.org/mailman/listinfo/localizer - -Bug Tracker -http://bugs.ikaaro.org/ diff --git a/product/Localizer/doc/RELEASE-1.2.2 b/product/Localizer/doc/RELEASE-1.2.2 deleted file mode 100644 index d5d18b4694..0000000000 --- a/product/Localizer/doc/RELEASE-1.2.2 +++ /dev/null @@ -1,32 +0,0 @@ -Localizer 1.2.2 (2008/01/18) -============================ - -Localizer is a Zope product for developers and web masters. Localizer -solves the problem of building multilingual products and web sites, -ranging from internationalization and localization of the user interface -to management of multilingual content. - -What is new? - -- Upgraded itools version to 0.20 - -- Compatibility fixes for Zope 2.10 - -- Upgraded the license to GPL version 3 - - -Resources ---------- - -Download -http://download.ikaaro.org/localizer/Localizer-1.2.2.tar.gz -http://download.ikaaro.org/itools/itools-0.20.2.tar.gz - -Home -http://www.localizer.org - -Mailing list -http://mail.ikaaro.org/mailman/listinfo/localizer - -Bug Tracker -http://bugs.ikaaro.org/ diff --git a/product/Localizer/doc/RELEASE-1.2.3 b/product/Localizer/doc/RELEASE-1.2.3 deleted file mode 100644 index b5709b55f0..0000000000 --- a/product/Localizer/doc/RELEASE-1.2.3 +++ /dev/null @@ -1,31 +0,0 @@ -Localizer 1.2.3 (2008/12/03) -============================ - -Localizer is a Zope product for developers and web masters. Localizer -solves the problem of building multilingual products and web sites, -ranging from internationalization and localization of the user -interface to management of multilingual content. - -What is new? - -- Compatibility fixes for Zope 2.10/2.11 (bug #381) - -- Other minor fixes (including bug #304) - - -Resources ---------- - -Download -http://download.hforge.org/localizer/Localizer-1.2.3.tar.gz -http://download.hforge.org/itools/itools-0.20.6.tar.gz - -Home -http://www.localizer.org/ - -Mailing list -http://www.hforge.org/community -http://archives.hforge.org/index.cgi?list=localizer - -Bug Tracker -http://bugs.hforge.org/ diff --git a/product/Localizer/ui/LC_export_form.dtml b/product/Localizer/ui/LC_export_form.dtml deleted file mode 100644 index 57b58dc65c..0000000000 --- a/product/Localizer/ui/LC_export_form.dtml +++ /dev/null @@ -1,66 +0,0 @@ -<dtml-var manage_page_header> -<dtml-var manage_tabs> - - -<fieldset><legend><dtml-var "gettext('Export messages to TMX file')"></legend> -<p class="form-help"> - <dtml-gettext> - You can export the messages and their translations to TMX level 1 files. - To do that just click the <tt>Export</tt> button. - </dtml-gettext> -</p> - -<form action="tmx_export" method="post"> - <table> - <tr> - <td><br></td> - <tr> - <td><input type="submit" value=" <dtml-var "gettext('Export')"> "></td> - <td></td> - </tr> - </table> -</form> -</fieldset> - - -<fieldset><legend><dtml-var "gettext('Export messages to XLIFF file')"></legend> -<p class="form-help"> - <dtml-gettext> - You can export the messages and their translations to XLIFF files. - Check any option to get a XLIFF file with the messages and their - translations to the selected language. Then click the <tt>Export</tt> - button. - </dtml-gettext> -</p> - -<form action="xliff_export" method="post"> - <table border=0 cellpadding="2" cellspacing="2"> - <tr> - <td><input type="radio" name="export_all" value="1" checked>Export all messages<br> - <input type="radio" name="export_all" value="0">Export only untranslated messages - for the language you select - </td> - </tr> - <tr> - <th align="left"> - <dtml-var "gettext('Target language')"> - </th> - </tr> - <tr> - <td valign="top"> - <select name="targetlang"> - <dtml-in get_languages_mapping mapping> - <option value="<dtml-var code>"><dtml-var code> / <dtml-var "gettext(name)"></option> - </dtml-in> - </select> - </td> - </tr> - <tr> - <td><input type="submit" value=" <dtml-var "gettext('Export')"> "></td> - <td></td> - </tr> - </table> -</form> -</fieldset> - -<dtml-var manage_page_footer> diff --git a/product/Localizer/ui/LC_import_form.dtml b/product/Localizer/ui/LC_import_form.dtml deleted file mode 100644 index ec6e553c6a..0000000000 --- a/product/Localizer/ui/LC_import_form.dtml +++ /dev/null @@ -1,46 +0,0 @@ -<dtml-var manage_page_header> -<dtml-var manage_tabs> - - -<fieldset><legend><dtml-var "gettext('Import translations from TMX file')"></legend> -<p class="form-help"> - <dtml-gettext> - The message catalog also supports importing TMX files. You can add new - messages and translations importing a TMX file in TMX level 1. Enter the - filename and click the - <tt>Import</tt> button. - </dtml-gettext> -</p> - -<form action="tmx_import" method="post" enctype="multipart/form-data"> - <table> - <tr> - <th align="right"><dtml-var "gettext('File')"></th> - <td><input type="file" name="file"></td> - </tr> - - <tr> - <th></th> - <td><input type="submit" value=" <dtml-var "gettext('Import')"> "></td> - </tr> - </table> -</form> -</fieldset> - - -<fieldset><legend><dtml-var "gettext('Import translations from XLIFF file')"></legend> -<form action="xliff_import" method="post" enctype="multipart/form-data"> -<table> - <tr> - <th align="right"><dtml-var "gettext('File')"></th> - <td><input type="file" name="file"></td> - </tr> - <tr> - <th></th> - <td><input type="submit" value=" <dtml-var "gettext('Import')"> "></td> - </tr> -</table> -</form> -</fieldset> - -<dtml-var manage_page_footer> diff --git a/product/Localizer/ui/LPM_properties.dtml b/product/Localizer/ui/LPM_properties.dtml deleted file mode 100644 index 733ca02f01..0000000000 --- a/product/Localizer/ui/LPM_properties.dtml +++ /dev/null @@ -1,113 +0,0 @@ -<dtml-var manage_page_header> -<dtml-var manage_tabs> - -<p class="form-help"> -This page allows you to define, edit and delete properties of LocalContent. -To change property values, edit the values and click "Save Changes". -If you want to remove a property select it and click "Delete". -</p> - -<dtml-let properties="getLocalProperties()"> - -<dtml-if properties> - <dtml-let curr_prop="REQUEST.get('prop', properties[0]['id'])" - default_lang="get_default_language()" - curr_value="getLocalAttribute(curr_prop, default_lang)"> - - <form action="<dtml-var URL1>" method="post" name="frmProperties"> - <table cellspacing="0" cellpadding="2" border="0"> - <tr class="list-header"> - <td align="left" valign="top" width="16"> </td> - <td align="left" valign="top"> - <div class="form-label"><dtml-var "gettext('Name')"></div> - </td> - <td align="left" valign="top"> - <div class="form-label"><dtml-var "gettext('Value')"></div> - </td> - <td align="left" valign="top"> - <div class="form-label"><dtml-var "gettext('Type')"></div> - </td> - </tr> - <dtml-in properties mapping> - <tr> - <td align="left" valign="top" width="16"> - <input type="checkbox" name="ids:list" - value="<dtml-var id>" id="cb-title"> - </td> - <td align="left" valign="top"> - <div class="form-label"><label for="cb-title"><dtml-var id></label></div> - </td> - <td align="left" valign="top"> - <dtml-if "type == 'string'"> - <input type="text" name="<dtml-var id>:utf8:ustring" size="65" value="<dtml-var "getLocalAttribute(id, default_lang)">" /> - <dtml-elif "type == 'text'"> - <textarea name="<dtml-var id>:utf8:ustring" rows="10" cols="65"><dtml-var "getLocalAttribute(id, default_lang)"></textarea> - </dtml-if> - </td> - <td align="left" valign="top"> - <div class="list-item"><dtml-var type></div> - </td> - </tr> - </dtml-in> - <tr> - <td colspan="2"></td> - <td align="left" valign="top"> - <div class="form-element"> - <input type="hidden" name="code" value="<dtml-var default_lang>" /> - <input type="hidden" name="destination" value="manage_localPropertiesForm" /> - <input name="manage_editLocalProperty:method" type="submit" class="form-element" value=" <dtml-var "gettext('Save changes')"> " /> - <input name="manage_delLocalProperty:method" type="submit" class="form-element" value=" <dtml-var "gettext('Delete')"> " /> - </div> - </td> - <td></td> - </tr> - </table> - </form> - </dtml-let> -</dtml-if> - - <form action="manage_addLocalProperty" method="post"> - - <p class="form-help"> - To add a new property, enter a name, type and value for the new - property and click the "Add" button. - </p> - - <table> - <tr> - <td align="left" valign="top"> - <div class="form-label"><dtml-var "gettext('Name')"></div> - </td> - <td align="left" valign="top"> - <input type="text" name="id:utf8:ustring" size="30" value=""/> - </td> - <td align="left" valign="top" class="form-label"> - <dtml-var "gettext('Type')"> - </td> - <td align="left" valign="top"> - <div class="form-element"> - <select name="type"> - <option>string</option> - <option>text</option> - </select> - </div> - </td> - </tr> - <tr> - <td align="left" valign="top"> - <div class="form-label"><dtml-var "gettext('Value')"></div> - </td> - <td colspan=2 align="left" valign="top"> - <input type="text" name="value:utf8:ustring" size="30" /> - </td> - <td align="right" valign="top"> - <div class="form-element"> - <input class="form-element" type="submit" name="submit" value=" <dtml-var "gettext('Add')"> " /> - </div> - </td> - </tr> - </table> - </form> - -</dtml-let> -<dtml-var manage_page_footer> diff --git a/product/Localizer/ui/LPM_translations.dtml b/product/Localizer/ui/LPM_translations.dtml deleted file mode 100644 index 2d35faa270..0000000000 --- a/product/Localizer/ui/LPM_translations.dtml +++ /dev/null @@ -1,92 +0,0 @@ -<dtml-var manage_page_header> -<dtml-var manage_tabs> - -<dtml-comment> - Set here the default values for the REQUEST varibiles used - for the navigation of the web interface -</dtml-comment> - -<p class="form-help"> -This page allows you to see the properties of LocalContent and translate them. -Select a property and the property value will appear in the default language. -You can navigate throw the property translations by clicking on one of the available -languages. After changing the translation click Save Changes. -</p> -<p class="form-help"> -When the property value in the default language changes all the translations become -obsolete and they are marked with <img src="misc_/Localizer/obsolete" border="0" alt="Obsolete translation flag" />. -</p> -<dtml-let languages="get_targetLanguages()" - properties="getLocalProperties()"> - -<dtml-if languages> - <dtml-if properties> - <dtml-let curr_lang="REQUEST.get('lang', None) or languages[0]['code']" - default_lang="get_default_language()" - curr_prop="REQUEST.get('prop', properties[0]['id'])" - curr_value="getLocalAttribute(curr_prop, curr_lang)"> - - <table border="0" cellspacing="3" cellpadding="3" width="90%"> - <tr> - <td rowspan="2" width="30%"> - <textarea cols="65" rows="10" wrap="virtual" - readonly="readonly"><dtml-var "getLocalAttribute(curr_prop, default_lang)" html_quote></textarea> - <br /> - <dtml-in languages mapping sort=name> - <dtml-let name="gettext(name)"> - <dtml-if "code != get_default_language()"> - <a href="?lang=<dtml-var code url_quote>&prop=<dtml-var curr_prop url_quote>"> - <dtml-if "code==curr_lang"> - <dtml-if "is_obsolete(curr_prop, code)"> - <span style="font-weight:bold"><dtml-var name></span> - <img src="misc_/Localizer/obsolete" border="0" alt="Obsolete translation flag" /> - <dtml-else> - <span style="font-weight:bold"><dtml-var name></span> - </dtml-if> - <dtml-else> - <dtml-if "is_obsolete(curr_prop, code)"> - <dtml-var name><img src="misc_/Localizer/obsolete" border="0" alt="Obsolete translation flag" /> - <dtml-else> - <dtml-var name> - </dtml-if> - </dtml-if> - </a> - </dtml-if> - </dtml-let> - </dtml-in> - <form action="<dtml-var URL1>" method="post" name="frmProperties"> - <textarea name="value:utf8:ustring" cols="65" rows="10" - wrap="virtual"><dtml-var curr_value html_quote></textarea> - <input type="hidden" name="id" value="<dtml-var curr_prop>" /> - <input type="hidden" name="destination" value="manage_transPropertiesForm" /> - <input type="hidden" name="code" value="<dtml-var curr_lang>" /> - <dtml-if languages> - <input type="submit" name="manage_transLocalProperty:method" value=" <dtml-var "gettext('Save changes')"> " /> - </dtml-if> - </form> - </td> - <td valign="top"> - <div class="list-header" style="font-weight:bold"> Properties </div> - <dtml-in properties mapping> - <div <dtml-if sequence-even> style="background-color:white"<dtml-elif sequence-odd> style="background-color:#F0F0F0"</dtml-if>> - <a href="?lang=<dtml-var curr_lang url_quote>&prop=<dtml-var id url_quote>"> - <dtml-if "id == curr_prop"> - <span style="font-weight:bold"><em><dtml-var id></em></span> - <dtml-else> - <dtml-var id> - </dtml-if></a></div> - </dtml-in> - </td> - </tr> - </table> - </dtml-let> - <dtml-else> - There are no properties. - </dtml-if> -<dtml-else> - <p>No languages available, please add them using the - <a href='manage_languages'>Languages</a> tab</p> -</dtml-if> -</dtml-let> - -<dtml-var manage_page_footer> diff --git a/product/Localizer/ui/LocalContent_add.dtml b/product/Localizer/ui/LocalContent_add.dtml deleted file mode 100644 index 1940a8f6b7..0000000000 --- a/product/Localizer/ui/LocalContent_add.dtml +++ /dev/null @@ -1,43 +0,0 @@ -<dtml-unless management_page_charset> - <dtml-call "REQUEST.set('management_page_charset', 'UTF-8')"> -</dtml-unless> -<dtml-var manage_page_header> - -<dtml-var "manage_form_title(this(), _, - form_title=gettext('Add Local Content'), - help_product='Localizer', - help_topic='LocalContent_add.stx')"> - - -<p class="form-help"> - <dtml-gettext> - A Local Content object provides a storage for multilingual (and - non multilingual) properties. It also helps you keep your content - separated from the logic and the presentation. - </dtml-gettext> -</p> - - -<form action="manage_addLocalContent" method="post"> -<table cellspacing="2"> - <tr> - <th align="right"><dtml-var "gettext('Id')"></th> - <td><input type="text" name="id" size="50"></td> - </tr> - <tr> - <th align="right"><dtml-var "gettext('Original language')"></th> - <td><input type="text" size="10" name="sourcelang" value="en"></td> - </tr> - <tr> - <th align="right"><dtml-var "gettext('Target languages')"></th> - <td><input type="text" name="languages:tokens" size="50" - value="<dtml-try><dtml-in "Localizer.get_languages()"><dtml-var sequence-item> </dtml-in><dtml-except></dtml-try>"></td> - </tr> - <tr> - <td></td> - <td><br><input type="submit" value=" <dtml-var "gettext('Add')"> "></td> - </tr> -</table> -</form> - -<dtml-var manage_page_footer> diff --git a/product/Localizer/ui/LocalFolder_add.dtml b/product/Localizer/ui/LocalFolder_add.dtml deleted file mode 100644 index d2ce3f4d0c..0000000000 --- a/product/Localizer/ui/LocalFolder_add.dtml +++ /dev/null @@ -1,44 +0,0 @@ -<dtml-unless management_page_charset> - <dtml-call "REQUEST.set('management_page_charset', 'UTF-8')"> -</dtml-unless> -<dtml-var manage_page_header> - - -<dtml-var "manage_form_title(this(), _, - form_title=gettext('Add Local Folder'), - help_product='Localizer', - help_topic='LocalFolder_add.stx')"> - - -<p class="form-help"> - <dtml-gettext> - A local folder is a generic solution to manage any kind of multingual - objects, files, images, scripts, etc.. - </dtml-gettext> -</p> - - -<form action="manage_addLocalFolder" method="post"> - <table> - <tr> - <th align="right"><dtml-var "gettext('Id')"></th> - <td><input type="text" name="id"></td> - </tr> - <tr> - <th align="right"><em><dtml-var "gettext('Title')"></em></th> - <td><input type="text" name="title"></td> - </tr> - <tr> - <th align="right"><dtml-var "gettext('Languages')"></th> - <td><input type="text" name="languages:tokens" - value="<dtml-try><dtml-in "Localizer.get_languages()"><dtml-var sequence-item> </dtml-in><dtml-except>en </dtml-try>"></td> - </tr> - <tr> - <td></td> - <td><input type="submit" value=" <dtml-var "gettext('Add')"> "></td> - </tr> - </table> -</form> - - -<dtml-var manage_page_footer> diff --git a/product/Localizer/ui/LocalFolder_attributes.dtml b/product/Localizer/ui/LocalFolder_attributes.dtml deleted file mode 100644 index 62d84e3032..0000000000 --- a/product/Localizer/ui/LocalFolder_attributes.dtml +++ /dev/null @@ -1,56 +0,0 @@ -<dtml-var manage_page_header> -<dtml-var manage_tabs> - -<dtml-let local_attributes="get_local_attributes()"> - <dtml-if local_attributes> - <p class="form-help"> - <dtml-gettext> - To delete an attribute check it and click the <tt>Delete</tt> button. - </dtml-gettext> - </p> - <blockquote> - <form action="manage_delAttributes" method="post"> - <table> - <dtml-in get_local_attributes> - <tr> - <td> - <input type="checkbox" name="attributes:tuple" - value="<dtml-var sequence-item>"> - </td> - <td> - <dtml-var sequence-item> - </td> - </tr> - </dtml-in> - <tr> - <td></td> - <td> - <input type="submit" value=" <dtml-var "gettext('Delete')"> "> - </td> - </tr> - </table> - </form> - </blockquote> - <dtml-else> - <p class="form-help"> - <dtml-gettext>There are no attributes</dtml-gettext> - </p> - </dtml-if> -</dtml-let> - - -<p class="form-help"> - <dtml-gettext> - To add an attribute introduce its id and click the <tt>Add</tt> button. - </dtml-gettext> -</p> -<blockquote> - <form action="manage_addAttribute" method="post"> - <input type="text" name="id"> - <input type="submit" value=" <dtml-var "gettext('Add')"> "> - </form> -</blockquote> - - - -<dtml-var manage_page_footer> diff --git a/product/Localizer/ui/MC_Export_form.dtml b/product/Localizer/ui/MC_Export_form.dtml index d617eb2d09..3abf094429 100644 --- a/product/Localizer/ui/MC_Export_form.dtml +++ b/product/Localizer/ui/MC_Export_form.dtml @@ -37,65 +37,4 @@ </form> </fieldset> - -<fieldset><legend><dtml-var "gettext('Export messages to TMX file')"></legend> -<p class="form-help"> - <dtml-gettext> - You can export the messages and their translations to TMX level 1 files. - To do that just click the <tt>Export</tt> button. - </dtml-gettext> -</p> - -<form action="tmx_export" method="post"> - <table> - <tr> - <td><br></td> - <tr> - <td><input type="submit" value=" <dtml-var "gettext('Export')"> "></td> - <td></td> - </tr> - </table> -</form> -</fieldset> - -<fieldset><legend><dtml-var "gettext('Export messages to XLIFF file')"></legend> -<p class="form-help"> - <dtml-gettext> - You can export the messages and their translations to XLIFF files. - Check any option to get a XLIFF file with the messages and their - translations to the selected language. Then click the <tt>Export</tt> - button. - </dtml-gettext> -</p> - -<form action="xliff_export" method="post"> - <table border=0 cellpadding="2" cellspacing="2"> - <tr> - <td><input type="radio" name="export_all" value="1" checked>Export all messages<br> - <input type="radio" name="export_all" value="0">Export only untranslated messages - for the language you select - </td> - </tr> - <tr> - <th align="left"> - <dtml-var "gettext('Target language')"> - </th> - </tr> - <tr> - <td valign="top"> - <select name="x"> - <dtml-in get_languages_mapping mapping sort=name> - <option value="<dtml-var code>"><dtml-var code> / <dtml-var "gettext(name)"></option> - </dtml-in> - </select> - </td> - </tr> - <tr> - <td><input type="submit" value=" <dtml-var "gettext('Export')"> "></td> - <td></td> - </tr> - </table> -</form> -</fieldset> - <dtml-var manage_page_footer> diff --git a/product/Localizer/ui/MC_Import_form.dtml b/product/Localizer/ui/MC_Import_form.dtml index 4adad24f14..45785624e2 100644 --- a/product/Localizer/ui/MC_Import_form.dtml +++ b/product/Localizer/ui/MC_Import_form.dtml @@ -35,69 +35,4 @@ </form> </fieldset> -<fieldset><legend><dtml-var "gettext('Import translations from TMX file')"></legend> -<p class="form-help"> - <dtml-gettext> - The message catalog also supports importing TMX files. You can add new - messages and translations importing a TMX file in TMX level 1. Enter the - filename and click the - <tt>Import</tt> button. - </dtml-gettext> -</p> - - -<form action="tmx_import" method="post" enctype="multipart/form-data"> - <table> - <tr> - <th align="right"><dtml-var "gettext('How much')"></th> - <td> - <input type="radio" name="howmuch" value="existing" checked> - <dtml-gettext>Import only translations for messages that - exist already</dtml-gettext><br> - <input type="radio" name="howmuch" value="all"> - <dtml-gettext>Import all messages</dtml-gettext><br> - <input type="radio" name="howmuch" value="clear"> - <dtml-gettext>Clear catalog and import all messages</dtml-gettext> - </td> - </tr> - <tr> - <th align="right"><dtml-var "gettext('File')"></th> - <td><input type="file" name="file"></td> - </tr> - - <tr> - <th></th> - <td><input type="submit" value=" <dtml-var "gettext('Import')"> "></td> - </tr> - </table> -</form> -</fieldset> - -<fieldset><legend><dtml-var "gettext('Import translations from XLIFF file')"></legend> -<form action="xliff_import" method="post" enctype="multipart/form-data"> -<table> - <tr> - <th align="right"><dtml-var "gettext('How much')"></th> - <td> - <input type="radio" name="howmuch" value="existing" checked> - <dtml-gettext>Import only translations for messages that - exist already</dtml-gettext><br> - <input type="radio" name="howmuch" value="all"> - <dtml-gettext>Import all messages</dtml-gettext><br> - <input type="radio" name="howmuch" value="clear"> - <dtml-gettext>Clear catalog and import all messages</dtml-gettext> - </td> - </tr> - <tr> - <th align="right"><dtml-var "gettext('File')"></th> - <td><input type="file" name="file"></td> - </tr> - <tr> - <th></th> - <td><input type="submit" value=" <dtml-var "gettext('Import')"> "></td> - </tr> -</table> -</form> -</fieldset> - <dtml-var manage_page_footer> diff --git a/product/Localizer/utils.py b/product/Localizer/utils.py index e7ca2fe765..36d786e6d5 100644 --- a/product/Localizer/utils.py +++ b/product/Localizer/utils.py @@ -1,4 +1,4 @@ -# -*- coding: UTF-8 -*- +# -*- coding: utf-8 -*- # Copyright (C) 2000-2003 Juan David Ibáñez Palomar <jdavid@itaapy.com> # # This program is free software: you can redistribute it and/or modify @@ -15,9 +15,8 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # Import from itools -from itools import get_abspath -from itools.i18n import AcceptLanguageType, init_language_selector -from itools.gettext import get_domain, register_domain +from .itools.utils import get_abspath +from .itools.i18n import AcceptLanguageType, init_language_selector # Import from Zope from App.Common import package_home @@ -62,20 +61,22 @@ init_language_selector(lang_negotiator) # directory. ########################################################################### class DomainAware(object): + """ + This class is just a stub. We're not interested in filesystem-based + po-file translations. + + All subclasses should be either changed not to require DomainAware + or removed altogether. + """ def __init__(self, namespace): mname = namespace['__name__'] domain = get_abspath('locale', mname=mname) self.class_domain = domain - register_domain(domain, domain) def gettext(self, message, language=None): - domain = get_domain(self.class_domain) - if language is None: - languages = domain.get_languages() - language = select_language(languages) - return domain.gettext(message, language) + return message _ = DomainAware(globals()).gettext diff --git a/product/Localizer/zgettext.py b/product/Localizer/zgettext.py deleted file mode 100755 index 915a094307..0000000000 --- a/product/Localizer/zgettext.py +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bin/env python -# -*- coding: UTF-8 -*- -# Copyright (C) 2001 Andrés Marzal Varo -# Copyright (C) 2001-2002 J. David Ibáñez <jdavid@itaapy.com> -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -""" -zgettext.py is a script that parses DTML files and generates .pot and .po -files, and then generates .mo files from the .po files. - -Future (XXX): - zgettext should provide a similar interface to xgettext, it just should - detect dtml and zpt files, parse them, and call xgettext for the rest. - - another script should do the wrap up to easily create multilingual products, - or maybe we could avoid this and just use make - -Anyway, the trend is to levereage the gettext tools as much as posible. -""" - -# Import from the Standard Library -from os import listdir, mkdir, remove, system -from os.path import exists, isdir -from re import compile, DOTALL, findall -import sys -from tempfile import mktemp -from time import gmtime, strftime, time - -# Import from itools -from itools.handlers import get_handler -from itools.gettext import POFile - - - -# Exceptions -class UnknownStatus(Exception): - pass - - - -def create_mo_files(): - for filename in [ x for x in listdir('locale') if x.endswith('.po') ]: - language = filename[:-3] - system('msgfmt locale/%s.po -o locale/%s.mo' % (language, language)) - - -def parse_generic(text, commands=('gettext',)): - """Search for patterns like: gettext('message'). - - XXX - Originally it was used to parse Python code, but it fails to parse - some of the Python strings, now xgettext is used instead. So currently - this function is only used to parse DTML and ZPT; probably the regular - expression could be simplified as in DTML and ZPT there're (maybe) - less options for Python strings due to the syntax constrains of these - languages. - """ - r = [] - for command in commands: - pattern = command + '\s*\(\s*(\'.*?[^\\\\]\'|\".*?[^\\\\]\")\s*\)' - regex = compile(pattern, DOTALL) - r.extend([ x[1:-1] for x in findall(regex, text) ]) - - return r - - -def parse_dtml(text): - """Extract the messages from a DTML template. - """ - messages = parse_generic(text) - - # Search the "<dtml-gettext>message</dtml-gettext>" pattern - regex = compile('<dtml-gettext(.*?)>(.*?)</dtml-gettext>', DOTALL) - for parameters, message in findall(regex, text): - if parameters.find('verbatim') == -1: - message = ' '.join([ x.strip() for x in message.split() ]) - messages.append(message) - - return messages - - -def parse_zpt(text): - """Extract the messages from a ZPT template. - - XXX It should be improved to parse the i18n namespace. - """ - return parse_generic(text) - - -def do_all(filenames, languages): - # Create the locale directory - if not isdir('./locale'): - try: - mkdir('./locale') - except OSError, msg: - sys.stderr.write('Error: Cannot create directory "locale".\n%s\n' - % msg) - sys.exit(1) - - # Create the pot file - if not exists('locale/locale.pot'): - f = open('locale/locale.pot', 'w') - f.write("# SOME DESCRIPTIVE TITLE.\n") - f.write("# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n") - f.write("# This file is distributed under the same license as the PACKAGE package.\n") - f.write("# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n") - f.write("#\n") - f.write("#, fuzzy\n") - f.write('msgid ""\n') - f.write('msgstr ""\n') - f.write('"Project-Id-Version: PACKAGE VERSION\\n"\n') - f.write('"POT-Creation-Date: %s\\n"\n' % strftime('%Y-%m-%d %H:%m+%Z', - gmtime(time()))) - f.write('"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"\n') - f.write('"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"\n') - f.write('"Language-Team: LANGUAGE <LL@li.org>\\n"\n') - f.write('"MIME-Version: 1.0\\n"\n') - f.write('"Content-Type: text/plain; charset=CHARSET\\n"\n') - f.write('"Content-Transfer-Encoding: 8bit\\n"\n') - f.close() - - # Filter and parse the DTML and ZPT files, the rest will be parsed - # with xgettext. - filenames2 = [] - messages = [] - for filename in filenames: - filetype = filename.split('.')[-1] - - if filetype == 'dtml': - text = open(filename).read() - messages.extend(parse_dtml(text)) - elif filetype == 'zpt': - text = open(filename).read() - messages.extend(parse_zpt(text)) - else: - filenames2.append(filename) - - filenames = [] - - # Write a PO file with the messages from DTML and ZPT - if messages: - filename = mktemp('.po') - filenames.append(filename) - - f = open(filename, 'w') - - aux = [] - for message in messages: - if message not in aux: - f.write('msgid "%s"\n' % message) - f.write('msgstr ""\n') - f.write('\n') - aux.append(message) - f.close() - - # Parse the rest of the files - if filenames2: - po = POFile() - for filename in filenames2: - handler = get_handler(filename) - for source, context, line in handler.get_units(): - po.add_unit(filename, source, context, line) - filename = mktemp('.po') - filenames.append(filename) - open(filename, 'w').write(po.to_str()) - - # Create the POT file - if filenames: - filename = mktemp('.po') - cmd = 'msgcat -s --output-file=%s %s' % (filename, ' '.join(filenames)) - system(cmd) - system('msgmerge -U locale/locale.pot %s' % filename) - - # Remove temporal files - remove(filename) - for filename in filenames: - remove(filename) - - # Generate the PO files - for language in languages: - if exists('./locale/%s.po' % language): - # a .po file already exist, merge it with locale.pot - system('msgmerge -U locale/%s.po locale/locale.pot' % language) - else: - # po doesn't exist, just copy locale.pot - text = open('./locale/locale.pot').read() - open('./locale/%s.po' % language, 'w').write(text) - - - -if __name__ == '__main__': - # Parse the command line - status = 0 - files = [] - langs = [] - for arg in sys.argv[1:]: - if status == 0: - if arg == '-h': - status = 1 - elif arg == '-m': - status = 2 - elif arg == '-l': - status = 3 - else: - files.append(arg) - status = 4 - elif status == 1: - status = 'Error' - break - elif status == 2: - status = 'Error' - break - elif status == 3: - langs.append(arg) - status = 5 - elif status == 4: - if arg == '-l': - status = 3 - else: - files.append(arg) - elif status == 5: - langs.append(arg) - else: - raise UnknownStatus, str(status) - - # Action - if status in (0, 1, 3, 'Error'): - # Provide help if the line format is wrong or if the -h modifier - # is provided - print 'Usage:' - print ' zgettext.py -h' - print ' Shows this help message.' - print ' zgettext.py [file file ... file] [-l languages]' - print ' Parses all the specified files, creates the locale' - print ' directory, creates the locale.pot file and the .po' - print ' files of the languages specified.' - print ' zgettxt.py -m' - print ' Compiles all the .po files in the locale directory' - print ' and creates the .mo files.' - print - print 'Examples:' - print ' zgettext.py *.dtml -l ca es en' - print ' zgettext.py -m' - elif status == 2: - create_mo_files() - elif status in (4, 5): - do_all(files, langs) - else: - raise UnknownStatus, str(status) -- 2.30.9