[Pkg-mailman-hackers] Pkg-mailman commit - rev 492 - in
branches/pkg-split/thijs/debian: . patches po
Thijs Kinkhorst
thijs at alioth.debian.org
Thu Apr 19 13:25:00 UTC 2007
Author: thijs
Date: 2007-04-19 13:24:59 +0000 (Thu, 19 Apr 2007)
New Revision: 492
Added:
branches/pkg-split/thijs/debian/NEWS
branches/pkg-split/thijs/debian/patches/02_HyperDatabase_mapkeys.patch
branches/pkg-split/thijs/debian/patches/58_fix_es_translation.patch
branches/pkg-split/thijs/debian/patches/72_fblast_add_shebang.patch
branches/pkg-split/thijs/debian/patches/81_backport_export.dpatch
branches/pkg-split/thijs/debian/po/pt.po
branches/pkg-split/thijs/debian/pyversions
branches/pkg-split/thijs/debian/unicodify_archives.py
Log:
add files from trunk (inadvertently not added in previous merge)
Added: branches/pkg-split/thijs/debian/NEWS
===================================================================
--- branches/pkg-split/thijs/debian/NEWS 2007-04-13 13:31:00 UTC (rev 491)
+++ branches/pkg-split/thijs/debian/NEWS 2007-04-19 13:24:59 UTC (rev 492)
@@ -0,0 +1,38 @@
+mailman (1:2.1.9-6) unstable; urgency=medium
+
+ * This version will automatically upgrade indexes of the current
+ archiving volume to the new Unicode format, which can lead to a slight
+ corruption / data loss in the form of non-ASCII characters not being
+ transcoded correctly.
+
+ If you kept single-mbox archives of your mailing list additionally to
+ the HTML ones (even if this mbox archive was not downloadable from the
+ web), you are probably better off regenerating the archives from
+ scratch with:
+ cd /var/lib/mailman/lists
+ for list in *; do /var/lib/mailman/bin/arch --wipe "${list}" ; done
+ This will use information in the original email to make a better guess
+ at the encoding of the subject and author of a post to the list.
+
+
+ Details:
+
+ Some previous versions tried to use Unicode for new entries, mixing
+ them with old 8 bit character string entries left over from even older
+ versions, leading to a cascade of events that broke archiving for
+ some mailing lists completely for the rest of the archiving volume
+ period (often the calendar month).
+
+ As the old entries were stored as strings without encoding
+ information, there is no way to automatically reliably convert those
+ to Unicode. The upgrade code will try, in order:
+ - the default Python encoding (usually ASCII)
+ - UTF-8
+ - windows-1252, a superset of iso-8859-1
+ You can change the default Python encoding by creating a file called
+ sitecustomize.py in python's loadpath with e.g.:
+ import sys
+ sys.setdefaultencoding('iso-8859-8')
+
+ -- Lionel Elie Mamane <lmamane at debian.org> Tue, 27 Feb 2007 21:30:49 +0100
+
Added: branches/pkg-split/thijs/debian/patches/02_HyperDatabase_mapkeys.patch
===================================================================
--- branches/pkg-split/thijs/debian/patches/02_HyperDatabase_mapkeys.patch 2007-04-13 13:31:00 UTC (rev 491)
+++ branches/pkg-split/thijs/debian/patches/02_HyperDatabase_mapkeys.patch 2007-04-19 13:24:59 UTC (rev 492)
@@ -0,0 +1,25 @@
+--- Mailman/Archiver/HyperDatabase.py 2005-08-27 03:40:17.000000000 +0200
++++ Mailman/Archiver/HyperDatabase.py 2007-02-27 20:33:41.103527160 +0100
+@@ -324,15 +343,22 @@
+
+ def clearIndex(self, archive, index):
+ self.__openIndices(archive)
+ if hasattr(self.threadIndex, 'clear'):
+ self.threadIndex.clear()
+ return
+ finished=0
+ try:
+ key, msgid=self.threadIndex.first()
+ except KeyError: finished=1
+ while not finished:
+ del self.threadIndex[key]
+ try:
+ key, msgid=self.threadIndex.next()
+ except KeyError: finished=1
++
++ def mapKeys(self, f, archive, index):
++ self.__openIndices(archive)
++ index = getattr(self, index + 'Index')
++ d = index.dict
++ index.dict = dict(zip(map(f, d.keys()), d.values()))
++ index.__dirty = 1
Added: branches/pkg-split/thijs/debian/patches/58_fix_es_translation.patch
===================================================================
--- branches/pkg-split/thijs/debian/patches/58_fix_es_translation.patch 2007-04-13 13:31:00 UTC (rev 491)
+++ branches/pkg-split/thijs/debian/patches/58_fix_es_translation.patch 2007-04-19 13:24:59 UTC (rev 492)
@@ -0,0 +1,16 @@
+Patch: 58_fix_translations.patch
+Author: Siggy Brentrup <bsb at debian.org>
+Fix translation errors
+Index: messages/es/LC_MESSAGES/mailman.po
+===================================================================
+--- messages/es/LC_MESSAGES/mailman.po.orig 2006-09-19 16:12:12.000000000 +0200
++++ messages/es/LC_MESSAGES/mailman.po 2006-09-19 16:13:34.000000000 +0200
+@@ -1989,7 +1989,7 @@
+ #: Mailman/Cgi/create.py:214 bin/.svn/text-base/newlist.svn-base:200
+ #: bin/newlist:200
+ msgid "Illegal list name: %(s)s"
+-msgstr "Nombre de lista ilegal: %(opt)s"
++msgstr "Nombre de lista ilegal: %(s)s"
+
+ #: Mailman/Cgi/create.py:219
+ msgid ""
Added: branches/pkg-split/thijs/debian/patches/72_fblast_add_shebang.patch
===================================================================
--- branches/pkg-split/thijs/debian/patches/72_fblast_add_shebang.patch 2007-04-13 13:31:00 UTC (rev 491)
+++ branches/pkg-split/thijs/debian/patches/72_fblast_add_shebang.patch 2007-04-19 13:24:59 UTC (rev 492)
@@ -0,0 +1,14 @@
+Patch: 72_fblast_add_shebang.patch
+Author: Thijs Kinkhorst <thijs at debian.org>
+Submitted upstream: http://sourceforge.net/tracker/index.php?func=detail&aid=1578740&group_id=103&atid=300103
+This script may be called directly from the command line, is set as executable,
+thus needs a shebang line.
+Index: tests/fblast.py
+===================================================================
+--- tests/fblast.py.orig 2006-10-17 10:08:34.000000000 +0200
++++ tests/fblast.py 2006-10-17 10:09:07.000000000 +0200
+@@ -1,3 +1,4 @@
++#! /usr/bin/env python
+ """Throw email at Mailman as fast as you can.
+
+ This is not a unit test, it's a functional test, so you can't run it within
Added: branches/pkg-split/thijs/debian/patches/81_backport_export.dpatch
===================================================================
--- branches/pkg-split/thijs/debian/patches/81_backport_export.dpatch 2007-04-13 13:31:00 UTC (rev 491)
+++ branches/pkg-split/thijs/debian/patches/81_backport_export.dpatch 2007-04-19 13:24:59 UTC (rev 492)
@@ -0,0 +1,438 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 81_backport_export.dpatch by <lmamane at debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Backport bin/export from upstream SVN so that we can
+## DP: have automatic upgrades to lenny.
+
+ at DPATCH@
+diff -urNad mailman-2.1.9~/bin/Makefile.in mailman-2.1.9/bin/Makefile.in
+--- mailman-2.1.9~/bin/Makefile.in 2005-08-27 03:40:17.000000000 +0200
++++ mailman-2.1.9/bin/Makefile.in 2007-01-20 04:56:07.585102043 +0100
+@@ -1,4 +1,4 @@
+-# Copyright (C) 1998-2004 by the Free Software Foundation, Inc.
++# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+ #
+ # This program is free software; you can redistribute it and/or
+ # modify it under the terms of the GNU General Public License
+@@ -49,7 +49,7 @@
+ list_admins genaliases change_pw mailmanctl qrunner inject \
+ unshunt fix_url.py convert.py transcheck b4b5-archfix \
+ list_owners msgfmt.py show_qfiles discard rb-archfix \
+- reset_pw.py
++ reset_pw.py export.py
+
+ BUILDDIR= ../build/bin
+
+diff -urNad mailman-2.1.9~/bin/export.py mailman-2.1.9/bin/export.py
+--- mailman-2.1.9~/bin/export.py 1970-01-01 01:00:00.000000000 +0100
++++ mailman-2.1.9/bin/export.py 2007-01-20 04:56:07.585102043 +0100
+@@ -0,0 +1,382 @@
++#! @PYTHON@
++#
++# Copyright (C) 2006-2007 by the Free Software Foundation, Inc.
++#
++# 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 2
++# 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, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++# USA.
++
++"""Export an XML representation of a mailing list."""
++
++import os
++import sys
++import sha
++import base64
++import codecs
++import datetime
++import optparse
++
++from xml.sax.saxutils import escape
++
++import paths
++from Mailman import Defaults
++from Mailman import Errors
++from Mailman import MemberAdaptor
++from Mailman import Utils
++from Mailman import mm_cfg
++from Mailman.MailList import MailList
++from Mailman.i18n import _
++
++__i18n_templates__ = True
++
++SPACE = ' '
++DOLLAR_STRINGS = ('msg_header', 'msg_footer',
++ 'digest_header', 'digest_footer',
++ 'autoresponse_postings_text',
++ 'autoresponse_admin_text',
++ 'autoresponse_request_text')
++SALT_LENGTH = 4 # bytes
++
++TYPES = {
++ mm_cfg.Toggle : 'bool',
++ mm_cfg.Radio : 'radio',
++ mm_cfg.String : 'string',
++ mm_cfg.Text : 'text',
++ mm_cfg.Email : 'email',
++ mm_cfg.EmailList : 'email_list',
++ mm_cfg.Host : 'host',
++ mm_cfg.Number : 'number',
++ mm_cfg.FileUpload : 'upload',
++ mm_cfg.Select : 'select',
++ mm_cfg.Topics : 'topics',
++ mm_cfg.Checkbox : 'checkbox',
++ mm_cfg.EmailListEx : 'email_list_ex',
++ mm_cfg.HeaderFilter : 'header_filter',
++ }
++
++
++
++
++class Indenter:
++ def __init__(self, fp, indentwidth=4):
++ self._fp = fp
++ self._indent = 0
++ self._width = indentwidth
++
++ def indent(self):
++ self._indent += 1
++
++ def dedent(self):
++ self._indent -= 1
++ assert self._indent >= 0
++
++ def write(self, s):
++ if s <> '\n':
++ self._fp.write(self._indent * self._width * ' ')
++ self._fp.write(s)
++
++
++
++class XMLDumper(object):
++ def __init__(self, fp):
++ self._fp = Indenter(fp)
++ self._tagbuffer = None
++ self._stack = []
++
++ def _makeattrs(self, tagattrs):
++ # The attribute values might contain angle brackets. They might also
++ # be None.
++ attrs = []
++ for k, v in tagattrs.items():
++ if v is None:
++ v = ''
++ else:
++ v = escape(str(v))
++ attrs.append('%s="%s"' % (k, v))
++ return SPACE.join(attrs)
++
++ def _flush(self, more=True):
++ if not self._tagbuffer:
++ return
++ name, attributes = self._tagbuffer
++ self._tagbuffer = None
++ if attributes:
++ attrstr = ' ' + self._makeattrs(attributes)
++ else:
++ attrstr = ''
++ if more:
++ print >> self._fp, '<%s%s>' % (name, attrstr)
++ self._fp.indent()
++ self._stack.append(name)
++ else:
++ print >> self._fp, '<%s%s/>' % (name, attrstr)
++
++ # Use this method when you know you have sub-elements.
++ def _push_element(self, _name, **_tagattrs):
++ self._flush()
++ self._tagbuffer = (_name, _tagattrs)
++
++ def _pop_element(self, _name):
++ buffered = bool(self._tagbuffer)
++ self._flush(more=False)
++ if not buffered:
++ name = self._stack.pop()
++ assert name == _name, 'got: %s, expected: %s' % (_name, name)
++ self._fp.dedent()
++ print >> self._fp, '</%s>' % name
++
++ # Use this method when you do not have sub-elements
++ def _element(self, _name, _value=None, **_attributes):
++ self._flush()
++ if _attributes:
++ attrs = ' ' + self._makeattrs(_attributes)
++ else:
++ attrs = ''
++ if _value is None:
++ print >> self._fp, '<%s%s/>' % (_name, attrs)
++ else:
++ value = escape(unicode(_value))
++ print >> self._fp, '<%s%s>%s</%s>' % (_name, attrs, value, _name)
++
++ def _do_list_categories(self, mlist, k, subcat=None):
++ is_converted = bool(getattr(mlist, 'use_dollar_strings', False))
++ info = mlist.GetConfigInfo(k, subcat)
++ label, gui = mlist.GetConfigCategories()[k]
++ if info is None:
++ return
++ for data in info[1:]:
++ if not isinstance(data, tuple):
++ continue
++ varname = data[0]
++ # Variable could be volatile
++ if varname.startswith('_'):
++ continue
++ vtype = data[1]
++ # Munge the value based on its type
++ value = None
++ if hasattr(gui, 'getValue'):
++ value = gui.getValue(mlist, vtype, varname, data[2])
++ if value is None:
++ value = getattr(mlist, varname)
++ # Do %-string to $-string conversions if the list hasn't already
++ # been converted.
++ if varname == 'use_dollar_strings':
++ continue
++ if not is_converted and varname in DOLLAR_STRINGS:
++ value = Utils.to_dollar(value)
++ widget_type = TYPES[vtype]
++ if isinstance(value, list):
++ self._push_element('option', name=varname, type=widget_type)
++ for v in value:
++ self._element('value', v)
++ self._pop_element('option')
++ else:
++ self._element('option', value, name=varname, type=widget_type)
++
++ def _dump_list(self, mlist, password_scheme):
++ # Write list configuration values
++ self._push_element('list', name=mlist._internal_name)
++ self._push_element('configuration')
++ self._element('option',
++ mlist.preferred_language,
++ name='preferred_language',
++ type='string')
++ self._element('option',
++ mlist.password,
++ name='password',
++ type='string')
++ for k in mm_cfg.ADMIN_CATEGORIES:
++ subcats = mlist.GetConfigSubCategories(k)
++ if subcats is None:
++ self._do_list_categories(mlist, k)
++ else:
++ for subcat in [t[0] for t in subcats]:
++ self._do_list_categories(mlist, k, subcat)
++ self._pop_element('configuration')
++ # Write membership
++ self._push_element('roster')
++ digesters = set(mlist.getDigestMemberKeys())
++ for member in sorted(mlist.getMembers()):
++ attrs = dict(id=member)
++ cased = mlist.getMemberCPAddress(member)
++ if cased <> member:
++ attrs['original'] = cased
++ self._push_element('member', **attrs)
++ self._element('realname', mlist.getMemberName(member))
++ self._element('password',
++ password_scheme(mlist.getMemberPassword(member)))
++ self._element('language', mlist.getMemberLanguage(member))
++ # Delivery status, combined with the type of delivery
++ attrs = {}
++ status = mlist.getDeliveryStatus(member)
++ if status == MemberAdaptor.ENABLED:
++ attrs['status'] = 'enabled'
++ else:
++ attrs['status'] = 'disabled'
++ attrs['reason'] = {MemberAdaptor.BYUSER : 'byuser',
++ MemberAdaptor.BYADMIN : 'byadmin',
++ MemberAdaptor.BYBOUNCE : 'bybounce',
++ }.get(mlist.getDeliveryStatus(member),
++ 'unknown')
++ if member in digesters:
++ if mlist.getMemberOption(member, mm_cfg.DisableMime):
++ attrs['delivery'] = 'plain'
++ else:
++ attrs['delivery'] = 'mime'
++ else:
++ attrs['delivery'] = 'regular'
++ changed = mlist.getDeliveryStatusChangeTime(member)
++ if changed:
++ when = datetime.datetime.fromtimestamp(changed)
++ attrs['changed'] = when.isoformat()
++ self._element('delivery', **attrs)
++ for option, flag in Defaults.OPTINFO.items():
++ # Digest/Regular delivery flag must be handled separately
++ if option in ('digest', 'plain'):
++ continue
++ value = mlist.getMemberOption(member, flag)
++ self._element(option, value)
++ topics = mlist.getMemberTopics(member)
++ if not topics:
++ self._element('topics')
++ else:
++ self._push_element('topics')
++ for topic in topics:
++ self._element('topic', topic)
++ self._pop_element('topics')
++ self._pop_element('member')
++ self._pop_element('roster')
++ self._pop_element('list')
++
++ def dump(self, listnames, password_scheme):
++ print >> self._fp, '<?xml version="1.0" encoding="UTF-8"?>'
++ self._push_element('mailman', **{
++ 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
++ 'xsi:noNamespaceSchemaLocation': 'ssi-1.0.xsd',
++ })
++ for listname in sorted(listnames):
++ try:
++ mlist = MailList(listname, lock=False)
++ except Errors.MMUnknownListError:
++ print >> sys.stderr, _('No such list: %(listname)s')
++ continue
++ self._dump_list(mlist, password_scheme)
++ self._pop_element('mailman')
++
++ def close(self):
++ while self._stack:
++ self._pop_element()
++
++
++
++def no_password(password):
++ return '{NONE}'
++
++
++def plaintext_password(password):
++ return '{PLAIN}' + password
++
++
++def sha_password(password):
++ h = sha.new(password)
++ return '{SHA}' + base64.b64encode(h.digest())
++
++
++def ssha_password(password):
++ salt = os.urandom(SALT_LENGTH)
++ h = sha.new(password)
++ h.update(salt)
++ return '{SSHA}' + base64.b64encode(h.digest() + salt)
++
++
++SCHEMES = {
++ 'none' : no_password,
++ 'plain' : plaintext_password,
++ 'sha' : sha_password,
++ }
++
++try:
++ os.urandom(1)
++except NotImplementedError:
++ pass
++else:
++ SCHEMES['ssha'] = ssha_password
++
++
++
++def parseargs():
++ parser = optparse.OptionParser(version=mm_cfg.VERSION,
++ usage=_("""\
++%%prog [options]
++
++Export the configuration and members of a mailing list in XML format."""))
++ parser.add_option('-o', '--outputfile',
++ metavar='FILENAME', default=None, type='string',
++ help=_("""\
++Output XML to FILENAME. If not given, or if FILENAME is '-', standard out is
++used."""))
++ parser.add_option('-p', '--password-scheme',
++ default='none', type='string', help=_("""\
++Specify the RFC 2307 style hashing scheme for passwords included in the
++output. Use -P to get a list of supported schemes, which are
++case-insensitive."""))
++ parser.add_option('-P', '--list-hash-schemes',
++ default=False, action='store_true', help=_("""\
++List the supported password hashing schemes and exit. The scheme labels are
++case-insensitive."""))
++ parser.add_option('-l', '--listname',
++ default=[], action='append', type='string',
++ metavar='LISTNAME', dest='listnames', help=_("""\
++The list to include in the output. If not given, then all mailing lists are
++included in the XML output. Multiple -l flags may be given."""))
++ opts, args = parser.parse_args()
++ if args:
++ parser.print_help()
++ parser.error(_('Unexpected arguments'))
++ if opts.list_hash_schemes:
++ for label in SCHEMES:
++ print label.upper()
++ sys.exit(0)
++ if opts.password_scheme.lower() not in SCHEMES:
++ parser.error(_('Invalid password scheme'))
++ return parser, opts, args
++
++
++
++def main():
++ parser, opts, args = parseargs()
++
++ if opts.outputfile in (None, '-'):
++ # This will fail if there are characters in the output incompatible
++ # with stdout.
++ fp = sys.stdout
++ else:
++ fp = codecs.open(opts.outputfile, 'w', 'utf-8')
++
++ try:
++ dumper = XMLDumper(fp)
++ if opts.listnames:
++ listnames = opts.listnames
++ else:
++ listnames = Utils.list_names()
++ dumper.dump(listnames, SCHEMES[opts.password_scheme])
++ dumper.close()
++ finally:
++ if fp is not sys.stdout:
++ fp.close()
++
++
++
++if __name__ == '__main__':
++ main()
+diff -urNad mailman-2.1.9~/configure.in mailman-2.1.9/configure.in
+--- mailman-2.1.9~/configure.in 2005-08-27 03:40:17.000000000 +0200
++++ mailman-2.1.9/configure.in 2007-01-20 04:56:07.585102043 +0100
+@@ -1,4 +1,4 @@
+-# Copyright (C) 1998-2004 by the Free Software Foundation, Inc.
++# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+ #
+ # This program is free software; you can redistribute it and/or
+ # modify it under the terms of the GNU General Public License
+@@ -15,7 +15,7 @@
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ dnl Process this file with autoconf to produce a configure script.
+-AC_REVISION($Revision: 7462 $)
++AC_REVISION($Revision: 8122 $)
+ AC_PREREQ(2.0)
+ AC_INIT(src/common.h)
+
+@@ -553,6 +553,7 @@
+ bin/convert.py \
+ bin/discard \
+ bin/dumpdb \
++bin/export.py \
+ bin/find_member \
+ bin/fix_url.py \
+ bin/genaliases \
Added: branches/pkg-split/thijs/debian/po/pt.po
===================================================================
--- branches/pkg-split/thijs/debian/po/pt.po 2007-04-13 13:31:00 UTC (rev 491)
+++ branches/pkg-split/thijs/debian/po/pt.po 2007-04-19 13:24:59 UTC (rev 492)
@@ -0,0 +1,395 @@
+# Portuguese translation for mailman debconf messages
+# Copyright (C) 2007 Miguel Figueiredo
+# This file is distributed under the same license as the mailman package.
+# Miguel Figueiredo <elmig at debianpt.org>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: mailman 2.1.9-5\n"
+"Report-Msgid-Bugs-To: pkg-mailman-hackers at lists.alioth.debian.org\n"
+"POT-Creation-Date: 2006-10-06 16:25+0200\n"
+"PO-Revision-Date: 2007-03-10 12:28+0000\n"
+"Last-Translator: Miguel Figueiredo <elmig at debianpt.org>\n"
+"Language-Team: Portuguese <traduz at debianpt.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "ar (Arabic)"
+msgstr "ar (Arábico)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "ca (Catalan)"
+msgstr "ca (Catalão)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "cs (Czech)"
+msgstr "cs (Checo)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "da (Danish)"
+msgstr "da (Dinamarquês)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "de (German)"
+msgstr "de (Alemão)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "en (English)"
+msgstr "en (Inglês)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "es (Spanish)"
+msgstr "es (Espanhol)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "et (Estonian)"
+msgstr "et (Estónio)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "eu (Basque)"
+msgstr "eu (Basco)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "fi (Finnish)"
+msgstr "fi (Finlandês)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "fr (French)"
+msgstr "fr (Françês)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "hr (Croatian)"
+msgstr "hr (Croata)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "hu (Hungarian)"
+msgstr "hu (Húngaro)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "ia (Interlingua)"
+msgstr "ia (Interlíngua)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "it (Italian)"
+msgstr "it (Italiano)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "ja (Japanese)"
+msgstr "ja (Japonês)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "ko (Korean)"
+msgstr "ko (Coreano)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "lt (Lithuanian)"
+msgstr "lt (Lituano)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "nl (Dutch)"
+msgstr "nl (Holandês)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "no (Norwegian)"
+msgstr "no (Norueguês)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "pl (Polish)"
+msgstr "pl (Polaco)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "pt (Portuguese)"
+msgstr "pt (Português)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "pt_BR (Brasilian Portuguese)"
+msgstr "pt_BR (Português do Brasil)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "ro (Romanian)"
+msgstr "ro (Romeno)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "ru (Russian)"
+msgstr "ru (Russo)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "sl (Slovenian)"
+msgstr "sl (Esloveno)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "sr (Serbian)"
+msgstr "sr (Sérvio)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "sv (Swedish)"
+msgstr "sv (Sueco)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "tr (Turkish)"
+msgstr "tr (Turco)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "uk (Ukrainian)"
+msgstr "uk (Ucraniano)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "vi (Vietnamese)"
+msgstr "vi (Vietnamita)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "zh_CN (Chinese - China)"
+msgstr "zh_CN (Chinês - China)"
+
+#. Type: multiselect
+#. Choices
+#: ../templates:1001
+msgid "zh_TW (Chinese - Taiwan)"
+msgstr "zh_TW (Chinês - Formosa)"
+
+#. Type: multiselect
+#. DefaultChoice
+#. You must NOT translate this string, but you can change its value.
+#. The comment between brackets is used to distinguish this msgid
+#. from the one in the Choices list; you do not have to worry about
+#. them, and have to simply choose a msgstr among the English values
+#. listed in the Choices field above, e.g. msgstr "nl (Dutch)".
+#. Type: select
+#. DefaultChoice
+#. You must NOT translate this string, but you can change its value.
+#. The comment between brackets is used to distinguish this msgid
+#. from the one in the Choices list; you do not have to worry about
+#. them, and have to simply choose a msgstr among the English values
+#. listed in the Choices field above, e.g. msgstr "nl (Dutch)".
+#: ../templates:1002 ../templates:5001
+msgid "en (English)[ default language ]"
+msgstr "pt (Português)"
+
+#. Type: multiselect
+#. Description
+#: ../templates:1003
+msgid "Languages to support:"
+msgstr "Idiomas a suportar:"
+
+#. Type: multiselect
+#. Description
+#: ../templates:1003
+msgid ""
+"For each supported language, Mailman stores default language specific texts "
+"in /etc/mailman/LANG/ giving them conffile like treatment with the help of "
+"ucf. This means approximately 150kB for each supported language on the root "
+"file system."
+msgstr ""
+"Para cada idioma suportado, o Mailman guarda o idioma textos específicos do "
+"idioma por omissão em /etc/mailman/LANG/ dando-lhes tratamento como ao "
+"conffile com a ajuda do ucf. Isto significa aproximadamente 150kB para cada "
+"idioma suportado no sistema de ficheiros raiz."
+
+#. Type: multiselect
+#. Description
+#: ../templates:1003
+msgid ""
+"If you need a different set of languages at a later time, just run dpkg-"
+"reconfigure mailman."
+msgstr ""
+"Se você necessitar de um conjunto diferente de idiomas noutra altura, apenas "
+"execute dpkg-reconfigure mailman."
+
+#. Type: multiselect
+#. Description
+#: ../templates:1003
+msgid ""
+"NOTE: Languages enabled on existing mailing lists are forcibly re-enabled "
+"when deselected and mailman needs at least one language for displaying its "
+"messages."
+msgstr ""
+"NOTA: Os idiomas habilitados em listas de correio existentes são "
+"forçadamente re-habilitados quando os deseleccionar e o mailman necessita "
+"de pelo menos um idioma para mostrar estas mensagens."
+
+#. Type: boolean
+#. Description
+#: ../templates:3001
+msgid "Gate news to mail?"
+msgstr "Redireccionar as news para o e-mail?"
+
+#. Type: boolean
+#. Description
+#: ../templates:3001
+msgid ""
+"Mailman allows to gate news to mail, that is, send all the messages which "
+"appear in a Usenet newsgroup to a mailing list."
+msgstr ""
+"O Mailman permite redireccionar as news para o e-mail, isto é, enviar todas "
+"as mensagens que aparecem num newsgroup Usenet para a lista de correio."
+
+#. Type: boolean
+#. Description
+#: ../templates:3001
+msgid "Most people won't need this."
+msgstr "A maioria das pessoas não necessitará disto."
+
+#. Type: note
+#. Description
+#: ../templates:4001
+msgid "Missing site list"
+msgstr "Falta lista de site"
+
+#. Type: note
+#. Description
+#: ../templates:4001
+msgid ""
+"Mailman needs a so-called \"site list\", which is the list from which "
+"password reminders and such are sent out from. This list needs to be "
+"created before mailman will start."
+msgstr ""
+"O Mailman necessita do chamado \"site list\", que é a lista a partir da qual "
+"os alertas de palavra-chave são enviados. Esta lista necessita ser criada "
+"antes do mailman iniciar."
+
+#. Type: note
+#. Description
+#: ../templates:4001
+msgid ""
+"To create the list, run \"newlist mailman\" and follow the instructions on-"
+"screen. Note that you also need to start mailman after that, using /etc/"
+"init.d/mailman start."
+msgstr ""
+"Para criar a lista, corra \"newlist mailman\" e siga as instruções no ecrã. "
+"Note que após isso também tem de iniciar o mailman, utilizando /etc/init.d/"
+"mailman start."
+
+#. Type: select
+#. Description
+#: ../templates:5002
+msgid "Default language for Mailman:"
+msgstr "Idioma por omissão para o Mailman:"
+
+#. Type: select
+#. Description
+#: ../templates:5002
+msgid ""
+"The web page will be shown in this language, and in general, Mailman will "
+"use this language to communicate with the user."
+msgstr ""
+"A página web será mostrada neste idioma, e em geral, o Mailman irá utilizar "
+"este idioma para comunicar com o utilizador."
+
+#. Type: note
+#. Description
+#: ../templates:6001
+msgid "Old queue files present"
+msgstr "Estão presentes ficheiros da fila antiga"
+
+#. Type: note
+#. Description
+#: ../templates:6001
+msgid ""
+"The directory /var/lib/mailman/qfiles contains files. It needs to be empty "
+"for the upgrade to work properly. You can try to handle them by:\n"
+" - Stop new messages from coming in (at the MTA level).\n"
+" - Start a mailman queue runner: /etc/init.d/mailman start\n"
+" - Let it run until all messages are handled.\n"
+" If they don't all get handled in a timely manner, look at the logs\n"
+" to try to understand why and solve the cause.\n"
+" - Stop it: /etc/init.d/mailman stop\n"
+" - Retry the upgrade.\n"
+" - Let messages come in again.\n"
+"You can also decide to simply remove the files, which will make Mailman "
+"forget about (and lose) the corresponding emails."
+msgstr ""
+"O directório /var/lib/mailman/qfiles contém ficheiros. Necessita estar vazio "
+"para a actualização funcionar correctamente. Você pode lidar com eles assim:\n"
+" - Parar novas mensagens de entrar (ao nível do MTA).\n"
+" - Iniciar uma execução da fila do mailman: /etc/init.d/mailman start\n"
+" - Deixa-lo correr até as mensagens serem lidadas.\n"
+" Se não forem todos lidados a tempo, veja os logs para tentar perceber\n"
+" porquê e resolver a causa.\n"
+" - Para-lo: /etc/inid.d/mailman stop\n"
+" - Tentar novamente a actualização.\n"
+" - Deixar as mensagens entrar novamente.\n"
+"Pode também decidir simplesmente remover os ficheiros, o que fará o Mailman "
+"esquecer acerca (e perder) os mails correspondentes."
+
+#. Type: note
+#. Description
+#: ../templates:6001
+msgid ""
+"If these files correspond to shunted messages, you have to either delete "
+"them or unshunt them (with /var/lib/mailman/bin/unshunt). Shunted messages "
+"are messages on which Mailman has already abandoned any further processing "
+"because of an error condition, but that are kept for admin review. You can "
+"use /var/lib/mailman/bin/show_qfiles to examine the contents of the queues."
+msgstr ""
+"Se estes ficheiros correspondem a mensagens 'shunted', você tem de apagá-las "
+"ou fazer unshunt (com /var/lib/mailman/bin/unshunt). Mensagens 'shunted' "
+"são mensagens nas quais o Mailman já abandonou qualquer processamento por "
+"causa de uma condição de erro, mas são mantidas para revisão pelo "
+"administrador. Você pode utilizar var/lib/mailman/bin/show_qfiles para "
+"examinar o conteúdo das filas."
Added: branches/pkg-split/thijs/debian/pyversions
===================================================================
--- branches/pkg-split/thijs/debian/pyversions 2007-04-13 13:31:00 UTC (rev 491)
+++ branches/pkg-split/thijs/debian/pyversions 2007-04-19 13:24:59 UTC (rev 492)
@@ -0,0 +1 @@
+2.3-
Added: branches/pkg-split/thijs/debian/unicodify_archives.py
===================================================================
--- branches/pkg-split/thijs/debian/unicodify_archives.py 2007-04-13 13:31:00 UTC (rev 491)
+++ branches/pkg-split/thijs/debian/unicodify_archives.py 2007-04-19 13:24:59 UTC (rev 492)
@@ -0,0 +1,65 @@
+#! /usr/bin/python
+#
+# Copyright (C) 2007 Lionel Elie Mamane <lmamane at debian.org>
+#
+# 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 2
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+"""Convert a list's archive databases to unicode where appropriate
+
+This script is intended to be run as a bin/withlist script, i.e.
+
+% bin/withlist -l -r unicodify_archives <mylist>
+"""
+
+import paths
+import time
+from Mailman.i18n import _
+from Mailman import mm_cfg
+
+def unicodify_string(s):
+ if isinstance(s,unicode):
+ return s
+ elif isinstance(s,str):
+ try:
+ return s.decode()
+ except UnicodeDecodeError:
+ pass
+ try:
+ return s.decode('utf-8')
+ except UnicodeDecodeError:
+ pass
+ return s.decode('windows-1252', 'replace')
+
+def unicodify_fst(t):
+ l = list(t[1:])
+ l.insert(0, unicodify_string(t[0]))
+ return tuple(l)
+
+def unicodify_archives(mlist):
+ # Only act if we are using the internal archiver
+ if mm_cfg.PUBLIC_EXTERNAL_ARCHIVER:
+ return
+ else:
+ from Mailman.Archiver import HyperArch
+ h = HyperArch.HyperArchive(mlist)
+ for archive in h.archives:
+ for hdr in ('subject', 'author'):
+ h.database.mapKeys(unicodify_fst, archive, hdr)
+ h.close()
+
+
+
+if __name__ == '__main__':
+ print _(__doc__.replace('%', '%%'))
More information about the Pkg-mailman-hackers
mailing list