[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