 Mailman/Archiver/Archiver.py        |   29 
 Mailman/Archiver/HyperArch.py       |   18 
 Mailman/Archiver/pipermail.py       |   14 
 Mailman/Bouncers/BouncerAPI.py      |   12 
 Mailman/Bouncers/Caiwireless.py     |    2 
 Mailman/Bouncers/DSN.py             |   12 
 Mailman/Bouncers/GroupWise.py       |    4 
 Mailman/Bouncers/Microsoft.py       |    2 
 Mailman/Bouncers/Netscape.py        |    2 
 Mailman/Bouncers/Postfix.py         |    4 
 Mailman/Bouncers/Qmail.py           |   18 
 Mailman/Bouncers/SMTP32.py          |    8 
 Mailman/Bouncers/SimpleMatch.py     |   58 
 Mailman/Bouncers/SimpleWarning.py   |   12 
 Mailman/Cgi/admin.py                |    5 
 Mailman/Cgi/admindb.py              |    2 
 Mailman/Cgi/confirm.py              |    2 
 Mailman/Cgi/edithtml.py             |    2 
 Mailman/Cgi/listinfo.py             |    2 
 Mailman/Cgi/options.py              |    2 
 Mailman/Cgi/private.py              |    6 
 Mailman/Cgi/rmlist.py               |    5 
 Mailman/Cgi/roster.py               |    2 
 Mailman/Cgi/subscribe.py            |    2 
 Mailman/Defaults.py.in              |   81 -
 Mailman/Deliverer.py                |    5 
 Mailman/Gui/Digest.py               |    3 
 Mailman/Gui/General.py              |    2 
 Mailman/Gui/Privacy.py              |    2 
 Mailman/Gui/Topics.py               |    5 
 Mailman/HTMLFormatter.py            |    3 
 Mailman/Handlers/Approve.py         |    7 
 Mailman/Handlers/Cleanse.py         |   11 
 Mailman/Handlers/CookHeaders.py     |   35 
 Mailman/Handlers/Decorate.py        |   17 
 Mailman/Handlers/Hold.py            |    3 
 Mailman/Handlers/SMTPDirect.py      |    2 
 Mailman/Handlers/Scrubber.py        |   28 
 Mailman/Handlers/SpamDetect.py      |   19 
 Mailman/Handlers/Tagger.py          |    7 
 Mailman/Handlers/ToArchive.py       |   13 
 Mailman/Handlers/ToDigest.py        |   17 
 Mailman/ListAdmin.py                |    4 
 Mailman/MTA/Manual.py               |    4 
 Mailman/MTA/Postfix.py              |  127 +
 Mailman/MTA/Utils.py                |   18 
 Mailman/MailList.py                 |   83 -
 Mailman/Message.py                  |    2 
 Mailman/Queue/ArchRunner.py         |    2 
 Mailman/Queue/BounceRunner.py       |   21 
 Mailman/Queue/NewsRunner.py         |    8 
 Mailman/SecurityManager.py          |    8 
 Mailman/Site.py                     |   78 -
 Mailman/Utils.py                    |   49 
 Mailman/Version.py                  |   10 
 Mailman/i18n.py                     |   15 
 Makefile.in                         |    2 
 NEWS                                |   15 
 README                              |   17 
 TODO                                |    2 
 bin/Makefile.in                     |    2 
 bin/cleanarch                       |    7 
 bin/list_lists                      |    7 
 bin/mailmanctl                      |    9 
 bin/newlist                         |   22 
 bin/qrunner                         |   16 
 bin/show_qfiles                     |   23 
 bin/update                          |    1 
 configure.in                        |   84 -
 contrib/README.mmdsr                |   64 
 contrib/mmdsr                       |  118 -
 messages/Makefile.in                |   17 
 messages/docstring.files            |    4 
 messages/ja/doc/Defaults.py.in      |   82 -
 messages/ja/doc/mailman-install.tex |    4 
 messages/mailman.pot                | 2527 ++++++------------------------------
 messages/marked.files               |    3 
 misc/Makefile.in                    |   21 
 misc/paths.py.in                    |   16 
 templates/Makefile.in               |   15 
 tests/test_bounces.py               |   44 
 81 files changed, 1228 insertions(+), 2808 deletions(-)

diff -pru mailman-cvs-HEAD/bin/cleanarch mailman-2.1.7.cg/bin/cleanarch
--- mailman-cvs-HEAD/bin/cleanarch	2006-01-22 21:34:46.000000000 +0100
+++ mailman-2.1.7.cg/bin/cleanarch	2005-08-27 03:40:16.000000000 +0200
@@ -1,6 +1,6 @@
 #! @PYTHON@
 
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2003 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
@@ -14,8 +14,7 @@
 #
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Clean up an .mbox archive file.
 
@@ -60,7 +59,7 @@ cre = re.compile(mailbox.UnixMailbox._fr
 # From RFC 2822, a header field name must contain only characters from 33-126
 # inclusive, excluding colon.  I.e. from oct 41 to oct 176 less oct 072.  Must
 # use re.match() so that it's anchored at the beginning of the line.
-fre = re.compile(r'[\041-\071\073-\176]+')
+fre = re.compile(r'[\041-\071\073-\0176]+')
 
 
 
diff -pru mailman-cvs-HEAD/bin/list_lists mailman-2.1.7.cg/bin/list_lists
--- mailman-cvs-HEAD/bin/list_lists	2005-08-27 03:54:03.000000000 +0200
+++ mailman-2.1.7.cg/bin/list_lists	2006-02-22 10:28:36.000000000 +0100
@@ -108,13 +108,16 @@ def main():
     if not bare:
         print len(mlists), _('matching mailing lists found:')
 
-    format = '%%%ds - %%.%ds' % (longest, 77 - longest)
+    format = '%%%ds%%s - %%.%ds' % (longest, 77 - longest)
     for mlist in mlists:
         if bare:
             print mlist.internal_name()
         else:
             description = mlist.description or _('[no description available]')
-            print '   ', format % (mlist.real_name, description)
+            if '@' in mlist.internal_name():
+                print '   ', format % (mlist.real_name, '@', description)
+            else:
+                print '   ', format % (mlist.real_name, ' ', description)
 
 
 
diff -pru mailman-cvs-HEAD/bin/mailmanctl mailman-2.1.7.cg/bin/mailmanctl
--- mailman-cvs-HEAD/bin/mailmanctl	2006-02-05 05:45:31.000000000 +0100
+++ mailman-2.1.7.cg/bin/mailmanctl	2005-08-27 03:40:16.000000000 +0200
@@ -1,6 +1,6 @@
 #! @PYTHON@
 
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2004 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
@@ -14,8 +14,7 @@
 #
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Primary start-up and shutdown script for Mailman's qrunner daemon.
 
@@ -419,8 +418,8 @@ def main():
         os.setsid()
         # Instead of cd'ing to root, cd to the Mailman installation home
         os.chdir(mm_cfg.PREFIX)
-        # Set our file mode creation umask
-        os.umask(007)
+        # Clear our file mode creation umask
+        os.umask(0)
         # I don't think we have any unneeded file descriptors.
         #
         # Now start all the qrunners.  This returns a dictionary where the
diff -pru mailman-cvs-HEAD/bin/Makefile.in mailman-2.1.7.cg/bin/Makefile.in
--- mailman-cvs-HEAD/bin/Makefile.in	2005-12-06 05:18:52.000000000 +0100
+++ mailman-2.1.7.cg/bin/Makefile.in	2005-08-27 03:40:16.000000000 +0200
@@ -49,7 +49,7 @@ SCRIPTS=	mmsitepass newlist rmlist add_m
 		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 templ2pot.py po2templ.py
+		reset_pw.py
 
 BUILDDIR=	../build/bin
 
diff -pru mailman-cvs-HEAD/bin/newlist mailman-2.1.7.cg/bin/newlist
--- mailman-cvs-HEAD/bin/newlist	2005-08-28 07:41:46.000000000 +0200
+++ mailman-2.1.7.cg/bin/newlist	2006-03-10 12:52:10.000000000 +0100
@@ -73,6 +73,9 @@ where `mydom.ain' is the mail domain nam
 urlhost is not in the virtual host list, then mm_cfg.DEFAULT_EMAIL_HOST will
 be used for the email interface.
 
+NDIM XXX Ooops. How to keep this backward compatibility below? The
+vhost branch newlist is currently following a different model.
+
 For backward compatibility, you can also specify the domain to create your
 new list in by spelling the listname like so:
 
@@ -154,12 +157,23 @@ def main():
     else:
         listname = raw_input(_('Enter the name of the list: '))
     listname = listname.lower()
-
+    
     if '@' in listname:
         # note that --urlhost and --emailhost have precedence
-        listname, domain = listname.split('@', 1)
-        urlhost = urlhost or domain
-        emailhost = emailhost or mm_cfg.VIRTUAL_HOSTS.get(domain, domain)
+        firstname, domain = listname.split('@', 1)
+        urlhost = urlhost or ('lists.%s' % domain) # TODO: Not configurable yet
+        if not emailhost:
+            emailhost = domain
+        else:
+            usage(1, _('You cannot use an email host different from the domain part of the list name.'))
+        if not mm_cfg.VIRTUAL_HOSTS.has_key(urlhost):
+            _urlhost = repr(urlhost)
+            _emailhost = repr(emailhost)
+            usage(1, _('The Mailman config file lacks a line mapping urlhost to emailhost:\n  add_virtualhost(%(_urlhost)s,\n                  %(_emailhost)s)'))
+    else:
+        # Handle site wide lists (non-vhost lists, i.e. without '@' in their name)
+        # in the traditional manner.
+        pass
 
     urlhost = urlhost or mm_cfg.DEFAULT_URL_HOST
     host_name = emailhost or \
diff -pru mailman-cvs-HEAD/bin/qrunner mailman-2.1.7.cg/bin/qrunner
--- mailman-cvs-HEAD/bin/qrunner	2006-01-19 02:06:23.000000000 +0100
+++ mailman-2.1.7.cg/bin/qrunner	2005-08-27 03:40:16.000000000 +0200
@@ -1,6 +1,6 @@
 #! @PYTHON@
 
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001,2002 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
@@ -14,8 +14,7 @@
 #
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Run one or more qrunners, once or repeatedly.
 
@@ -67,9 +66,6 @@ Options:
 
 runner is required unless -l or -h is given, and it must be one of the names
 displayed by the -l switch.
-
-Note also that this script should be started up from mailmanctl as a normal
-operation.  It is only useful for debugging if it is run separately.
 """
 
 import sys
@@ -88,6 +84,8 @@ COMMASPACE = ', '
 # Flag which says whether we're running under mailmanctl or not.
 AS_SUBPROC = 0
 
+LogStdErr('error', 'qrunner', manual_reprime=0)
+
 
 
 def usage(code, msg=''):
@@ -214,12 +212,6 @@ def main():
     if len(runners) == 0:
         usage(1, _('No runner name given.'))
 
-    # Before we startup qrunners, we redirect the stderr to mailman syslog.
-    # We assume !AS_SUBPROC is running for debugging purpose and don't
-    # log errors in mailman logs/error but keep printing to stderr.
-    if AS_SUBPROC:
-        LogStdErr('error', 'qrunner', manual_reprime=0, tee_to_real_stderr=0)
-
     # Fast track for one infinite runner
     if len(runners) == 1 and not once:
         qrunner = make_qrunner(*runners[0])
diff -pru mailman-cvs-HEAD/bin/show_qfiles mailman-2.1.7.cg/bin/show_qfiles
--- mailman-cvs-HEAD/bin/show_qfiles	2006-03-10 11:36:03.000000000 +0100
+++ mailman-2.1.7.cg/bin/show_qfiles	2003-09-22 04:29:50.000000000 +0200
@@ -1,21 +1,4 @@
 #! @PYTHON@
-#
-# Copyright (C) 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
-# 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.
 
 """Show the contents of one or more Mailman queue files.
 
@@ -81,11 +64,7 @@ def main():
         fp = open(filename)
         if filename.endswith(".pck"):
             msg = load(fp)
-            data = load(fp)
-            if data.get('_parsemsg'):
-                sys.stdout.write(msg)
-            else:
-                sys.stdout.write(msg.as_string())
+            sys.stdout.write(msg.as_string())
         else:
             sys.stdout.write(fp.read())
 
diff -pru mailman-cvs-HEAD/bin/update mailman-2.1.7.cg/bin/update
--- mailman-cvs-HEAD/bin/update	2005-08-28 07:41:46.000000000 +0200
+++ mailman-2.1.7.cg/bin/update	2006-03-06 12:12:27.000000000 +0100
@@ -344,6 +344,7 @@ script.
     #
     tmpl_dir = os.path.join(mm_cfg.PREFIX, "templates")
     list_dir = os.path.join(mm_cfg.PREFIX, "lists")
+    # NDIM XXX internal_name
     b4_tmpl_dir = os.path.join(tmpl_dir, mlist._internal_name)
     new_tmpl_dir = os.path.join(list_dir, mlist._internal_name)
     if os.path.exists(b4_tmpl_dir):
diff -pru mailman-cvs-HEAD/configure.in mailman-2.1.7.cg/configure.in
--- mailman-cvs-HEAD/configure.in	2005-12-06 05:31:56.000000000 +0100
+++ mailman-2.1.7.cg/configure.in	2005-08-27 03:40:15.000000000 +0200
@@ -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: 2.46 $)
+AC_REVISION($Revision: 2.39.2.7 $)
 AC_PREREQ(2.0)
 AC_INIT(src/common.h)
 
@@ -273,7 +273,7 @@ rm -f conftest.out conftest.py])
 # Check for some other uid to use than `mailman'
 AC_MSG_CHECKING(for --with-username)
 AC_ARG_WITH(username, dnl
-[  --with-username      specify a user name other than "mailman"])
+[  --with-username      specify a user name other than \"mailman\"])
 
 if test -z "$with_username"
 then
@@ -303,7 +303,7 @@ AC_MSG_RESULT(okay)
 # Check for some other gid to use than `mailman'
 AC_MSG_CHECKING(for --with-groupname)
 AC_ARG_WITH(groupname, dnl
-[  --with-groupname     specify a group name other than "mailman"])
+[  --with-groupname     specify a group name other than \"mailman\"])
 
 if test -z "$with_groupname"
 then
@@ -507,57 +507,6 @@ fi
 AC_MSG_RESULT($URLHOST)
 rm -f conftest.out conftest.py
 
-# i18n --with-languages
-ALL_LINGUAS=`(cd ${srcdir}/messages && ls | grep '^..\(_..\)*$' | tr '\n' ' ')`
-AC_SUBST(LANGUAGES)
-AC_MSG_CHECKING(for --with-languages)
-AC_ARG_WITH(languages, dnl
-[  --with-languages     add i18n languages: specify "none" for English only.])
-if test -z "$with_languages"
-then
-      LANGUAGES="$ALL_LINGUAS"
-elif test "$with_languages" = "none"
-then
-      LANGUAGES=""
-else
-      LANGUAGES="$with_languages"
-fi
-AC_MSG_RESULT($with_languages)
-
-# check CJKCodecs
-AC_MSG_CHECKING(for CJK codecs)
-changequote(,)
-cat > conftest.py <<EOF
-langs = "$LANGUAGES".split()
-cset = {'ja': 'euc-jp', 'ko': 'euc-kr', 
-        'zh_CN': 'gb2312', 'zh_TW': 'big5'}
-s = 'Not required'
-for lang in cset.keys():
-    if lang in langs:
-        try:
-            s = unicode('OK', cset[lang]).encode('us-ascii')
-        except LookupError:
-            s = ''
-            break
-fp = open("conftest.out", "w")
-fp.write("%s\n" % s)
-fp.close()
-EOF
-changequote([, ])
-$PYTHON conftest.py
-cjkok=`cat conftest.out`
-rm -f conftest.out conftest.py
-if test -z "$cjkok"
-then
-    AC_MSG_ERROR([
-***** At least one of the CJK codecs missing!
-***** You have included ja, ko, or zh_* in --with-languages 
-***** but valid codecs are not installed. You should
-***** either install CJKCodecs from http://cjkpython.i18n.org/
-***** or use Python 2.4 in which CJK languages are supported.])
-fi
-AC_MSG_RESULT($cjkok)
-
 # Checks for libraries.
 AC_CHECK_FUNCS(strerror setregid syslog)
 if test $ac_cv_func_syslog = no; then
@@ -630,8 +579,6 @@ bin/version \
 bin/withlist \
 bin/b4b5-archfix \
 bin/rb-archfix \
-bin/templ2pot.py \
-bin/po2templ.py \
 contrib/check_perms_grsecurity.py \
 contrib/qmail-to-mailman.py \
 contrib/rotatelogs.py \
@@ -679,3 +626,28 @@ AC_OUTPUT([misc/paths.py Mailman/Default
 # Make sure all the build scripts are executable.
 chmod -R +x build
 
+# Test for the Chinese codecs.
+dnl AC_MSG_CHECKING(for Python Chinese Unicode codecs)
+dnl cat > conftest.py <<EOF
+dnl try:
+dnl   unicode("abc", "big5-tw")
+dnl   print "found"
+dnl except LookupError:
+dnl   print "not found"
+dnl EOF
+dnl chinese=`$PYTHON conftest.py 2>/dev/null`
+dnl rm -f conftest.py
+dnl AC_MSG_RESULT($chinese)
+dnl if test "x$chinese" != "xfound"
+dnl then
+dnl     AC_MSG_WARN([
+
+dnl ***** Python Unicode codecs for Chinese not found.
+dnl ***** Chinese emails generated by or manipulated in Mailman will not
+dnl ***** be sent in the correct encoding and may be unreadable.
+dnl ***** Please uncompress and install the Chinese codecs from:
+dnl ***** http://sourceforge.net/projects/python-codecs/
+dnl *****
+dnl ***** Note: Everything else will work just fine.
+dnl ])
+dnl fi
diff -pru mailman-cvs-HEAD/contrib/mmdsr mailman-2.1.7.cg/contrib/mmdsr
--- mailman-cvs-HEAD/contrib/mmdsr	2006-01-29 18:41:37.000000000 +0100
+++ mailman-2.1.7.cg/contrib/mmdsr	2005-12-25 04:21:56.000000000 +0100
@@ -112,43 +112,6 @@
 #		Adrian discovered that there was a log file format
 #		change between Mailman 2.1.5 and 2.1.6, which broke
 #		hourly statistics.
-#
-# 0.0.13	Update by Brad Knowles <brad@stop.mail-abuse.org>
-#		Updated on: Mon Dec 26 05:54:27 CET 2005
-#		Bugs found by Tom G. Christensen (tgc99):
-#		> ps output on solaris is full of whitespace but a further
-#		> echo get's rid of it.
-#		> The lines in the smtp log are sometimes broken up by a
-#		> newline (right before the msgid) which throws of the
-#		> summary. Piping it through sed first will rejoin the broken
-#		> lines.
-#		> Use $AWK instead of awk.
-#		Enhancements from Mark Sapiro:
-#		> The vette log summary lists posts held for moderation
-#		> individually under "Other Errors:". The following patch
-#		> (watch out for wrapped lines) summarizes them by list instead.
-#
-# 0.0.14	Update by Brad Knowles <brad@stop.mail-abuse.org>
-#		Updated on: Thu Dec 29 08:17:38 CET 2005
-#		Added code to check /usr/local/mailman/data for
-#		moderation hold queue
-#
-# 0.0.15	Update by Brad Knowles <brad@stop.mail-abuse.org>
-#		Updated on: Thu Jan 26 02:39:38 CET 2006
-#		Tweaked display of summary data in the "smtp-failure" log,
-#		and "other" category in the "vette" log, so as to reduce
-#		the spewage when things go wonky, mostly by removing
-#		unique-ifying data like message-id or sender address.
-#		Also tweaked moderation queue information, to tell us
-#		how many Python pickle files are in the data directory,
-#		as opposed to just doing a directory listing and skipping
-#		the files in the middle if there are too many -- now we
-#		know how many are being skipped.
-#
-# 0.0.16	Update by Brad Knowles <brad@stop.mail-abuse.org>
-#		Updated on: Sun Jan 29 11:45:58 CET 2006
-#		Mark found a couple of typos that I somehow let slip
-#		through.  Thanks!
 
 ###############################################################################
 # Set up locations of standard commands, directories, etc....
@@ -193,19 +156,9 @@ QUEUEDIR="/usr/local/mailman/qfiles"
 LOGDIR="/usr/local/mailman/logs"
 
 ###############################################################################
-# Mailman data directory
-###############################################################################
-DATADIR="/usr/local/mailman/data"
-
-###############################################################################
 # Maximum number of subdirectory entries to display in report
 ###############################################################################
-MAX_QUEUE_LINES=20
-
-###############################################################################
-# Maximum number of moderation queue pickle files to display in report
-###############################################################################
-MAX_DATA_LINES=100
+MAX_LINES=20
 
 ###############################################################################
 # Mailman Log files to check for errors.
@@ -229,8 +182,8 @@ SUBDIRS="archive bounces commands in new
 # Specify sender address for report.  Not used if recipient list is empty.
 ###############################################################################
 
-SENDER="INSERT.YOUR.SENDER.ADDRESS@HERE"
-RCPTS="INSERT.YOUR.RECIPIENTS.ADDRESSES@HERE"
+SENDER="put@your.address.here"
+RCPTS="put@the.address.of,your@recipients.here"
 
 ###############################################################################
 # If you run this program in cron at 23:59:00, you need to sleep sixty
@@ -250,8 +203,7 @@ SLEEPTIME=60
 #	there is an easier cross-platform way to do it, please let me know.
 ###############################################################################
 
-GRABUID=`$PS -o user -p $$ | $TAIL -1`
-MYUID=`echo $GRABUID`
+MYUID=`$PS -o user -p $$ | $TAIL -1`
 RUNAS="mailman"
 
 ###############################################################################
@@ -302,9 +254,9 @@ do
     $TOUCH $TMPLOG
     echo "Log file: $LOG" >> $TMP
     echo "==============================" >> $TMP
+    $GREP -si "^$DAY [0-9][0-9:]* $YEAR" $LOGDIR/$LOG >> $TMPLOG
 
     if [ -f "$LOGDIR/${LOG}" ] ; then
-    $SED -e :a -e '$!N;s/\n //;ta' -e 'P;D' $LOGDIR/$LOG | $GREP -si "^$DAY [0-9][0-9:]* $YEAR" >> $TMPLOG
 
 	if [ "${LOG}" = "post" ] ; then
 
@@ -312,7 +264,7 @@ do
 	    echo "Hourly Summary of Posts" >> $TMP
 	    echo "-----------------------" >> $TMP
 
-	    $SED -e 's/^[A-Z][a-z][a-z] *[0-9]* //' -e 's/:.*$//' $TMPLOG | $UNIQ -c | $SORT -n +1 | $AWK '{ printf( "%8d  %02d:00-%02d:59\n", $1, $2, $2 ) }' >> $TMP
+	    $SED -e 's/^[A-Z][a-z][a-z] *[0-9]* //' -e 's/:.*$//' $TMPLOG | $UNIQ -c | $SORT -n +1 | awk '{ printf( "%8d  %02d:00-%02d:59\n", $1, $2, $2 ) }' >> $TMP
 
 	    echo "" >> $TMP
 	    echo "Post Count by List" >> $TMP
@@ -343,7 +295,7 @@ do
 	    echo "" >> $TMP
 	    echo "Hourly Summary of Messages Sent" >> $TMP
 	    echo "-------------------------------" >> $TMP
-	    $SED -e 's/^[A-Z][a-z][a-z] *[0-9]* //' -e 's/:.* for / /' -e 's/ recips,.*$//' $TMPLOG | $AWK '{ val=int($1); sum[val]+=$2 } END { for (i=0; i<24; i++) { printf "%8d %02d:00-%02d:59\n", sum[i], i, i } }' >> $TMP
+	    $SED -e 's/^[A-Z][a-z][a-z] *[0-9]* //' -e 's/:.* for / /' -e 's/ recips,.*$//' $TMPLOG | awk '{ val=int($1); sum[val]+=$2 } END { for (i=0; i<24; i++) { printf "%8d %02d:00-%02d:59\n", sum[i], i, i } }' >> $TMP
 
 	else
 
@@ -464,18 +416,9 @@ do
 	    $GREP -i 'Posting to a moderated newsgroup' $TMPLOG | $AWK '{ print $6 }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
 
 	    echo "" >> $TMP
-	    echo "Post to moderated list (by list):" >> $TMP
-	    echo "------------------------------" >> $TMP
-	    $GREP -i 'Post to moderated list' $TMPLOG | $AWK '{ print $6 }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
-
-	    echo "" >> $TMP
 	    echo "Other Errors:" >> $TMP
 	    echo "------------------------------" >> $TMP
-	    $EGREP -vi '(Post by non-member|suspicious header|message approved|Discarded posting|bulk message discarded|junk message discarded|Message has implicit destination|Posting to a moderated newsgroup|Post to moderated list|Message discarded, msgid)' $TMPLOG | $SED -e 's/^.* ([0-9]*) //' -e 's/, message-id=<[^> ]*>:/:/' | $SORT | $UNIQ -c | $SORT -nr >> $TMP 
-
-	elif [ "${LOG}" = "smtp-failure" ] ; then
-
-	    $SED 's/^.* ([0-9]*) //' $TMPLOG | $SED 's/delivery to [^@ ]*@[^@ ]* failed with code/delivery failed with code/g' | $SORT | $UNIQ -c | $SORT -nr >> $TMP 
+	    $EGREP -vi '(Post by non-member|suspicious header|message approved|Discarded posting|bulk message discarded|junk message discarded|Message has implicit destination|Posting to a moderated newsgroup|Message discarded, msgid)' $TMPLOG | $SED 's/^.* ([0-9]*) //' | $SORT | $UNIQ -c | $SORT -nr >> $TMP 
 
 	else
 
@@ -503,7 +446,7 @@ do
     $RM -f $TMPLOG
     $TOUCH $TMPLOG
     $LS -la $DIR >> $TMPLOG
-    LINES=`$WC -l < $TMPLOG`
+    LINES=`wc -l < $TMPLOG`
     LINES=`expr $LINES - 3`
 
     echo "Subdirectory: $DIR" >> $TMP
@@ -511,12 +454,12 @@ do
     echo "Entries: $LINES" >> $TMP
     echo "------------------------------" >> $TMP
 
-    if [ $LINES -le $MAX_QUEUE_LINES ] ; then
+    if [ $LINES -le $MAX_LINES ] ; then
     	$CAT $TMPLOG >> $TMP
     else
     	$HEAD $TMPLOG >> $TMP
 	echo "" >> $TMP
-	echo "	More than $MAX_QUEUE_LINES total entries, skipping ..." >> $TMP
+	echo "	More than $MAX_LINES total entries, skipping ..." >> $TMP
 	echo "" >> $TMP
     	$TAIL $TMPLOG >> $TMP
     fi
@@ -524,45 +467,6 @@ do
 
 done
 
-echo "******************************" >> $TMP
-echo "Data Directory Contents" >> $TMP
-echo "	(Python pickle files only)" >> $TMP
-echo "******************************" >> $TMP
-
-cd $DATADIR
-
-$RM -f $TMPLOG
-$TOUCH $TMPLOG
-$LS -la | $GREP -i '\.pck$' >> $TMPLOG
-LINES=`$WC -l < $TMPLOG`
-
-echo "Python pickle files: $LINES" >> $TMP
-echo "==============================" >> $TMP
-echo "" >> $TMP
-
-if [ $LINES -le $MAX_DATA_LINES ] ; then
-    $CAT $TMPLOG >> $TMP
-else
-    $HEAD $TMPLOG >> $TMP
-    echo "" >> $TMP
-    echo "	More than $MAX_DATA_LINES total entries, skipping ..." >> $TMP
-    echo "" >> $TMP
-    $TAIL $TMPLOG >> $TMP
-fi
-echo "" >> $TMP
-
-echo "******************************" >> $TMP
-echo "Moderation Queue Summary" >> $TMP
-echo "******************************" >> $TMP
-echo "" >> $TMP
-
-$AWK '{ print $NF }' $TMPLOG | $GREP -i '^heldmsg-' | $SED -e 's/^heldmsg-//' -e 's/-[0-9]*\.pck$//' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
-echo "" >> $TMP
-
-###############################################################################
-# Okay, we're done with all the code stuff, now handle the output
-###############################################################################
-
 if [ "${RCPTS}x" != "x" ] ; then
     $SENDMAIL -t -f$SENDER < $TMP
 else
diff -pru mailman-cvs-HEAD/contrib/README.mmdsr mailman-2.1.7.cg/contrib/README.mmdsr
--- mailman-cvs-HEAD/contrib/README.mmdsr	2006-01-29 18:41:37.000000000 +0100
+++ mailman-2.1.7.cg/contrib/README.mmdsr	2005-12-30 19:58:15.000000000 +0100
@@ -5,41 +5,31 @@ for mailman.  It was initially posted at
 <http://sourceforge.net/tracker/index.php?func=detail&aid=1123383&group_id=103&atid=300103>
 which see for possible patches and other enhancements.
 
-Here goes the original mmdsr.readme by Brad ...
+It is intended that there will be a 'cleaner', more complete readme file in
+the future.  In the interim, here are Brad's original comments.
 
-========================================================================
-This is a basic Bourne shell script that I quickly hacked together for
-my own purposes, designed to be fired off at 23:59 every night, going
-through a variety of Mailman log files looking for entries specific
-to that date, summarizing the activities, and indicating problems or
-certain types of activity that might be of interest to someone trying
-to administer the server.
-
-It also does an "ls -la" of /usr/local/mailman/qfiles/*, so that you
-can see what is in the queue at the time of the execution of the script.
-
-This daily report will get e-mailed to the admin, or posted to a "reports"
-mailing list, where they can be archived and kept for future reference.
-If you don't define an address where the output e-mail should be sent,
-it will instead be printed to the standard output (thus allowing you to
-do something else with it).
-
-
-Once I'd gone through a few revisions of my own on this tool, I
-thought that I would release the code to the public and get comments
-and suggestions from others in the Mailman community.  This program is
-currently being used actively on the mail servers for python.org (where
-the mailman-users and other Mailman-related mailing lists are hosted),
-as well as many others.
-
-Note that this script needs to be configured once to know where standard
-commands are located, where log files are kept, etc... (see the top
-500 lines or so of the script), but after that you don't need to feed
-it any input, or capture the output to be sent anywhere.  This script
-takes care of all of that.  All you should need to do is to call this
-script from a cron job at 23:59 (local time) every night.
-
-
-When looking at this script, perhaps during configuration, please keep
-in mind that it is heavily commented at the top, and everything should
-hopefully be self-evident.
+I quickly whacked together a Daily Status Report script for Mailman (using
+Bourne shell, not Python ;), and thought that other folks might be interested
+in seeing it.
+
+The basic concept is a program that gets fired off at 23:59 every night, and
+goes through a variety of log files looking for entries specific to that date,
+and indicating problems or certain types of activity that might be of interest
+to someone trying to administer the server.  It also does an "ls -la" of
+/usr/local/mailman/qfiles/*, so that you can see what is in the queue at the
+time of the running of the script.
+
+My concept was that this daily report would get e-mailed to the admin, or
+posted to a "reports" mailing list, where they could be archived and kept for
+future reference.
+
+The script does not (yet) do any statistics calculations, although it should
+be relatively easy to hack together some basic stats using awk, sort, etc....
+
+Anyway, I thought I'd share it and let folks take a look at it, and if anyone
+has any recommended improvements, we can incorporate those and share them back
+out with everyone.
+
+The code is written under a BSD-style license, so if you don't want to
+contribute any changes back to me, that's okay. Of course, I would prefer that
+you did, but I leave the choice up to you.
diff -pru mailman-cvs-HEAD/Mailman/Archiver/Archiver.py mailman-2.1.7.cg/Mailman/Archiver/Archiver.py
--- mailman-cvs-HEAD/Mailman/Archiver/Archiver.py	2005-08-28 07:31:26.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Archiver/Archiver.py	2006-03-08 18:05:58.000000000 +0100
@@ -24,7 +24,6 @@ archival.
 
 import os
 import errno
-import traceback
 import re
 from cStringIO import StringIO
 
@@ -46,6 +45,17 @@ except NameError:
 
 def makelink(old, new):
     try:
+        # Before symlinking, make sure that the directory where the
+        # symlink will be created exists.
+        omask = os.umask(0)
+        try:
+            try:
+                os.makedirs(os.path.split(new)[0], 02775)
+            except OSError, e:
+                if e.errno <> errno.EEXIST:
+                    raise
+        finally:
+            os.umask(omask)
         os.symlink(old, new)
     except OSError, e:
         if e.errno <> errno.EEXIST:
@@ -80,9 +90,17 @@ class Archiver:
         #             listname.mbox
         #         listname/
         #             lots-of-pipermail-stuff
+        #         domain.com/
+        #             listname.mbox/
+        #                 listname.mbox
+        #             listname/
+        #                 lots-of-pipermail-stuff
         #     public/
         #         listname.mbox@ -> ../private/listname.mbox
         #         listname@ -> ../private/listname
+        #         domain.com/
+        #             listname.mbox@ -> ../../private/listname.mbox
+        #             listname@ -> ../../private/listname
         #
         # IOW, the mbox and pipermail archives are always stored in the
         # private archive for the list.  This is safe because archives/private
@@ -93,7 +111,7 @@ class Archiver:
         omask = os.umask(0)
         try:
             try:
-                os.mkdir(self.archive_dir()+'.mbox', 02775)
+                os.makedirs(self.archive_dir()+'.mbox', 02775)
             except OSError, e:
                 if e.errno <> errno.EEXIST: raise
                 # We also create an empty pipermail archive directory into
@@ -101,7 +119,7 @@ class Archiver:
                 # that lists that have not yet received a posting have
                 # /something/ as their index.html, and don't just get a 404.
             try:
-                os.mkdir(self.archive_dir(), 02775)
+                os.makedirs(self.archive_dir(), 02775)
             except OSError, e:
                 if e.errno <> errno.EEXIST: raise
             # See if there's an index.html file there already and if not,
@@ -132,8 +150,7 @@ class Archiver:
 
     def ArchiveFileName(self):
         """The mbox name where messages are left for archive construction."""
-        return os.path.join(self.archive_dir() + '.mbox',
-                            self.internal_name() + '.mbox')
+        return Site.get_mboxpath(self.internal_name())
 
     def GetBaseArchiveURL(self):
         url = self.GetScriptURL('private', absolute=1) + '/'
@@ -143,7 +160,7 @@ class Archiver:
             hostname = re.match('[^:]*://([^/]*)/.*', url).group(1)\
                        or mm_cfg.DEFAULT_URL_HOST
             url = mm_cfg.PUBLIC_ARCHIVE_URL % {
-                'listname': self.internal_name(),
+                'listname': self.local_part,
                 'hostname': hostname
                 }
             if not url.endswith('/'):
diff -pru mailman-cvs-HEAD/Mailman/Archiver/HyperArch.py mailman-2.1.7.cg/Mailman/Archiver/HyperArch.py
--- mailman-cvs-HEAD/Mailman/Archiver/HyperArch.py	2006-01-29 06:13:57.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Archiver/HyperArch.py	2006-03-10 10:36:33.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
@@ -52,6 +52,7 @@ from Mailman import i18n
 from Mailman.SafeDict import SafeDict
 from Mailman.Logging.Syslog import syslog
 from Mailman.Mailbox import ArchiverMailbox
+from Mailman import Site
 
 # Set up i18n.  Assume the current language has already been set in the caller.
 _ = i18n._
@@ -304,7 +305,12 @@ class Article(pipermail.Article):
             if charset[0]=="'" and charset[-1]=="'":
                 charset = charset[1:-1]
             try:
-                body = message.get_payload(decode=True)
+                # Check Scrubber-munged payload
+                if message.get('x-mailman-scrubbed'):
+                    decode = False
+                else:
+                    decode = True
+                body = message.get_payload(decode=decode)
             except binascii.Error:
                 body = None
             if body and charset != Utils.GetCharSet(self._lang):
@@ -748,11 +754,11 @@ class HyperArchive(pipermail.T):
 
     def html_TOC(self):
         mlist = self.maillist
-        listname = mlist.internal_name()
-        mbox = os.path.join(mlist.archive_dir()+'.mbox', listname+'.mbox')
+        local_part = mlist.local_part
+        mbox = Site.get_mboxpath(mlist.internal_name())
         d = {"listname": mlist.real_name,
              "listinfo": mlist.GetScriptURL('listinfo', absolute=1),
-             "fullarch": '../%s.mbox/%s.mbox' % (listname, listname),
+             "fullarch": '../%s.mbox/%s.mbox' % (local_part, local_part), # NDIM XXX Path
              "size": sizeof(mbox, mlist.preferred_language),
              'meta': '',
              }
@@ -830,7 +836,7 @@ class HyperArchive(pipermail.T):
             return 1
         self._lock_file = LockFile.LockFile(
             os.path.join(mm_cfg.LOCK_DIR,
-                         self.maillist.internal_name() + '-arch.lock'))
+                         self.maillist.internal_name() + '-arch.lock')) # NDIM XXX Lock
         try:
             self._lock_file.lock(timeout=0.5)
         except LockFile.TimeOutError:
diff -pru mailman-cvs-HEAD/Mailman/Archiver/pipermail.py mailman-2.1.7.cg/Mailman/Archiver/pipermail.py
--- mailman-cvs-HEAD/Mailman/Archiver/pipermail.py	2006-01-29 06:13:57.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Archiver/pipermail.py	2005-12-26 02:22:08.000000000 +0100
@@ -21,6 +21,13 @@ from Mailman.Mailbox import ArchiverMail
 from Mailman.Logging.Syslog import syslog
 from Mailman.i18n import _
 
+# True/False
+try:
+    True, False
+except NameError:
+    True = 1
+    False = 0
+
 SPACE = ' '
 
 
@@ -217,7 +224,12 @@ class Article:
                 self.headers[i] = message[i]
 
         # Read the message body
-        s = StringIO(message.get_payload(decode=True)\
+        # Check Scrubber-munged paylaod
+        if message.get('x-mailman-scrubbed'):
+            decode = False
+        else:
+            decode = True
+        s = StringIO(message.get_payload(decode=decode)\
                      or message.as_string().split('\n\n',1)[1])
         self.body = s.readlines()
 
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/BouncerAPI.py mailman-2.1.7.cg/Mailman/Bouncers/BouncerAPI.py
--- mailman-cvs-HEAD/Mailman/Bouncers/BouncerAPI.py	2006-03-01 03:34:54.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/BouncerAPI.py	2005-08-27 03:40:15.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998,1999,2000,2001,2002 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
@@ -12,8 +12,7 @@
 #
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Contains all the common functionality for msg bounce scanning API.
 
@@ -63,7 +62,10 @@ def ScanMessages(mlist, msg):
         modname = 'Mailman.Bouncers.' + module
         __import__(modname)
         addrs = sys.modules[modname].process(msg)
-        if addrs:
-            # Return addrs even if it is Stop. BounceRunner needs this info.
+        if addrs is Stop:
+            # One of the detectors recognized the bounce, but there were no
+            # addresses to extract.  Return the empty list.
+            return []
+        elif addrs:
             return addrs
     return []
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/Caiwireless.py mailman-2.1.7.cg/Mailman/Bouncers/Caiwireless.py
--- mailman-cvs-HEAD/Mailman/Bouncers/Caiwireless.py	2006-03-10 11:36:00.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/Caiwireless.py	2005-08-27 03:40:15.000000000 +0200
@@ -27,7 +27,7 @@ acre = re.compile(r'<(?P<addr>[^>]*)>')
 
 
 def process(msg):
-    if msg.get_content_type() <> 'multipart/mixed':
+    if msg.get_type() <> 'multipart/mixed':
         return None
     # simple state machine
     #     0 == nothing seen
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/DSN.py mailman-2.1.7.cg/Mailman/Bouncers/DSN.py
--- mailman-cvs-HEAD/Mailman/Bouncers/DSN.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/DSN.py	2005-08-27 03:40:15.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2003 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
@@ -12,8 +12,7 @@
 #
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Parse RFC 3464 (i.e. DSN) bounce formats.
 
@@ -53,10 +52,9 @@ def check(msg):
             #
             # Also grok out Action so we can do something with that too.
             action = msgblock.get('action', '').lower()
-            # Some MTAs have been observed that put comments on the action.
-            if action.startswith('delayed'):
+            if action == 'delayed':
                 return Stop
-            if not action.startswith('fail'):
+            if action not in ('failed', 'failure'):
                 # Some non-permanent failure, so ignore this block
                 continue
             params = []
@@ -85,6 +83,6 @@ def process(msg):
     # The report-type parameter should be "delivery-status", but it seems that
     # some DSN generating MTAs don't include this on the Content-Type: header,
     # so let's relax the test a bit.
-    if not msg.is_multipart() or msg.get_content_subtype() <> 'report':
+    if not msg.is_multipart() or msg.get_subtype() <> 'report':
         return None
     return check(msg)
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/GroupWise.py mailman-2.1.7.cg/Mailman/Bouncers/GroupWise.py
--- mailman-cvs-HEAD/Mailman/Bouncers/GroupWise.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/GroupWise.py	2005-08-27 03:40:15.000000000 +0200
@@ -30,7 +30,7 @@ acre = re.compile(r'<(?P<addr>[^>]*)>')
 
 
 def find_textplain(msg):
-    if msg.get_content_type() == 'text/plain':
+    if msg.get_type(msg.get_default_type()) == 'text/plain':
         return msg
     if msg.is_multipart:
         for part in msg.get_payload():
@@ -44,7 +44,7 @@ def find_textplain(msg):
 
 
 def process(msg):
-    if msg.get_content_type() <> 'multipart/mixed' or not msg['x-mailer']:
+    if msg.get_type() <> 'multipart/mixed' or not msg['x-mailer']:
         return None
     addrs = {}
     # find the first text/plain part in the message
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/Microsoft.py mailman-2.1.7.cg/Mailman/Bouncers/Microsoft.py
--- mailman-cvs-HEAD/Mailman/Bouncers/Microsoft.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/Microsoft.py	2005-08-27 03:40:15.000000000 +0200
@@ -25,7 +25,7 @@ scre = re.compile(r'transcript of sessio
 
 
 def process(msg):
-    if msg.get_content_type() <> 'multipart/mixed':
+    if msg.get_type() <> 'multipart/mixed':
         return None
     # Find the first subpart, which has no MIME type
     try:
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/Netscape.py mailman-2.1.7.cg/Mailman/Bouncers/Netscape.py
--- mailman-cvs-HEAD/Mailman/Bouncers/Netscape.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/Netscape.py	2005-08-27 03:40:15.000000000 +0200
@@ -61,7 +61,7 @@ def process(msg):
     leaves = []
     flatten(msg, leaves)
     for i, subpart in zip(range(len(leaves)-1), leaves):
-        if subpart.get_content_type() == 'text/plain':
+        if subpart.get_type() == 'text/plain':
             plainmsg = subpart
             break
     if not plainmsg:
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/Postfix.py mailman-2.1.7.cg/Mailman/Bouncers/Postfix.py
--- mailman-cvs-HEAD/Mailman/Bouncers/Postfix.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/Postfix.py	2005-08-27 03:40:15.000000000 +0200
@@ -71,14 +71,14 @@ def findaddr(msg):
 
 
 def process(msg):
-    if msg.get_content_type() not in ('multipart/mixed', 'multipart/report'):
+    if msg.get_type() not in ('multipart/mixed', 'multipart/report'):
         return None
     # We're looking for the plain/text subpart with a Content-Description: of
     # `notification'.
     leaves = []
     flatten(msg, leaves)
     for subpart in leaves:
-        if subpart.get_content_type() == 'text/plain' and \
+        if subpart.get_type() == 'text/plain' and \
            subpart.get('content-description', '').lower() == 'notification':
             # then...
             return findaddr(subpart)
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/Qmail.py mailman-2.1.7.cg/Mailman/Bouncers/Qmail.py
--- mailman-cvs-HEAD/Mailman/Bouncers/Qmail.py	2006-03-01 03:34:54.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/Qmail.py	2005-08-27 03:40:15.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998,1999,2000,2001,2002 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
@@ -12,8 +12,7 @@
 # 
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Parse bounce messages generated by qmail.
 
@@ -29,11 +28,7 @@ This module should be conformant.
 import re
 import email.Iterators
 
-# Other (non-standard?) intros have been observed in the wild.
-introtags = [
-    'Hi. This is the',
-    "We're sorry. There's a problem"
-    ]
+introtag = 'Hi. This is the'
 acre = re.compile(r'<(?P<addr>[^>]*)>:')
 
 
@@ -47,11 +42,8 @@ def process(msg):
     state = 0
     for line in email.Iterators.body_line_iterator(msg):
         line = line.strip()
-        if state == 0:
-            for introtag in introtags:
-                if line.startswith(introtag):
-                    state = 1
-                    break
+        if state == 0 and line.startswith(introtag):
+            state = 1
         elif state == 1 and not line:
             # Looking for the end of the intro paragraph
             state = 2
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/SimpleMatch.py mailman-2.1.7.cg/Mailman/Bouncers/SimpleMatch.py
--- mailman-cvs-HEAD/Mailman/Bouncers/SimpleMatch.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/SimpleMatch.py	2006-02-21 07:21:11.000000000 +0100
@@ -78,31 +78,7 @@ PATTERNS = [
     # Prodigy.net full mailbox
     (_c("User's mailbox is full:"),
      _c('Unable to deliver mail.'),
-     _c("User's mailbox is full:\s*<(?P<addr>[^>]*)>")),
-    # Microsoft SMTPSVC
-    (_c('The email below could not be delivered to the following user:'),
-     _c('Old message:'),
-     _c('<(?P<addr>[^>]*)>')),
-    # Yahoo on behalf of other domains like sbcglobal.net
-    (_c('Unable to deliver message to the following address\(es\)\.'),
-     _c('--- Original message follows\.'),
-     _c('<(?P<addr>[^>]*)>:')),
-    # kundenserver.de
-    (_c('A message that you sent could not be delivered'),
-     _c('^--- The header of the original'),
-     _c('<(?P<addr>[^>]*)>')),
-    # another kundenserver.de
-    (_c('A message that you sent could not be delivered'),
-     _c('^--- The header of the original'),
-     _c('^(?P<addr>[^\s@]+@[^\s@:]+):')),
-    # thehartford.com
-    (_c('Delivery to the following recipients failed'),
-     _c("Bogus - there actually isn't anything"),
-     _c('^\s*(?P<addr>[^\s@]+@[^\s@]+)\s*$')),
-    # and another thehartfod.com/hartfordlife.com
-    (_c('^Your message'),
-     _c('^because:'),
-     _c('^\s*(?P<addr>[^\s@]+@[^\s@]+)\s*$')),
+     _c("User's mailbox is full:\s*<(?P<addr>.*)>.*$")),
     # Next one goes here...
     ]
 
@@ -115,27 +91,19 @@ def process(msg, patterns=None):
     #     0 = nothing seen yet
     #     1 = intro seen
     addrs = {}
-    # MAS: This is a mess. The outer loop used to be over the message
-    # so we only looped through the message once.  Looping through the
-    # message for each set of patterns is obviously way more work, but
-    # if we don't do it, problems arise because scre from the wrong
-    # pattern set matches first and then acre doesn't match.  The
-    # alternative is to split things into separate modules, but then
-    # we process the message multiple times anyway.
-    for scre, ecre, acre in patterns:
-        state = 0
-        for line in email.Iterators.body_line_iterator(msg):
-            if state == 0:
+    state = 0
+    for line in email.Iterators.body_line_iterator(msg):
+        if state == 0:
+            for scre, ecre, acre in patterns:
                 if scre.search(line):
                     state = 1
-            if state == 1:
-                mo = acre.search(line)
-                if mo:
-                    addr = mo.group('addr')
-                    if addr:
-                        addrs[mo.group('addr')] = 1
-                elif ecre.search(line):
                     break
-        if addrs:
-            break
+        if state == 1:
+            mo = acre.search(line)
+            if mo:
+                addr = mo.group('addr')
+                if addr:
+                    addrs[mo.group('addr')] = 1
+            elif ecre.search(line):
+                break
     return addrs.keys()
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/SimpleWarning.py mailman-2.1.7.cg/Mailman/Bouncers/SimpleWarning.py
--- mailman-cvs-HEAD/Mailman/Bouncers/SimpleWarning.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/SimpleWarning.py	2005-08-27 03:40:15.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001,2002 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
@@ -12,12 +12,10 @@
 # 
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Recognizes simple heuristically delimited warnings."""
 
-from Mailman.Bouncers.BouncerAPI import Stop
 from Mailman.Bouncers.SimpleMatch import _c
 from Mailman.Bouncers.SimpleMatch import process as _process
 
@@ -43,8 +41,4 @@ patterns = [
 
 
 def process(msg):
-    if _process(msg, patterns):
-        # It's a recognized warning so stop now
-        return Stop
-    else:
-        return []
+    return _process(msg, patterns)
diff -pru mailman-cvs-HEAD/Mailman/Bouncers/SMTP32.py mailman-2.1.7.cg/Mailman/Bouncers/SMTP32.py
--- mailman-cvs-HEAD/Mailman/Bouncers/SMTP32.py	2006-02-05 20:47:33.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Bouncers/SMTP32.py	2005-08-27 03:40:15.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998,1999,2000,2001,2002 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
@@ -12,8 +12,7 @@
 # 
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Something which claims
 X-Mailer: <SMTP32 vXXXXXX>
@@ -36,8 +35,7 @@ acre = re.compile(r'''
     (                                             # several different prefixes
     user\ mailbox[^:]*:                           # have been spotted in the
     |delivery\ failed[^:]*:                       # wild...
-    |unknown\ user[^:]*:
-    |undeliverable\ +to
+    |undeliverable\ to
     )
     \s*                                           # space separator
     (?P<addr>.*)                                  # and finally, the address
diff -pru mailman-cvs-HEAD/Mailman/Cgi/admindb.py mailman-2.1.7.cg/Mailman/Cgi/admindb.py
--- mailman-cvs-HEAD/Mailman/Cgi/admindb.py	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Cgi/admindb.py	2006-03-10 16:07:26.000000000 +0100
@@ -81,7 +81,7 @@ def main():
         handle_no_list()
         return
 
-    listname = parts[0].lower()
+    listname = Utils.GetListName(parts)
     try:
         mlist = MailList.MailList(listname, lock=0)
     except Errors.MMListError, e:
diff -pru mailman-cvs-HEAD/Mailman/Cgi/admin.py mailman-2.1.7.cg/Mailman/Cgi/admin.py
--- mailman-cvs-HEAD/Mailman/Cgi/admin.py	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Cgi/admin.py	2006-03-10 16:07:19.000000000 +0100
@@ -65,8 +65,9 @@ def main():
         # None, so just do the admin overview and be done with it
         admin_overview()
         return
+
     # Get the list object
-    listname = parts[0].lower()
+    listname = Utils.GetListName(parts)
     try:
         mlist = MailList.MailList(listname, lock=0)
     except Errors.MMListError, e:
@@ -418,7 +419,7 @@ def show_results(mlist, doc, category, s
                        '<br>&nbsp;<br>')
     # We do not allow through-the-web deletion of the site list!
     if mm_cfg.OWNERS_CAN_DELETE_THEIR_OWN_LISTS and \
-           mlist.internal_name() <> mm_cfg.MAILMAN_SITE_LIST:
+           mlist.local_name <> mm_cfg.MAILMAN_SITE_LIST:
         otherlinks.AddItem(Link(mlist.GetScriptURL('rmlist'),
                                 _('Delete this mailing list')).Format() +
                            _(' (requires confirmation)<br>&nbsp;<br>'))
diff -pru mailman-cvs-HEAD/Mailman/Cgi/confirm.py mailman-2.1.7.cg/Mailman/Cgi/confirm.py
--- mailman-cvs-HEAD/Mailman/Cgi/confirm.py	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Cgi/confirm.py	2006-03-10 16:07:37.000000000 +0100
@@ -53,7 +53,7 @@ def main():
         print doc.Format()
         return
 
-    listname = parts[0].lower()
+    listname = Utils.GetListName(parts)
     try:
         mlist = MailList.MailList(listname, lock=0)
     except Errors.MMListError, e:
diff -pru mailman-cvs-HEAD/Mailman/Cgi/edithtml.py mailman-2.1.7.cg/Mailman/Cgi/edithtml.py
--- mailman-cvs-HEAD/Mailman/Cgi/edithtml.py	2006-01-09 08:04:57.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Cgi/edithtml.py	2006-03-10 16:07:53.000000000 +0100
@@ -61,7 +61,7 @@ def main():
         print doc.Format()
         return
 
-    listname = parts[0].lower()
+    listname = Utils.GetListName(parts)
     try:
         mlist = MailList.MailList(listname, lock=0)
     except Errors.MMListError, e:
diff -pru mailman-cvs-HEAD/Mailman/Cgi/listinfo.py mailman-2.1.7.cg/Mailman/Cgi/listinfo.py
--- mailman-cvs-HEAD/Mailman/Cgi/listinfo.py	2005-08-28 07:31:26.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Cgi/listinfo.py	2006-03-10 16:08:07.000000000 +0100
@@ -42,7 +42,7 @@ def main():
         listinfo_overview()
         return
 
-    listname = parts[0].lower()
+    listname = Utils.GetListName(parts)
     try:
         mlist = MailList.MailList(listname, lock=0)
     except Errors.MMListError, e:
diff -pru mailman-cvs-HEAD/Mailman/Cgi/options.py mailman-2.1.7.cg/Mailman/Cgi/options.py
--- mailman-cvs-HEAD/Mailman/Cgi/options.py	2005-12-03 02:09:50.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Cgi/options.py	2006-03-10 16:08:20.000000000 +0100
@@ -65,7 +65,7 @@ def main():
         return
 
     # get the list and user's name
-    listname = parts[0].lower()
+    listname = Utils.GetListName(parts)
     # open list
     try:
         mlist = MailList.MailList(listname, lock=0)
diff -pru mailman-cvs-HEAD/Mailman/Cgi/private.py mailman-2.1.7.cg/Mailman/Cgi/private.py
--- mailman-cvs-HEAD/Mailman/Cgi/private.py	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Cgi/private.py	2006-04-16 02:20:50.000000000 +0200
@@ -29,6 +29,7 @@ from Mailman import Errors
 from Mailman import i18n
 from Mailman.htmlformat import *
 from Mailman.Logging.Syslog import syslog
+from Mailman.Site import get_mboxpath
 
 # Set up i18n.  Until we know which list is being requested, we use the
 # server's default.
@@ -79,7 +80,7 @@ def main():
     true_filename = os.path.join(
         mm_cfg.PRIVATE_ARCHIVE_FILE_DIR, tpath)
 
-    listname = parts[0].lower()
+    listname = parts[0].lower() # NDIM XXX use Utils.GetListname
     mboxfile = ''
     if len(parts) > 1:
         mboxfile = parts[1]
@@ -166,8 +167,7 @@ def main():
         if ctype is None:
             ctype = 'text/html'
         if mboxfile:
-            f = open(os.path.join(mlist.archive_dir() + '.mbox',
-                                  mlist.internal_name() + '.mbox'))
+            f = open(get_mboxpath(mlist.internal_name()))
             ctype = 'text/plain'
         elif true_filename.endswith('.gz'):
             import gzip
diff -pru mailman-cvs-HEAD/Mailman/Cgi/rmlist.py mailman-2.1.7.cg/Mailman/Cgi/rmlist.py
--- mailman-cvs-HEAD/Mailman/Cgi/rmlist.py	2005-08-27 03:54:02.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Cgi/rmlist.py	2006-03-10 16:09:01.000000000 +0100
@@ -55,7 +55,7 @@ def main():
         syslog('error', 'Bad URL specification: %s', parts)
         return
         
-    listname = parts[0].lower()
+    listname = Utils.GetListName(parts)
     try:
         mlist = MailList.MailList(listname, lock=0)
     except Errors.MMListError, e:
@@ -136,8 +136,9 @@ def process_request(doc, cgidata, mlist)
 
     problems = 0
     listname = mlist.internal_name()
+    local_part = mlist.local_part
     for dirtmpl in REMOVABLES:
-        dir = os.path.join(mm_cfg.VAR_PREFIX, dirtmpl % listname)
+        dir = os.path.join(mm_cfg.VAR_PREFIX, dirtmpl % local_part) # NDIM XXX
         if os.path.islink(dir):
             try:
                 os.unlink(dir)
diff -pru mailman-cvs-HEAD/Mailman/Cgi/roster.py mailman-2.1.7.cg/Mailman/Cgi/roster.py
--- mailman-cvs-HEAD/Mailman/Cgi/roster.py	2005-08-27 03:54:02.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Cgi/roster.py	2006-03-10 16:09:10.000000000 +0100
@@ -48,7 +48,7 @@ def main():
         error_page(_('Invalid options to CGI script'))
         return
 
-    listname = parts[0].lower()
+    listname = Utils.GetListName(parts)
     try:
         mlist = MailList.MailList(listname, lock=0)
     except Errors.MMListError, e:
diff -pru mailman-cvs-HEAD/Mailman/Cgi/subscribe.py mailman-2.1.7.cg/Mailman/Cgi/subscribe.py
--- mailman-cvs-HEAD/Mailman/Cgi/subscribe.py	2005-08-27 03:54:02.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Cgi/subscribe.py	2006-03-10 16:09:20.000000000 +0100
@@ -51,7 +51,7 @@ def main():
         print doc.Format()
         return
 
-    listname = parts[0].lower()
+    listname = Utils.GetListName(parts)
     try:
         mlist = MailList.MailList(listname, lock=0)
     except Errors.MMListError, e:
diff -pru mailman-cvs-HEAD/Mailman/Defaults.py.in mailman-2.1.7.cg/Mailman/Defaults.py.in
--- mailman-cvs-HEAD/Mailman/Defaults.py.in	2006-01-15 22:05:42.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Defaults.py.in	2006-03-04 18:29:11.000000000 +0100
@@ -1,6 +1,6 @@
 # -*- python -*-
 
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
@@ -476,7 +476,6 @@ GLOBAL_PIPELINE = [
     'CalcRecips',
     'AvoidDuplicates',
     'Cleanse',
-    'CleanseDKIM',
     'CookHeaders',
     # And now we send the message to the digest mbox file, and to the arch and
     # news queues.  Runners will provide further processing of the message,
@@ -495,7 +494,6 @@ GLOBAL_PIPELINE = [
 OWNER_PIPELINE = [
     'SpamDetect',
     'Replybot',
-    'CleanseDKIM',
     'OwnerRecips',
     'ToOutgoing',
     ]
@@ -830,7 +828,7 @@ DEFAULT_MSG_HEADER = ""
 DEFAULT_MSG_FOOTER = """_______________________________________________
 %(real_name)s mailing list
 %(real_name)s@%(host_name)s
-%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s
+%(web_page_url)slistinfo%(cgiext)s/%(local_part)s
 """
 
 # Where to put subject prefix for 'Re:' messages:
@@ -1309,57 +1307,44 @@ from Version import *
 # element being the description, as described in the catalogs, and second
 # element is the language charset.  I have chosen code from /usr/share/locale
 # in my GNU/Linux. :-)
-# TK: Now the site admin can select languages for the installation from
-# those in the distribution tarball.  We don't touch add_language() function
-# for backward compatibility in mm_cfg.py syntax.  You may have to add your
-# own language in mm_cfg.py if it is not included in the distribution even
-# if you had put language files in source directory and configured by
-# `--with-languages' option.
 def _(s):
     return s
 
-LANGUAGES = 'en ' + '@LANGUAGES@'
-LANGUAGE_DICT = {
-	'ca':   (_('Catalan'),             'iso-8859-1'),
-	'cs':   (_('Czech'),               'iso-8859-2'),
-	'da':   (_('Danish'),              'iso-8859-1'),
-	'de':   (_('German'),              'iso-8859-1'),
-	'en':   (_('English (USA)'),       'us-ascii'),
-	'es':   (_('Spanish (Spain)'),     'iso-8859-1'),
-	'et':   (_('Estonian'),            'iso-8859-15'),
-	'eu':   (_('Euskara'),             'iso-8859-15'), # Basque
-	'fi':   (_('Finnish'),             'iso-8859-1'),
-	'fr':   (_('French'),              'iso-8859-1'),
-	'hr':   (_('Croatian'),            'iso-8859-2'),
-	'hu':   (_('Hungarian'),           'iso-8859-2'),
-        'ia':   (_('Interlingua'),         'iso-8859-15'),
-	'it':   (_('Italian'),             'iso-8859-1'),
-	'ja':   (_('Japanese'),            'euc-jp'),
-	'ko':   (_('Korean'),              'euc-kr'),
-	'lt':   (_('Lithuanian'),          'iso-8859-13'),
-	'nl':   (_('Dutch'),               'iso-8859-1'),
-	'no':   (_('Norwegian'),           'iso-8859-1'),
-	'pl':   (_('Polish'),              'iso-8859-2'),
-	'pt':   (_('Portuguese'),          'iso-8859-1'),
-	'pt_BR':(_('Portuguese (Brazil)'), 'iso-8859-1'),
-	'ro':   (_('Romanian'),            'iso-8859-2'),
-	'ru':   (_('Russian'),             'koi8-r'),
-	'sr':   (_('Serbian'),             'utf-8'),
-	'sl':   (_('Slovenian'),           'iso-8859-2'),
-	'sv':   (_('Swedish'),             'iso-8859-1'),
-	'tr':   (_('Turkish'),             'iso-8859-9'),
-	'uk':   (_('Ukrainian'),           'utf-8'),
-	'zh_CN':(_('Chinese (China)'),     'utf-8'),
-	'zh_TW':(_('Chinese (Taiwan)'),    'utf-8'),
-}
-
 LC_DESCRIPTIONS = {}
 
 def add_language(code, description, charset):
     LC_DESCRIPTIONS[code] = (description, charset)
 
-for lang in LANGUAGES.split():
-    if lang in LANGUAGE_DICT.keys():
-        add_language(lang, LANGUAGE_DICT[lang][0], LANGUAGE_DICT[lang][1])
+add_language('ca',    _('Catalan'),             'iso-8859-1')
+add_language('cs',    _('Czech'),               'iso-8859-2')
+add_language('da',    _('Danish'),              'iso-8859-1')
+add_language('de',    _('German'),              'iso-8859-1')
+add_language('en',    _('English (USA)'),       'us-ascii')
+add_language('es',    _('Spanish (Spain)'),     'iso-8859-1')
+add_language('et',    _('Estonian'),            'iso-8859-15')
+add_language('eu',    _('Euskara'),             'iso-8859-15') # Basque
+add_language('fi',    _('Finnish'),             'iso-8859-1')
+add_language('fr',    _('French'),              'iso-8859-1')
+add_language('hr',    _('Croatian'),            'iso-8859-2')
+add_language('hu',    _('Hungarian'),           'iso-8859-2')
+add_language('ia',    _('Interlingua'),         'iso-8859-15')
+add_language('it',    _('Italian'),             'iso-8859-1')
+add_language('ja',    _('Japanese'),            'euc-jp')
+add_language('ko',    _('Korean'),              'euc-kr')
+add_language('lt',    _('Lithuanian'),          'iso-8859-13')
+add_language('nl',    _('Dutch'),               'iso-8859-1')
+add_language('no',    _('Norwegian'),           'iso-8859-1')
+add_language('pl',    _('Polish'),              'iso-8859-2')
+add_language('pt',    _('Portuguese'),          'iso-8859-1')
+add_language('pt_BR', _('Portuguese (Brazil)'), 'iso-8859-1')
+add_language('ro',    _('Romanian'),            'iso-8859-2')
+add_language('ru',    _('Russian'),             'koi8-r')
+add_language('sr',    _('Serbian'),             'utf-8')
+add_language('sl',    _('Slovenian'),           'iso-8859-2')
+add_language('sv',    _('Swedish'),             'iso-8859-1')
+add_language('tr',    _('Turkish'),             'iso-8859-9')
+add_language('uk',    _('Ukrainian'),           'utf-8')
+add_language('zh_CN', _('Chinese (China)'),     'utf-8')
+add_language('zh_TW', _('Chinese (Taiwan)'),    'utf-8')
 
 del _
diff -pru mailman-cvs-HEAD/Mailman/Deliverer.py mailman-2.1.7.cg/Mailman/Deliverer.py
--- mailman-cvs-HEAD/Mailman/Deliverer.py	2005-12-30 19:56:44.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Deliverer.py	2006-03-04 12:31:03.000000000 +0100
@@ -158,9 +158,8 @@ your membership administrative address, 
         # Some one was invited to one list but tried to confirm to a different
         # list.  We inform both list owners of the bogosity, but be careful
         # not to reveal too much information.
-        selfname = self.internal_name()
         syslog('mischief', '%s was invited to %s but confirmed to %s',
-               address, listname, selfname)
+               address, listname, self.internal_name())
         # First send a notice to the attacked list
         msg = Message.OwnerNotification(
             self,
@@ -207,7 +206,7 @@ is required.""")))
         # probe message.
         token = self.pend_new(Pending.PROBE_BOUNCE, member, msg)
         probedict = {
-            'bounces': self.internal_name() + '-bounces',
+            'bounces': self.getListAddress('bounces'),
             'token': token,
             }
         probeaddr = '%s@%s' % ((mm_cfg.VERP_PROBE_FORMAT % probedict),
diff -pru mailman-cvs-HEAD/Mailman/Gui/Digest.py mailman-2.1.7.cg/Mailman/Gui/Digest.py
--- mailman-cvs-HEAD/Mailman/Gui/Digest.py	2005-08-27 03:54:02.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Gui/Digest.py	2006-03-04 18:41:06.000000000 +0100
@@ -25,8 +25,9 @@ from Mailman.Gui.GUIBase import GUIBase
 
 # Common b/w nondigest and digest headers & footers.  Personalizations may add
 # to this.
+# NDIM XXX remove _internal_name?
 ALLOWEDS = ('real_name', 'list_name', 'host_name', 'web_page_url',
-            'description', 'info', 'cgiext', '_internal_name',
+            'description', 'info', 'cgiext', '_internal_name', 'local_part',
             )
 
 
diff -pru mailman-cvs-HEAD/Mailman/Gui/General.py mailman-2.1.7.cg/Mailman/Gui/General.py
--- mailman-cvs-HEAD/Mailman/Gui/General.py	2005-10-07 05:07:22.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Gui/General.py	2006-02-21 07:44:48.000000000 +0100
@@ -419,7 +419,7 @@ class General(GUIBase):
 
     def _setValue(self, mlist, property, val, doc):
         if property == 'real_name' and \
-               val.lower() <> mlist.internal_name().lower():
+               val.lower() <> mlist.real_name.lower():
             # These values can't differ by other than case
             doc.addError(_("""<b>real_name</b> attribute not
             changed!  It must differ from the list's name by case
diff -pru mailman-cvs-HEAD/Mailman/Gui/Privacy.py mailman-2.1.7.cg/Mailman/Gui/Privacy.py
--- mailman-cvs-HEAD/Mailman/Gui/Privacy.py	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Gui/Privacy.py	2005-12-30 19:50:08.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2003 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2005 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
diff -pru mailman-cvs-HEAD/Mailman/Gui/Topics.py mailman-2.1.7.cg/Mailman/Gui/Topics.py
--- mailman-cvs-HEAD/Mailman/Gui/Topics.py	2006-01-15 00:58:37.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Gui/Topics.py	2006-02-21 07:21:11.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2003 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
@@ -12,8 +12,7 @@
 #
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 import re
 
diff -pru mailman-cvs-HEAD/Mailman/Handlers/Approve.py mailman-2.1.7.cg/Mailman/Handlers/Approve.py
--- mailman-cvs-HEAD/Mailman/Handlers/Approve.py	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/Approve.py	2005-12-30 19:50:08.000000000 +0100
@@ -30,6 +30,13 @@ from email.Iterators import typed_subpar
 from Mailman import mm_cfg
 from Mailman import Errors
 
+# True/False
+try:
+    True, False
+except NameError:
+    True = 1
+    False = 0
+
 NL = '\n'
 
 
diff -pru mailman-cvs-HEAD/Mailman/Handlers/Cleanse.py mailman-2.1.7.cg/Mailman/Handlers/Cleanse.py
--- mailman-cvs-HEAD/Mailman/Handlers/Cleanse.py	2006-01-15 22:03:55.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/Cleanse.py	2005-12-30 19:50:08.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
@@ -50,3 +50,12 @@ def process(mlist, msg, msgdata):
     del msg['x-confirm-reading-to']
     # Pegasus mail uses this one... sigh
     del msg['x-pmrqc']
+    # Remove any "DomainKeys" (or similar) header lines.  The values contained
+    # in these header lines are intended to be used by the recipient to detect
+    # forgery or tampering in transit, and the modifications made by Mailman
+    # to the headers and body of the message will cause these keys to appear
+    # invalid.  Removing them will at least avoid this misleading result, and
+    # it will also give the MTA the opportunity to regenerate valid keys
+    # originating at the Mailman server for the outgoing message.
+    del msg['domainkey-signature']
+    del msg['dkim-signature']
diff -pru mailman-cvs-HEAD/Mailman/Handlers/CookHeaders.py mailman-2.1.7.cg/Mailman/Handlers/CookHeaders.py
--- mailman-cvs-HEAD/Mailman/Handlers/CookHeaders.py	2006-02-17 03:48:34.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/CookHeaders.py	2006-03-04 08:59:18.000000000 +0100
@@ -180,7 +180,7 @@ def process(mlist, msg, msgdata):
     if msgdata.get('_nolist') or not mlist.include_rfc2369_headers:
         return
     # This will act like an email address for purposes of formataddr()
-    listid = '%s.%s' % (mlist.internal_name(), mlist.host_name)
+    listid = '%s.%s' % (mlist.local_part, mlist.host_name)
     cset = Utils.GetCharSet(mlist.preferred_language)
     if mlist.description:
         # Don't wrap the header since here we just want to get it properly RFC
@@ -327,33 +327,30 @@ def prefix_subject(mlist, msg, msgdata):
 
 
 
-def ch_oneline(headerstr):
+def ch_oneline(s):
     # Decode header string in one line and convert into single charset
     # copied and modified from ToDigest.py and Utils.py
     # return (string, cset) tuple as check for failure
     try:
-        d = decode_header(headerstr)
-        # At this point, we should rstrip() every string because some
+        d = decode_header(s)
+        # at this point, we should rstrip() every string because some
         # MUA deliberately add trailing spaces when composing return
         # message.
-        d = [(s.rstrip(),c) for (s,c) in d]
-        # Find all charsets in the original header.  We use 'utf-8' rather
-        # than using the first charset (in mailman 2.1.x) if multiple
-        # charsets are used.
-        csets = []
+        i = 0
         for (s,c) in d:
-            if c and c not in csets:
-                csets.append(c)
-        if len(csets) == 0:
-            cset = 'us-ascii'
-        elif len(csets) == 1:
-            cset = csets[0]
-        else:
-            cset = 'utf-8'
+            s = s.rstrip()
+            d[i] = (s,c)
+            i += 1
+        cset = 'us-ascii'
+        for x in d:
+            # search for no-None charset
+            if x[1]:
+                cset = x[1]
+                break
         h = make_header(d)
-        ustr = unicode(h)
+        ustr = h.__unicode__()
         oneline = u''.join(ustr.splitlines())
         return oneline.encode(cset, 'replace'), cset
     except (LookupError, UnicodeError, ValueError, HeaderParseError):
         # possibly charset problem. return with undecoded string in one line.
-        return ''.join(headerstr.splitlines()), 'us-ascii'
+        return ''.join(s.splitlines()), 'us-ascii'
diff -pru mailman-cvs-HEAD/Mailman/Handlers/Decorate.py mailman-2.1.7.cg/Mailman/Handlers/Decorate.py
--- mailman-cvs-HEAD/Mailman/Handlers/Decorate.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/Decorate.py	2006-03-04 18:54:25.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
@@ -98,7 +98,12 @@ def process(mlist, msg, msgdata):
         uheader = unicode(header, lcset)
         ufooter = unicode(footer, lcset)
         try:
-            oldpayload = unicode(msg.get_payload(decode=True), mcset)
+            # First, check if the message was Scrubber-munged
+            if msg.get('x-mailman-scrubbed'):
+                decode = False
+            else:
+                decode = True
+            oldpayload = unicode(msg.get_payload(decode=decode), mcset)
             frontsep = endsep = u''
             if header and not header.endswith('\n'):
                 frontsep = u'\n'
@@ -121,7 +126,7 @@ def process(mlist, msg, msgdata):
             wrap = False
         except (LookupError, UnicodeError):
             pass
-    elif msg.get_content_type() == 'multipart/mixed':
+    elif msg.get_type() == 'multipart/mixed':
         # The next easiest thing to do is just prepend the header and append
         # the footer as additional subparts
         payload = msg.get_payload()
@@ -193,12 +198,12 @@ def decorate(mlist, template, what, extr
     # example, a footer of "% silly %(real_name)s" would give a header
     # containing all list attributes.  While we've previously removed such
     # really bad ones like `password' and `passwords', it's much better to
-    # provide a whitelist of known good attributes, then to try to remove a
+    # provide a whitelist of known good attributes, than to try to remove a
     # blacklist of known bad ones.
     d = SafeDict({'real_name'     : mlist.real_name,
-                  'list_name'     : mlist.internal_name(),
+                  'list_name'     : mlist.local_part,
                   # For backwards compatibility
-                  '_internal_name': mlist.internal_name(),
+                  '_internal_name': mlist.local_part,
                   'host_name'     : mlist.host_name,
                   'web_page_url'  : mlist.web_page_url,
                   'description'   : mlist.description,
diff -pru mailman-cvs-HEAD/Mailman/Handlers/Hold.py mailman-2.1.7.cg/Mailman/Handlers/Hold.py
--- mailman-cvs-HEAD/Mailman/Handlers/Hold.py	2005-09-19 05:23:11.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Handlers/Hold.py	2006-03-04 18:51:57.000000000 +0100
@@ -129,12 +129,13 @@ def process(mlist, msg, msgdata):
         return
     # Get the sender of the message
     listname = mlist.internal_name()
-    adminaddr = listname + '-admin'
+    adminaddr = mlist.getListAddress('admin')
     sender = msg.get_sender()
     # Special case an ugly sendmail feature: If there exists an alias of the
     # form "owner-foo: bar" and sendmail receives mail for address "foo",
     # sendmail will change the envelope sender of the message to "bar" before
     # delivering.  This feature does not appear to be configurable.  *Boggle*.
+    # NDIM XXX Handle listname == 'foo@blah.com'
     if not sender or sender[:len(listname)+6] == adminaddr:
         sender = msg.get_sender(use_envelope=0)
     #
diff -pru mailman-cvs-HEAD/Mailman/Handlers/Scrubber.py mailman-2.1.7.cg/Mailman/Handlers/Scrubber.py
--- mailman-cvs-HEAD/Mailman/Handlers/Scrubber.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/Scrubber.py	2005-12-30 19:50:08.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2005 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
@@ -111,9 +111,9 @@ class ScrubberGenerator(Generator):
             Generator._write_headers(self, msg)
 
 
-def safe_strftime(fmt, t):
+def safe_strftime(fmt, floatsecs):
     try:
-        return time.strftime(fmt, t)
+        return time.strftime(fmt, floatsecs)
     except (TypeError, ValueError, OverflowError):
         return None
 
@@ -164,10 +164,12 @@ def calculate_attachments_dir(mlist, msg
 
 def replace_payload_by_text(msg, text, charset):
     # TK: This is a common function in replacing the attachment and the main
-    # message by a text (scrubbing).
+    # message by a text (scrubbing).  Also, add a flag indicating it has been
+    # scrubbed.
     del msg['content-type']
     del msg['content-transfer-encoding']
     msg.set_payload(text, charset)
+    msg['X-Mailman-Scrubbed'] = 'Yes'
 
 
 
@@ -188,7 +190,7 @@ def process(mlist, msg, msgdata=None):
     lcset_out = Charset(lcset).output_charset or lcset
     # Now walk over all subparts of this message and scrub out various types
     for part in msg.walk():
-        ctype = part.get_content_type()
+        ctype = part.get_type(part.get_default_type())
         # If the part is text/plain, we leave it alone
         if ctype == 'text/plain':
             # We need to choose a charset for the scrubbed message, so we'll
@@ -286,7 +288,7 @@ Url: %(url)s
         # will transform the url into a hyperlink.
         elif part and not part.is_multipart():
             payload = part.get_payload(decode=True)
-            ctype = part.get_content_type()
+            ctype = part.get_type()
             # XXX Under email 2.5, it is possible that payload will be None.
             # This can happen when you have a Content-Type: multipart/* with
             # only one part and that part has two blank lines between the
@@ -342,13 +344,13 @@ Url : %(url)s
                 text.append(_('Skipped content of type %(partctype)s\n'))
                 continue
             try:
-                t = part.get_payload(decode=True)
-            # MAS: TypeError exception can occur if payload is None. This
-            # was observed with a message that contained an attached
-            # message/delivery-status part. Because of the special parsing
-            # of this type, this resulted in a text/plain sub-part with a
-            # null body. See bug 1430236.
-            except (binascii.Error, TypeError):
+                # Check if the part is replaced.
+                if part.get('x-mailman-scrubbed'):
+                    decode = False
+                else:
+                    decode = True
+                t = part.get_payload(decode=decode)
+            except binascii.Error:
                 t = part.get_payload()
             # TK: get_content_charset() returns 'iso-2022-jp' for internally
             # crafted (scrubbed) 'euc-jp' text part. So, first try
diff -pru mailman-cvs-HEAD/Mailman/Handlers/SMTPDirect.py mailman-2.1.7.cg/Mailman/Handlers/SMTPDirect.py
--- mailman-cvs-HEAD/Mailman/Handlers/SMTPDirect.py	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/SMTPDirect.py	2006-03-04 18:54:50.000000000 +0100
@@ -175,7 +175,7 @@ def process(mlist, msg, msgdata):
                           'size'    : len(msg.as_string()),
                           '#recips' : len(recips),
                           '#refused': len(refused),
-                          'listname': mlist.internal_name(),
+                          'listname': mlist.local_part,
                           'sender'  : origsender,
                           })
     # We have to use the copy() method because extended call syntax requires a
diff -pru mailman-cvs-HEAD/Mailman/Handlers/SpamDetect.py mailman-2.1.7.cg/Mailman/Handlers/SpamDetect.py
--- mailman-cvs-HEAD/Mailman/Handlers/SpamDetect.py	2006-01-29 02:20:30.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/SpamDetect.py	2006-02-21 07:21:11.000000000 +0100
@@ -102,6 +102,15 @@ def process(mlist, msg, msgdata):
             if mo:
                 # we've detected spam, so throw the message away
                 raise SpamDetected
+    # Before we go to header_filter_rules, we exclude internally generated
+    # owner notification from checking, because 1) we collect headers from
+    # all the attachments but this will cause matching the filter rule again,
+    # and 2) list owners may want to check header name / value pair like
+    # 'Precedence: bulk' which is also generated by mailman.  Both will
+    # cause loop of holding owner notification messages if the action is
+    # set to 'hold'.
+    if msgdata.get('toowner') and msg.get('x-list-administrivia') == 'yes':
+        return
     # Now do header_filter_rules
     # TK: Collect headers in sub-parts because attachment filename
     # extension may be a clue to possible virus/spam.
@@ -123,19 +132,9 @@ def process(mlist, msg, msgdata):
                 if action == mm_cfg.DISCARD:
                     raise Errors.DiscardMessage
                 if action == mm_cfg.REJECT:
-                    if msgdata.get('toowner'):
-                        # Don't send rejection notice if addressed to '-owner'
-                        # because it may trigger a loop of notices if the
-                        # sender address is forged.  We just discard it here.
-                        raise Errors.DiscardMessage
                     raise Errors.RejectMessage(
                         _('Message rejected by filter rule match'))
                 if action == mm_cfg.HOLD:
-                    if msgdata.get('toowner'):
-                        # Don't hold '-owner' addressed message.  We just
-                        # pass it here but list-owner can set this to be
-                        # discarded on the GUI if he wants.
-                        return
                     hold_for_approval(mlist, msg, msgdata, HeaderMatchHold)
                 if action == mm_cfg.ACCEPT:
                     return
diff -pru mailman-cvs-HEAD/Mailman/Handlers/Tagger.py mailman-2.1.7.cg/Mailman/Handlers/Tagger.py
--- mailman-cvs-HEAD/Mailman/Handlers/Tagger.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/Tagger.py	2005-08-27 03:40:16.000000000 +0200
@@ -69,12 +69,11 @@ def scanbody(msg, numlines=None):
     # or if the outer type is multipart/alternative and there is a text/plain
     # part.  Anything else, and the body is ignored for header-scan purposes.
     found = None
-    if msg.get_content_type() == 'text/plain':
+    if msg.get_type('text/plain') == 'text/plain':
         found = msg
-    elif msg.is_multipart()\
-         and msg.get_content_type() == 'multipart/alternative':
+    elif msg.is_multipart() and msg.get_type() == 'multipart/alternative':
         for found in msg.get_payload():
-            if found.get_content_type() == 'text/plain':
+            if found.get_type('text/plain') == 'text/plain':
                 break
         else:
             found = None
diff -pru mailman-cvs-HEAD/Mailman/Handlers/ToArchive.py mailman-2.1.7.cg/Mailman/Handlers/ToArchive.py
--- mailman-cvs-HEAD/Mailman/Handlers/ToArchive.py	2006-01-29 06:13:57.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/ToArchive.py	2005-12-30 19:50:08.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
@@ -20,7 +20,10 @@
 import time
 from cStringIO import StringIO
 
+from email import message_from_string
+
 from Mailman import mm_cfg
+from Mailman import Message
 from Mailman.Queue.sbcache import get_switchboard
 
 
@@ -37,4 +40,10 @@ def process(mlist, msg, msgdata):
     # Send the message to the archiver queue
     archq = get_switchboard(mm_cfg.ARCHQUEUE_DIR)
     # Send the message to the queue
-    archq.enqueue(msg, msgdata)
+    if msg.get('x-mailman-scrubbed'):
+        # Clean Scrubber-munged message.
+        archmsg = message_from_string(msg.as_string(), Message.Message)
+        del archmsg['x-mailman-scrubbed']
+        archq.enqueue(archmsg, msgdata)
+    else:
+        archq.enqueue(msg, msgdata)
diff -pru mailman-cvs-HEAD/Mailman/Handlers/ToDigest.py mailman-2.1.7.cg/Mailman/Handlers/ToDigest.py
--- mailman-cvs-HEAD/Mailman/Handlers/ToDigest.py	2006-01-29 06:13:57.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Handlers/ToDigest.py	2005-12-30 19:50:08.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
@@ -32,6 +32,7 @@ import time
 from types import ListType
 from cStringIO import StringIO
 
+from email import message_from_string
 from email.Parser import Parser
 from email.Generator import Generator
 from email.MIMEBase import MIMEBase
@@ -332,10 +333,14 @@ def send_i18n_digests(mlist, mboxfp):
                 uh = '\n\t'.join(uh.split('\n'))
                 print >> plainmsg, uh
         print >> plainmsg
-        # If decoded payload is empty, this may be multipart message.
-        # -- just stringfy it.
-        payload = msg.get_payload(decode=True) \
-                  or msg.as_string().split('\n\n',1)[1]
+        if msg.get('x-mailman-scrubbed'):
+            # It has successfully been scrubbed, so this should be string.
+            payload = msg.get_payload()
+        else:
+            # If decoded payload is empty, this may be multipart message.
+            # -- just stringfy it.
+            payload = msg.get_payload(decode=True) \
+                      or msg.as_string().split('\n\n',1)[1]
         mcset = msg.get_content_charset('')
         if mcset and mcset <> lcset and mcset <> lcset_out:
             try:
@@ -407,6 +412,8 @@ def send_i18n_digests(mlist, mboxfp):
                     isdigest=True)
     # RFC 1153
     rfc1153msg.set_payload(plainmsg.getvalue(), lcset)
+    # Re-generate it because set_payload() doesn't encode. :-(
+    rfc1153msg = message_from_string(rfc1153msg.as_string(), Message.Message)
     virginq.enqueue(rfc1153msg,
                     recips=plainrecips,
                     listname=mlist.internal_name(),
diff -pru mailman-cvs-HEAD/Mailman/HTMLFormatter.py mailman-2.1.7.cg/Mailman/HTMLFormatter.py
--- mailman-cvs-HEAD/Mailman/HTMLFormatter.py	2005-08-27 03:54:02.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/HTMLFormatter.py	2006-03-04 18:43:07.000000000 +0100
@@ -381,7 +381,8 @@ class HTMLFormatter:
         d = {
             '<mm-mailman-footer>' : self.GetMailmanFooter(),
             '<mm-list-name>' : self.real_name,
-            '<mm-email-user>' : self._internal_name,
+            '<mm-email-user>' : self.local_part,
+            '<mm-complete-name>' : self.internal_name(),
             '<mm-list-description>' : self.description,
             '<mm-list-info>' : BR.join(self.info.split(NL)),
             '<mm-form-end>'  : self.FormatFormEnd(),
diff -pru mailman-cvs-HEAD/Mailman/i18n.py mailman-2.1.7.cg/Mailman/i18n.py
--- mailman-cvs-HEAD/Mailman/i18n.py	2006-02-23 07:25:47.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/i18n.py	2005-08-27 03:40:15.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 2000-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2000-2003 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
@@ -12,8 +12,7 @@
 #
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 import sys
 import time
@@ -108,12 +107,7 @@ def ctime(date):
     if isinstance(date, StringType):
         try:
             year, mon, day, hh, mm, ss, wday, ydat, dst = time.strptime(date)
-            if dst in (0,1):
-                tzname = time.tzname[dst]
-            else:
-                # MAS: No exception but dst = -1 so try
-                return ctime(time.mktime((year, mon, day, hh, mm, ss, wday,
-                                          ydat, dst)))
+            tzname = time.tzname[dst and 1 or 0]
         except (ValueError, AttributeError):
             try:
                 wday, mon, day, hms, year = date.split()
@@ -138,8 +132,7 @@ def ctime(date):
                         break
     else:
         year, mon, day, hh, mm, ss, wday, yday, dst = time.localtime(date)
-        if dst in (0,1):
-            tzname = time.tzname[dst]
+        tzname = time.tzname[dst and 1 or 0]
 
     wday = daysofweek[wday]
     mon = months[mon]
diff -pru mailman-cvs-HEAD/Mailman/ListAdmin.py mailman-2.1.7.cg/Mailman/ListAdmin.py
--- mailman-cvs-HEAD/Mailman/ListAdmin.py	2005-08-28 07:31:26.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/ListAdmin.py	2006-03-08 17:45:56.000000000 +0100
@@ -392,7 +392,7 @@ class ListAdmin:
             text = Utils.maketext(
                 'subauth.txt',
                 {'username'   : addr,
-                 'listname'   : self.internal_name(),
+                 'listname'   : self.local_part,
                  'hostname'   : self.host_name,
                  'admindb_url': self.GetScriptURL('admindb', absolute=1),
                  }, mlist=self)
@@ -444,7 +444,7 @@ class ListAdmin:
             text = Utils.maketext(
                 'unsubauth.txt',
                 {'username'   : addr,
-                 'listname'   : self.internal_name(),
+                 'listname'   : self.local_part,
                  'hostname'   : self.host_name,
                  'admindb_url': self.GetScriptURL('admindb', absolute=1),
                  }, mlist=self)
diff -pru mailman-cvs-HEAD/Mailman/MailList.py mailman-2.1.7.cg/Mailman/MailList.py
--- mailman-cvs-HEAD/Mailman/MailList.py	2006-03-12 17:05:37.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/MailList.py	2006-03-09 10:24:43.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
@@ -186,8 +186,8 @@ class MailList(HTMLFormatter, Deliverer,
 
     def getListAddress(self, extra=None):
         if extra is None:
-            return '%s@%s' % (self.internal_name(), self.host_name)
-        return '%s-%s@%s' % (self.internal_name(), extra, self.host_name)
+            return '%s@%s' % (self.local_part, self.host_name)
+        return '%s-%s@%s' % (self.local_part, extra, self.host_name)
 
     # For backwards compatibility
     def GetBouncesEmail(self):
@@ -204,14 +204,13 @@ class MailList(HTMLFormatter, Deliverer,
 
     def GetConfirmEmail(self, cookie):
         return mm_cfg.VERP_CONFIRM_FORMAT % {
-            'addr'  : '%s-confirm' % self.internal_name(),
+            'addr'  : '%s-confirm' % self.local_part,
             'cookie': cookie,
             } + '@' + self.host_name
 
     def GetConfirmJoinSubject(self, listname, cookie):
         if mm_cfg.VERP_CONFIRMATIONS and cookie:
-            cset = i18n.get_translation().charset() or \
-                       Utils.GetCharSet(self.preferred_language)
+            cset = Utils.GetCharSet(self.preferred_language)
             subj = Header(
      _('Your confirmation is required to join the %(listname)s mailing list'),
                           cset, header_name='subject')
@@ -221,8 +220,7 @@ class MailList(HTMLFormatter, Deliverer,
 
     def GetConfirmLeaveSubject(self, listname, cookie):
         if mm_cfg.VERP_CONFIRMATIONS and cookie:
-            cset = i18n.get_translation().charset() or \
-                       Utils.GetCharSet(self.preferred_language)
+            cset = Utils.GetCharSet(self.preferred_language)
             subj = Header(
      _('Your confirmation is required to leave the %(listname)s mailing list'),
                           cset, header_name='subject')
@@ -250,8 +248,10 @@ class MailList(HTMLFormatter, Deliverer,
             return "%s%s@%s" % (acct, self.umbrella_member_suffix, host)
 
     def GetScriptURL(self, scriptname, absolute=0):
+        # Using "local_part" here works for both site wide lists on
+        # the default url host and for vhost lists on the vhost url host.
         return Utils.ScriptURL(scriptname, self.web_page_url, absolute) + \
-               '/' + self.internal_name()
+               '/' + self.local_part
 
     def GetOptionsURL(self, user, obscure=0, absolute=0):
         url = self.GetScriptURL('options', absolute)
@@ -295,6 +295,10 @@ class MailList(HTMLFormatter, Deliverer,
         # Non-configurable list info
         if name:
           self._internal_name = name
+        if '@' in self._internal_name:
+            self.local_part = self._internal_name.split('@')[0]
+        else:
+            self.local_part = self._internal_name
 
         # When was the list created?
         self.created_at = time.time()
@@ -344,8 +348,7 @@ class MailList(HTMLFormatter, Deliverer,
                 mm_cfg.DEFAULT_BOUNCE_MATCHING_HEADERS
         self.header_filter_rules = []
         self.anonymous_list = mm_cfg.DEFAULT_ANONYMOUS_LIST
-        internalname = self.internal_name()
-        self.real_name = internalname[0].upper() + internalname[1:]
+        self.real_name = self.local_part[0].upper() + self.local_part[1:]
         self.description = ''
         self.info = ''
         self.welcome_msg = ''
@@ -479,7 +482,13 @@ class MailList(HTMLFormatter, Deliverer,
         # the admin's email address, so transform the exception.
         if emailhost is None:
             emailhost = mm_cfg.DEFAULT_EMAIL_HOST
-        postingaddr = '%s@%s' % (name, emailhost)
+        if '@' in name:
+            firstname, emailhost = name.split('@', 1)
+        else:
+            firstname = name
+
+        # but we keep a sensible posting address
+        postingaddr = '%s@%s' % (firstname, emailhost)
         try:
             Utils.ValidateEmail(postingaddr)
         except Errors.MMBadEmailError:
@@ -487,11 +496,16 @@ class MailList(HTMLFormatter, Deliverer,
         # Validate the admin's email address
         Utils.ValidateEmail(admin)
         self._internal_name = name
+
         self._full_path = Site.get_listpath(name, create=1)
         # Don't use Lock() since that tries to load the non-existant config.pck
         self.__lock.lock()
         self.InitVars(name, admin, crypted_password)
         self.CheckValues()
+        # this is for getListAddress
+        self.list_address = postingaddr
+        self.real_name = firstname
+        self.subject_prefix = mm_cfg.DEFAULT_SUBJECT_PREFIX % self.__dict__
         if langs is None:
             self.available_languages = [self.preferred_language]
         else:
@@ -754,6 +768,15 @@ class MailList(HTMLFormatter, Deliverer,
             else:
                 goodtopics.append((name, pattern, desc, emptyflag))
         self.topics = goodtopics
+        # Define local_part if not defined yet (loaded ML in old data format).
+        if self.__dict__.has_key('local_part') and self.local_part:
+            pass
+        else:
+            _tmp = self.internal_name()
+            if '@' in _tmp:
+                self.local_part = _tmp.split('@')[0]
+            else:
+                self.local_part = _tmp
 
 
     #
@@ -969,7 +992,7 @@ class MailList(HTMLFormatter, Deliverer,
         else:
             kind = ''
         syslog('subscribe', '%s: new%s %s, %s', self.internal_name(),
-               kind, formataddr((name, email)), whence)
+               kind, formataddr((email, name)), whence)
         if ack:
             self.SendSubscribeAck(email, self.getMemberPassword(email),
                                   digest, text)
@@ -1125,7 +1148,6 @@ class MailList(HTMLFormatter, Deliverer,
             self.removeMember(oldaddr)
         else:
             self.changeMemberAddress(oldaddr, newaddr)
-            self.log_and_notify_admin(oldaddr, newaddr)
         # If globally is true, then we also include every list for which
         # oldaddr is a member.
         if not globally:
@@ -1149,39 +1171,10 @@ class MailList(HTMLFormatter, Deliverer,
                     mlist.removeMember(oldaddr)
                 else:
                     mlist.changeMemberAddress(oldaddr, newaddr)
-                    mlist.log_and_notify_admin(oldaddr, newaddr)
                 mlist.Save()
             finally:
                 mlist.Unlock()
 
-    def log_and_notify_admin(self, oldaddr, newaddr):
-        """Log member address change and notify admin if requested."""
-        syslog('subscribe', '%s: changed member address from %s to %s',
-               self.internal_name(), oldaddr, newaddr)
-        if self.admin_notify_mchanges:
-            lang = self.preferred_language
-            otrans = i18n.get_translation()
-            i18n.set_language(lang)
-            try:
-                realname = self.real_name
-                subject = _('%(realname)s address change notification')
-            finally:
-                i18n.set_translation(otrans)
-            name = self.getMemberName(newaddr)
-            if name is None:
-                name = ''
-            if isinstance(name, UnicodeType):
-                name = name.encode(Utils.GetCharSet(lang), 'replace')
-            text = Utils.maketext(
-                'adminaddrchgack.txt',
-                {'name'    : name,
-                 'oldaddr' : oldaddr,
-                 'newaddr' : newaddr,
-                 'listname': self.real_name,
-                 }, mlist=self)
-            msg = Message.OwnerNotification(self, subject, text)
-            msg.send(self)
-
 
     #
     # Confirmation processing
@@ -1352,7 +1345,7 @@ class MailList(HTMLFormatter, Deliverer,
         addresses in the recipient headers.
         """
         # This is the list's full address.
-        listfullname = '%s@%s' % (self.internal_name(), self.host_name)
+        listfullname = self.getListAddress()
         recips = []
         # Check all recipient addresses against the list's explicit addresses,
         # specifically To: Cc: and Resent-to:
@@ -1367,7 +1360,7 @@ class MailList(HTMLFormatter, Deliverer,
             addr = addr.lower()
             localpart = addr.split('@')[0]
             if (# TBD: backwards compatibility: deprecated
-                    localpart == self.internal_name() or
+                    localpart == self.local_part or
                     # exact match against the complete list address
                     addr == listfullname):
                 return True
diff -pru mailman-cvs-HEAD/Mailman/Message.py mailman-2.1.7.cg/Mailman/Message.py
--- mailman-cvs-HEAD/Mailman/Message.py	2006-03-10 11:36:00.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Message.py	2005-12-30 19:50:07.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
diff -pru mailman-cvs-HEAD/Mailman/MTA/Manual.py mailman-2.1.7.cg/Mailman/MTA/Manual.py
--- mailman-cvs-HEAD/Mailman/MTA/Manual.py	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/MTA/Manual.py	2006-03-09 10:29:20.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2003 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2005 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
@@ -56,6 +56,7 @@ def create(mlist, cgi=False, nolock=Fals
     if mlist is None:
         return
     listname = mlist.internal_name()
+    assert('@' not in listname) # No Manual MTA support for vhost lists
     fieldsz = len(listname) + len('-unsubscribe')
     if cgi:
         # If a list is being created via the CGI, the best we can do is send
@@ -104,6 +105,7 @@ equivalent) file by adding the following
 
 def remove(mlist, cgi=False):
     listname = mlist.internal_name()
+    assert('@' not in listname) # No Manual MTA support for vhost lists
     fieldsz = len(listname) + len('-unsubscribe')
     if cgi:
         # If a list is being removed via the CGI, the best we can do is send
diff -pru mailman-cvs-HEAD/Mailman/MTA/Postfix.py mailman-2.1.7.cg/Mailman/MTA/Postfix.py
--- mailman-cvs-HEAD/Mailman/MTA/Postfix.py	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/MTA/Postfix.py	2006-03-04 18:13:08.000000000 +0100
@@ -28,12 +28,13 @@ from Mailman import mm_cfg
 from Mailman import Utils
 from Mailman import LockFile
 from Mailman.i18n import _
-from Mailman.MTA.Utils import makealiases
+from Mailman.MTA.Utils import makealiases, _extensions
 from Mailman.Logging.Syslog import syslog
 
 LOCKFILE = os.path.join(mm_cfg.LOCK_DIR, 'creator')
 ALIASFILE = os.path.join(mm_cfg.DATA_DIR, 'aliases')
 VIRTFILE = os.path.join(mm_cfg.DATA_DIR, 'virtual-mailman')
+TRANSPORTFILE = os.path.join(mm_cfg.DATA_DIR, 'transport-mailman')
 
 try:
     True, False
@@ -43,21 +44,23 @@ except NameError:
 
 
 
-def _update_maps():
-    msg = 'command failed: %s (status: %s, %s)'
-    acmd = mm_cfg.POSTFIX_ALIAS_CMD + ' ' + ALIASFILE
-    status = (os.system(acmd) >> 8) & 0xff
+def _update_map_file(mapfile, command=mm_cfg.POSTFIX_MAP_CMD):
+    msg = 'command failed: %s (status: %s, %s)'        
+    cmdline = command + ' ' + mapfile
+    status = os.spawnlp(os.P_WAIT, command, command, mapfile)
     if status:
         errstr = os.strerror(status)
-        syslog('error', msg, acmd, status, errstr)
-        raise RuntimeError, msg % (acmd, status, errstr)
+        syslog('error', msg, cmdline, status, errstr)
+        raise RuntimeError, msg % (cmdline, status, errstr)
+
+
+
+def _update_maps():
+    _update_map_file(ALIASFILE, command = mm_cfg.POSTFIX_ALIAS_CMD)
     if os.path.exists(VIRTFILE):
-        vcmd = mm_cfg.POSTFIX_MAP_CMD + ' ' + VIRTFILE
-        status = (os.system(vcmd) >> 8) & 0xff
-        if status:
-            errstr = os.strerror(status)
-            syslog('error', msg, vcmd, status, errstr)
-            raise RuntimeError, msg % (vcmd, status, errstr)
+        _update_map_file(VIRTFILE)
+    if os.path.exists(TRANSPORTFILE):
+        _update_map_file(TRANSPORTFILE)
 
 
 
@@ -79,7 +82,31 @@ def clear():
 
 
 
-def _addlist(mlist, fp):
+def _generate_alias(mlist, ext=None):
+    listname = mlist.internal_name()
+    if '@' in listname:
+        foo = listname.split('@')
+        foo.reverse()
+        aliaslistname = '='.join(foo)
+    else:
+        aliaslistname = listname
+    if ext:
+        return aliaslistname + '-' + ext
+    else:
+        return aliaslistname
+
+
+def _uses_transport(mlist):
+    listname = mlist.internal_name()
+    if False: # XXX mm_cfg.VHOST_USES_TRANSPORTS ... TBD NDIM
+        return ('@' in listname) and (mlist.host_name not in
+                                      mm_cfg.POSTFIX_STYLE_VIRTUAL_DOMAINS)
+    else:
+        return False
+
+
+
+def _addalias(mlist, fp):
     # Set up the mailman-loop address
     loopaddr = Utils.ParseEmail(Utils.get_site_email(extra='loop'))[0]
     loopmbox = os.path.join(mm_cfg.DATA_DIR, 'owner-bounces.mbox')
@@ -101,13 +128,18 @@ def _addlist(mlist, fp):
     # exercise is to get the minimal aliases.db file into existance.
     if mlist is None:
         return
+    # Only generate aliases for site wide lists and for lists in
+    # mm_cfg.POSTFIX_STYLE_VIRTUAL_DOMAINS
+    if _uses_transport(mlist):
+        return
     listname = mlist.internal_name()
-    fieldsz = len(listname) + len('-unsubscribe')
     # The text file entries get a little extra info
     print >> fp, '# STANZA START:', listname
     print >> fp, '# CREATED:', time.ctime(time.time())
     # Now add all the standard alias entries
-    for k, v in makealiases(listname):
+    fieldsz = len('-unsubscribe')
+    for k, v in makealiases(_generate_alias(mlist),
+                            internal_listname = listname):
         # Format the text file nicely
         print >> fp, k + ':', ((fieldsz - len(k)) * ' ') + v
     # Finish the text file stanza
@@ -118,8 +150,6 @@ def _addlist(mlist, fp):
 
 def _addvirtual(mlist, fp):
     listname = mlist.internal_name()
-    fieldsz = len(listname) + len('-unsubscribe')
-    hostname = mlist.host_name
     # Set up the mailman-loop address
     loopaddr = Utils.get_site_email(mlist.host_name, extra='loop')
     loopdest = Utils.ParseEmail(loopaddr)[0]
@@ -140,14 +170,26 @@ def _addvirtual(mlist, fp):
 %s\t%s
 # LOOP ADDRESSES END
 """ % (loopaddr, loopdest)
+    # NDIM XXX What are those loop addrs for, and do we need them for each
+    # virtual domain?
+    
+    # Only generate virtual alias for lists in
+    # NDIM DBG print "_addvirtual", listname
+    if '@' not in listname or _uses_transport(mlist):
+        return
     # The text file entries get a little extra info
     print >> fp, '# STANZA START:', listname
     print >> fp, '# CREATED:', time.ctime(time.time())
     # Now add all the standard alias entries
-    for k, v in makealiases(listname):
-        fqdnaddr = '%s@%s' % (k, hostname)
+    addrs = [ (mlist.getListAddress(),
+               _generate_alias(mlist)) ] # XXX name space clash
+    for ext in _extensions:
+        addrs.append((mlist.getListAddress(ext),
+                      _generate_alias(mlist, ext=ext))) # XXX name space clash
+    fieldsz = len(mlist.getListAddress('-unsubscribe'))
+    for addr, target in addrs:
         # Format the text file nicely
-        print >> fp, fqdnaddr, ((fieldsz - len(k)) * ' '), k
+        print >> fp, addr, ((fieldsz - len(addr)) * ' '), target
     # Finish the text file stanza
     print >> fp, '# STANZA END:', listname
     print >> fp
@@ -198,6 +240,42 @@ def _check_for_virtual_loopaddr(mlist, f
 
 
 
+def _addtransport(mlist, fp):
+    # XXX Set up the mailman-loop address
+    #loopaddr = Utils.get_site_email(mlist.host_name, extra='loop')
+    #loopdest = Utils.ParseEmail(loopaddr)[0]
+    # Seek to the end of the text file, but if it's empty write the standard
+    # disclaimer, and the loop catch address.
+    fp.seek(0, 2)
+    if not fp.tell():
+        print >> fp, """\
+# This file is generated by Mailman, and is kept in sync with the binary hash
+# file transport-mailman.db.  YOU SHOULD NOT MANUALLY EDIT THIS FILE unless you
+# know what you're doing, and can keep the two files properly in sync.  If you
+# screw it up, you're on your own.
+
+"""
+    # Only generate transport for vhost list
+    if not _uses_transport(mlist):
+        return
+    # The text file entries get a little extra info
+    print >> fp, '# STANZA START:', listname
+    print >> fp, '# CREATED:', time.ctime(time.time())
+    # Now add all the standard alias entries
+    listname = mlist.internal_name()
+    fieldsz = len('-unsubscribe')
+    addrs = [ mlist.getListAddress() ]
+    for ext in _extensions:
+        addrs.append(mlist.getListAddress(ext))
+    for addr in addrs:
+        target = "mailman:"
+        print >> fp, addr, ((fieldsz - len(ext)) * ' '), target
+    # Finish the text file stanza
+    print >> fp, '# STANZA END:', listname
+    print >> fp
+
+
+
 def _do_create(mlist, textfile, func):
     # Crack open the plain text file
     try:
@@ -213,6 +291,8 @@ def _do_create(mlist, textfile, func):
         func(mlist, fp)
     finally:
         fp.close()
+
+    # XXX check transports?
     # Now double check the virtual plain text file
     if func is _addvirtual:
         _check_for_virtual_loopaddr(mlist, textfile)
@@ -226,9 +306,10 @@ def create(mlist, cgi=False, nolock=Fals
         lock.lock()
     # Do the aliases file, which need to be done in any case
     try:
-        _do_create(mlist, ALIASFILE, _addlist)
-        if mlist and mlist.host_name in mm_cfg.POSTFIX_STYLE_VIRTUAL_DOMAINS:
+        _do_create(mlist, ALIASFILE, _addalias)
+        if mlist and '@' in mlist.internal_name(): # NDIM XXX and mlist.host_name in mm_cfg.POSTFIX_STYLE_VIRTUAL_DOMAINS:
             _do_create(mlist, VIRTFILE, _addvirtual)
+        _do_create(mlist, TRANSPORTFILE, _addtransport)
         _update_maps()
     finally:
         if lock:
diff -pru mailman-cvs-HEAD/Mailman/MTA/Utils.py mailman-2.1.7.cg/Mailman/MTA/Utils.py
--- mailman-cvs-HEAD/Mailman/MTA/Utils.py	2005-08-27 03:54:02.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/MTA/Utils.py	2006-02-22 12:26:47.000000000 +0100
@@ -22,6 +22,10 @@ import pwd
 from Mailman import mm_cfg
 
 
+_extensions = ('admin', 'bounces', 'confirm', 'join', 'leave', 'owner',
+               'request', 'subscribe', 'unsubscribe', )
+
+
 
 def getusername():
     username = os.environ.get('USER') or os.environ.get('LOGNAME')
@@ -34,7 +38,9 @@ def getusername():
 
 
 
-def _makealiases_mailprog(listname):
+def _makealiases_mailprog(listname, internal_listname=None):
+    if not internal_listname:
+        internal_listname = listname
     wrapper = os.path.join(mm_cfg.WRAPPER_DIR, 'mailman')
     # Most of the list alias extensions are quite regular.  I.e. if the
     # message is delivered to listname-foobar, it will be filtered to a
@@ -46,12 +52,11 @@ def _makealiases_mailprog(listname):
     #    need for the -admin address anymore).
     #
     # Seed this with the special cases.
-    aliases = [(listname,          '"|%s post %s"' % (wrapper, listname)),
+    aliases = [(listname,          '"|%s post %s"' % (wrapper, internal_listname)),
                ]
-    for ext in ('admin', 'bounces', 'confirm', 'join', 'leave', 'owner',
-                'request', 'subscribe', 'unsubscribe'):
+    for ext in _extensions:
         aliases.append(('%s-%s' % (listname, ext),
-                        '"|%s %s %s"' % (wrapper, ext, listname)))
+                        '"|%s %s %s"' % (wrapper, ext, internal_listname)))
     return aliases
 
 
@@ -66,8 +71,7 @@ def _makealiases_maildir(listname):
     # Note, don't use this unless your MTA leaves the envelope recipient in
     # Delivered-To:, Envelope-To:, or Apparently-To:
     aliases = [(listname, maildir)]
-    for ext in ('admin', 'bounces', 'confirm', 'join', 'leave', 'owner',
-                'request', 'subscribe', 'unsubscribe'):
+    for ext in _extensions:
         aliases.append(('%s-%s' % (listname, ext), maildir))
     return aliases
 
diff -pru mailman-cvs-HEAD/Mailman/Queue/ArchRunner.py mailman-2.1.7.cg/Mailman/Queue/ArchRunner.py
--- mailman-cvs-HEAD/Mailman/Queue/ArchRunner.py	2006-02-03 09:12:14.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Queue/ArchRunner.py	2005-08-27 03:40:16.000000000 +0200
@@ -49,7 +49,7 @@ class ArchRunner(Runner):
                 elif abs(now - mktime_tz(tup)) > \
                          mm_cfg.ARCHIVER_ALLOWABLE_SANE_DATE_SKEW:
                     clobber = 1
-            except (ValueError, OverflowError):
+            except ValueError:
                 # The likely cause of this is that the year in the Date: field
                 # is horribly incorrect, e.g. (from SF bug # 571634):
                 # Date: Tue, 18 Jun 0102 05:12:09 +0500
diff -pru mailman-cvs-HEAD/Mailman/Queue/BounceRunner.py mailman-2.1.7.cg/Mailman/Queue/BounceRunner.py
--- mailman-cvs-HEAD/Mailman/Queue/BounceRunner.py	2006-03-10 11:36:01.000000000 +0100
+++ mailman-2.1.7.cg/Mailman/Queue/BounceRunner.py	2006-03-09 19:49:12.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2004 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
@@ -12,8 +12,7 @@
 #
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Bounce queue runner."""
 
@@ -89,12 +88,9 @@ class BounceMixin:
     def _queue_bounces(self, listname, addrs, msg):
         today = time.localtime()[:3]
         if self._bounce_events_fp is None:
-            omask = os.umask(006)
-            try:
-                self._bounce_events_fp = open(self._bounce_events_file, 'a+b')
-            finally:
-                os.umask(omask)
+            self._bounce_events_fp = open(self._bounce_events_file, 'a+b')
         for addr in addrs:
+            # NDIM XXX: Where is this "listname" (aka internal_name()) read?
             cPickle.dump((listname, addr, today, msg),
                          self._bounce_events_fp, 1)
         self._bounce_events_fp.flush()
@@ -197,11 +193,7 @@ class BounceRunner(Runner, BounceMixin):
             return
         # Try VERP detection first, since it's quick and easy
         addrs = verp_bounce(mlist, msg)
-        if addrs:
-            # We have an address, but check if the message is non-fatal.
-            if BouncerAPI.ScanMessages(mlist, msg) is BouncerAPI.Stop:
-                return
-        else:
+        if not addrs:
             # See if this was a probe message.
             token = verp_probe(mlist, msg)
             if token:
@@ -210,9 +202,6 @@ class BounceRunner(Runner, BounceMixin):
             # That didn't give us anything useful, so try the old fashion
             # bounce matching modules.
             addrs = BouncerAPI.ScanMessages(mlist, msg)
-            if addrs is BouncerAPI.Stop:
-                # This is a recognized, non-fatal notice. Ignore it.
-                return
         # If that still didn't return us any useful addresses, then send it on
         # or discard it.
         if not addrs:
diff -pru mailman-cvs-HEAD/Mailman/Queue/NewsRunner.py mailman-2.1.7.cg/Mailman/Queue/NewsRunner.py
--- mailman-cvs-HEAD/Mailman/Queue/NewsRunner.py	2005-08-28 07:31:27.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Queue/NewsRunner.py	2006-03-09 19:44:04.000000000 +0100
@@ -38,7 +38,7 @@ mcre = re.compile(r"""
     \d+.                                          # serial number
     \d+.                                          # time in seconds since epoch
     \d+.                                          # pid
-    (?P<listname>[^@]+)                           # list's internal_name()
+    (?P<localpart>[^@]+)                          # list's local_part
     @                                             # localpart@dom.ain
     (?P<hostname>[^>]+)                           # list's host_name
     >                                             # trailer
@@ -139,8 +139,10 @@ def prepare_message(mlist, msg, msgdata)
     if msgid:
         mo = mcre.search(msgid)
         if mo:
-            lname, hname = mo.group('listname', 'hostname')
-            if lname == mlist.internal_name() and hname == mlist.host_name:
+            lname, hname = mo.group('localname', 'hostname')
+            if '@'.join(lname, hname) == mlist.internal_name():
+                hackmsgid = False
+            elif lname == mlist.internal_name() and hname == mlist.host_name:
                 hackmsgid = False
     if hackmsgid:
         del msg['message-id']
diff -pru mailman-cvs-HEAD/Mailman/SecurityManager.py mailman-2.1.7.cg/Mailman/SecurityManager.py
--- mailman-cvs-HEAD/Mailman/SecurityManager.py	2005-08-28 07:31:26.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/SecurityManager.py	2006-03-04 12:27:50.000000000 +0100
@@ -86,6 +86,9 @@ class SecurityManager:
         # Non configurable
         self.passwords = {}
 
+    def _cookie_key(self):
+        return self.internal_name().replace('@','%40')
+
     def AuthContextInfo(self, authcontext, user=None):
         # authcontext may be one of AuthUser, AuthListModerator,
         # AuthListAdmin, AuthSiteAdmin.  Not supported is the AuthCreator
@@ -98,7 +101,8 @@ class SecurityManager:
         # AuthUser, but the user isn't a member of this mailing list, a
         # NotAMemberError will be raised.  If the user's secret is None, raise
         # a MMBadUserError.
-        key = self.internal_name() + '+'
+        # NDIM: XXX Does this have security implications?
+        key = self._cookie_key() + '+' 
         if authcontext == mm_cfg.AuthUser:
             if user is None:
                 # A bad system error
@@ -292,7 +296,7 @@ class SecurityManager:
                 usernames = [user]
             else:
                 usernames = []
-                prefix = self.internal_name() + '+user+'
+                prefix = self._cookie_key() + '+user+'
                 for k in c.keys():
                     if k.startswith(prefix):
                         usernames.append(k[len(prefix):])
diff -pru mailman-cvs-HEAD/Mailman/Site.py mailman-2.1.7.cg/Mailman/Site.py
--- mailman-cvs-HEAD/Mailman/Site.py	2005-08-28 07:31:26.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Site.py	2006-03-09 22:45:32.000000000 +0100
@@ -22,6 +22,7 @@ implementation should work for standard 
 
 import os
 import errno
+import sys
 
 from Mailman import mm_cfg
 
@@ -47,35 +48,57 @@ def _makedir(path):
 
 
 
-# BAW: We don't really support domain<>None yet.  This will be added in a
-# future version.  By default, Mailman will never pass in a domain argument.
-def get_listpath(listname, domain=None, create=0):
-    """Return the file system path to the list directory for the named list.
+def get_listsubdir(listname):
+    """Return subdirectory name for the named list.
 
-    If domain is given, it is the virtual domain for the named list.  The
-    default is to not distinguish list paths on the basis of virtual domains.
+    Append this subdirectory name to a subsystem specific directory
+    such as archives/private/ or similar.
+
+    The directory scheme implemented is like this:
+    
+        <subsystem directory>/
+           mylist0/            # one "site default list"
+           mylist1/            # another "site default list"
+           some.domain.com/
+              mylist1/         # a "vhost list"
+              mylist2/         # another "vhost list"
+           mydomain.com/
+              mylist1/         # yet another "vhost list"
+
+    Ideally, this function and get_listnames() below would be the only
+    code to modify if you want to introduce another disk storage
+    scheme, e.g. d/domain.com/mylist1 and m/mydomain.com/mylist1.
+    
+    See also get_listpath and get_archpath docs for example usage.
+    """
+    if '@' in listname:
+        tmp = listname.split('@')
+        return os.path.join(tmp[1],tmp[0])
+    else:
+        return listname
+    
+    
+
+def get_listpath(listname, create=0):
+    """Return the file system path to the list directory for the named list.
 
     If the create flag is true, then this method should create the path
     hierarchy if necessary.  If the create flag is false, then this function
     should not attempt to create the path heirarchy (and in fact the absence
     of the path might be significant).
     """
-    path = os.path.join(mm_cfg.LIST_DATA_DIR, listname)
+    path = os.path.join(mm_cfg.LIST_DATA_DIR,
+                        get_listsubdir(listname))
     if create:
         _makedir(path)
     return path
 
 
 
-# BAW: We don't really support domain<>None yet.  This will be added in a
-# future version.  By default, Mailman will never pass in a domain argument.
-def get_archpath(listname, domain=None, create=False, public=False):
+def get_archpath(listname, create=False, public=False):
     """Return the file system path to the list's archive directory for the
     named list in the named virtual domain.
 
-    If domain is given, it is the virtual domain for the named list.  The
-    default is to not distinguish list paths on the basis of virtual domains.
-
     If the create flag is true, then this method should create the path
     hierarchy if necessary.  If the create flag is false, then this function
     should not attempt to create the path heirarchy (and in fact the absence
@@ -88,15 +111,20 @@ def get_archpath(listname, domain=None, 
         subdir = mm_cfg.PUBLIC_ARCHIVE_FILE_DIR
     else:
         subdir = mm_cfg.PRIVATE_ARCHIVE_FILE_DIR
-    path = os.path.join(subdir, listname)
+    path = os.path.join(subdir, get_listsubdir(listname))
     if create:
         _makedir(path)
     return path
 
 
 
-# BAW: We don't really support domain<>None yet.  This will be added in a
-# future version.  By default, Mailman will never pass in a domain argument.
+def get_mboxpath(listname, create=False, public=False):
+    """Get path to archive mbox file"""
+    return os.path.join(get_archpath(listname) + '.mbox',
+                        listname.split('@')[0] + '.mbox')
+
+
+
 def get_listnames(domain=None):
     """Return the names of all the known lists for the given domain.
 
@@ -105,9 +133,19 @@ def get_listnames(domain=None):
     """
     # Import this here to avoid circular imports
     from Mailman.Utils import list_exists
-    # We don't currently support separate virtual domain directories
     got = []
-    for fn in os.listdir(mm_cfg.LIST_DATA_DIR):
-        if list_exists(fn):
-            got.append(fn)
+    datadir = mm_cfg.LIST_DATA_DIR
+    if domain:
+        domaindir = os.path.join(datadir, domain)
+        if os.path.isdir(domaindir):
+            for localpart in os.listdir(domaindir):
+                listname = '@'.join([localpart, domain])
+                if list_exists(listname):
+                    got.append(listname)
+    else:
+        for fn in os.listdir(datadir):
+            if list_exists(fn):
+                got.append(fn)
+            else:
+                got.extend(get_listnames(fn))
     return got
diff -pru mailman-cvs-HEAD/Mailman/Utils.py mailman-2.1.7.cg/Mailman/Utils.py
--- mailman-cvs-HEAD/Mailman/Utils.py	2005-08-28 07:31:26.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Utils.py	2006-03-10 16:05:32.000000000 +0100
@@ -218,6 +218,7 @@ def ValidateEmail(s):
 
 
 
+# Helper function for CGI scripts
 def GetPathPieces(envar='PATH_INFO'):
     path = os.environ.get(envar)
     if path:
@@ -226,6 +227,39 @@ def GetPathPieces(envar='PATH_INFO'):
 
 
 
+# Helper function for CGI scripts
+def _GetURLHost(envar='SERVER_NAME'):
+    # NDIM XXX: Not pretty logic.
+    web_server_name = os.environ.get(envar)
+    if web_server_name:
+        return web_server_name.lower()
+    return mm_cfg.DEFAULT_URL_HOST
+
+
+
+# Helper function for CGI scripts
+def _GetEmailHost(url_host=None):
+    return mm_cfg.VIRTUAL_HOSTS.get(url_host or _GetURLHost(),
+                                    mm_cfg.DEFAULT_EMAIL_HOST)
+
+
+
+# Helper function for CGI scripts
+def GetListName(parts=None):
+    # NDIM XXX Not pretty either
+    if not parts:
+        parts = GetPathPieces()
+    local_part = parts[0].lower()
+    url_host = _GetURLHost()
+
+    if url_host == mm_cfg.DEFAULT_URL_HOST:
+        return local_part
+    else:
+        email_host = _GetEmailHost(url_host=url_host)
+        return '@'.join([local_part,email_host])
+
+
+
 def ScriptURL(target, web_page_url=None, absolute=False):
     """target - scriptname only, nothing extra
     web_page_url - the list's configvar of the same name
@@ -530,6 +564,19 @@ def findtext(templatefile, dict=None, ra
     fp.close()
     text = template
     if dict is not None:
+        # Fix up incorrect template usage introduced in vhost branch:
+        #   - templates use %(listname)s@%(hostname)s patterns
+        #   - pre-vhost Mailman uses { 'listname': mlist.internal_name(),
+        #                              'hostname': mlist.host_name, }
+        #   - vhost Mailman uses     { 'listname': mlist.local_part,
+        #                              'hostname': mlist.host_name, }
+        # Just to make sure, we also log this, so we can fix the code.
+        if dict.has_key('listname'):
+            if '@' in dict['listname']:
+                from Mailman.Logging.Syslog import syslog
+                syslog('vhost', 'vhost warning: listname %s is using @ for template file %s',
+                       repr(dict['listname']), repr(templatefile))
+                dict['listname'] = dict['listname'].split('@')[0]
         try:
             sdict = SafeDict(dict)
             try:
@@ -706,7 +753,7 @@ def unique_message_id(mlist):
     global _serial
     msgid = '<mailman.%d.%d.%d.%s@%s>' % (
         _serial, time.time(), os.getpid(),
-        mlist.internal_name(), mlist.host_name)
+        mlist.local_part, mlist.host_name)
     _serial += 1
     return msgid
 
diff -pru mailman-cvs-HEAD/Mailman/Version.py mailman-2.1.7.cg/Mailman/Version.py
--- mailman-cvs-HEAD/Mailman/Version.py	2005-08-28 07:31:26.000000000 +0200
+++ mailman-2.1.7.cg/Mailman/Version.py	2005-12-31 12:43:56.000000000 +0100
@@ -15,7 +15,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 # Mailman version
-VERSION = "2.2.0a0"
+VERSION = "2.1.7"
 
 # And as a hex number in the manner of PY_VERSION_HEX
 ALPHA = 0xa
@@ -26,11 +26,11 @@ RC    = GAMMA
 FINAL = 0xf
 
 MAJOR_REV = 2
-MINOR_REV = 2
-MICRO_REV = 0
-REL_LEVEL = ALPHA
+MINOR_REV = 1
+MICRO_REV = 7
+REL_LEVEL = FINAL
 # at most 15 beta releases!
-REL_SERIAL = 0
+REL_SERIAL = 1
 
 HEX_VERSION = ((MAJOR_REV << 24) | (MINOR_REV << 16) | (MICRO_REV << 8) |
                (REL_LEVEL << 4)  | (REL_SERIAL << 0))
diff -pru mailman-cvs-HEAD/Makefile.in mailman-2.1.7.cg/Makefile.in
--- mailman-cvs-HEAD/Makefile.in	2005-12-06 05:31:56.000000000 +0100
+++ mailman-2.1.7.cg/Makefile.in	2005-08-27 03:40:15.000000000 +0200
@@ -34,8 +34,6 @@ CC=		@CC@
 INSTALL=	@INSTALL@
 PYTHON= 	@PYTHON@
 
-LANGUAGES=      @LANGUAGES@
-
 DEFS=		@DEFS@
 
 # Customizable but not set by configure
diff -pru mailman-cvs-HEAD/messages/docstring.files mailman-2.1.7.cg/messages/docstring.files
--- mailman-cvs-HEAD/messages/docstring.files	2005-12-06 05:28:16.000000000 +0100
+++ mailman-2.1.7.cg/messages/docstring.files	2005-12-11 08:15:03.000000000 +0100
@@ -1,3 +1,4 @@
+bin/config_list
 bin/add_members
 bin/arch
 bin/b4b5-archfix
@@ -6,7 +7,6 @@ bin/check_db
 bin/check_perms
 bin/cleanarch
 bin/clone_member
-bin/config_list
 bin/convert.py
 bin/discard
 bin/dumpdb
@@ -34,7 +34,7 @@ bin/unshunt
 bin/update
 bin/version
 bin/withlist
-bin/templ2pot.py
+bin/config_list.orig
 cron/bumpdigests
 cron/checkdbs
 cron/disabled
diff -pru mailman-cvs-HEAD/messages/ja/doc/Defaults.py.in mailman-2.1.7.cg/messages/ja/doc/Defaults.py.in
--- mailman-cvs-HEAD/messages/ja/doc/Defaults.py.in	2006-01-04 13:46:58.000000000 +0100
+++ mailman-2.1.7.cg/messages/ja/doc/Defaults.py.in	2005-12-31 04:58:07.000000000 +0100
@@ -18,8 +18,8 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
 # USA.
 
-# [ÌõÃí] ¤³¤Î¥Õ¥¡¥¤¥ë¤Ï, Mailman 2.X ÇÛÉÛÊª¤Ë´Þ¤Þ¤ì¤ë
-#   Mailman/Defaults.py.in (SF.net ¤Ç¤Î CVS ¥ê¥Ó¥¸¥ç¥ó¤Ï 2.135)
+# [ÌõÃí] ¤³¤Î¥Õ¥¡¥¤¥ë¤Ï, Mailman 2.1.7 ÇÛÉÛÊª¤Ë´Þ¤Þ¤ì¤ë
+#   Mailman/Defaults.py.in
 #   ¤Î¥³¥á¥ó¥ÈÉôÊ¬¤òÆüËÜ¸ì (¶¦ÄÌ¸ì) ¤ËËÝÌõ¤·¤¿¤â¤Î¤Ç¤¹.
 #   ÇÛÉÛÅù¤Î¾ò·ï¤Ï¸¶Ê¸¤ÈÆ±ÍÍ, GNU °ìÈÌ¸ø½°ÍøÍÑµöÂú·ÀÌó½ñ (GNU
 #   General Public License) ¤Ë½¾¤¤¤Þ¤¹ (¾åµ­¤â»²¾È¤¯¤À¤µ¤¤). ÆâÍÆ¤ÎÀµ
@@ -1365,14 +1365,7 @@ from Version import *
 # ¸ì¤ÎÀâÌÀ¤Ç, ¤³¤ì¤Ï¥«¥¿¥í¥°¤Ç»È¤¦. 2 ¤Ä¤á¤ÎÍ×ÁÇ¤Ï¸À¸ì¤Î¥­¥ã¥é¥¯¥¿¥»¥Ã
 # ¥È. ¤³¤Î¥³¡¼¥É¤Ï»ä¤Î GNU/Linux ¤Î /usr/share/locale ¤«¤é¤ß¤Ä¤±¤Æ
 # ¤­¤¿ :-) [ÌõÃí: ¤½¤Î¸å¤â¸À¸ì¤¬ÄÉ²Ã¤µ¤ì¤Æ¤¤¤ë.]
-# TK: ÇÛÉÛ¥¿¡¼¥Ü¡¼¥ë¤Ë¤¢¤ë¸À¸ì¤ò¥µ¥¤¥È´ÉÍý¼Ô¤¬Áª¤ó¤Ç¥¤¥ó¥¹¥È¡¼¥ë¤Ç¤­¤ë
-# ¤è¤¦¤Ë¤·¤¿ [>= 2.2 alpha1] [ÌõÃí: ÊÆ¹ñ±Ñ¸ì (en) ¤ÏÉ¬¤º¥¤¥ó¥¹¥È¡¼¥ë¤µ
-# ¤ì¤ë].  mm_cfg.py ¤ÎÉ½µ­¤Ç¸åÊý¸ß´¹À­¤ò¼è¤ë¤¿¤á¤Ë, add_language() ´Ø
-# ¿ô¤ÏÊÑ¤¨¤Æ¤¤¤Ê¤¤.  ÇÛÉÛÊª¤Ë¤Ê¤¤ÆÈ¼«¤Î¸À¸ì¤òÄÉ²Ã¤¹¤ë¤È¤­¤Ï, ¥½¡¼¥¹¥Õ¥¡
-# ¥¤¥ë¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¸À¸ì¤Î¥Õ¥¡¥¤¥ë¤òÆþ¤ì¤Æ '--with-languages' ¥ª¥×
-# ¥·¥ç¥ó¤Ç configure ¤·¤¿¤À¤±¤Ç¤Ï¤À¤á¤Ç, mm_cfg.py ¤Ç¤â [ÌõÃí:
-# add_language() ´Ø¿ô¤ò»È¤Ã¤Æ] ¸À¸ì¤òÄÉ²Ã¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤.
-#
+# 
 # [ÌõÃí]
 #   ¼«Ê¬¤Î¥µ¥¤¥È¤Ç¡ÖÃæ¹ñ¸ì¡×¤ò»È¤¨¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤ë(¤¤¤¿)¤Î¤Ê¤éÃí°Õ:
 #
@@ -1395,48 +1388,41 @@ from Version import *
 def _(s):
     return s
 
-LANGUAGES = 'en ' + '@LANGUAGES@'
-LANGUAGE_DICT = {
-	'ca':   (_('Catalan'),             'iso-8859-1'),
-	'cs':   (_('Czech'),               'iso-8859-2'),
-	'da':   (_('Danish'),              'iso-8859-1'),
-	'de':   (_('German'),              'iso-8859-1'),
-	'en':   (_('English (USA)'),       'us-ascii'),
-	'es':   (_('Spanish (Spain)'),     'iso-8859-1'),
-	'et':   (_('Estonian'),            'iso-8859-15'),
-	'eu':   (_('Euskara'),             'iso-8859-15'), # ¥Ð¥¹¥¯¸ì
-	'fi':   (_('Finnish'),             'iso-8859-1'),
-	'fr':   (_('French'),              'iso-8859-1'),
-	'hr':   (_('Croatian'),            'iso-8859-2'),
-	'hu':   (_('Hungarian'),           'iso-8859-2'),
-        'ia':   (_('Interlingua'),         'iso-8859-15'),
-	'it':   (_('Italian'),             'iso-8859-1'),
-	'ja':   (_('Japanese'),            'euc-jp'),
-	'ko':   (_('Korean'),              'euc-kr'),
-	'lt':   (_('Lithuanian'),          'iso-8859-13'),
-	'nl':   (_('Dutch'),               'iso-8859-1'),
-	'no':   (_('Norwegian'),           'iso-8859-1'),
-	'pl':   (_('Polish'),              'iso-8859-2'),
-	'pt':   (_('Portuguese'),          'iso-8859-1'),
-	'pt_BR':(_('Portuguese (Brazil)'), 'iso-8859-1'),
-	'ro':   (_('Romanian'),            'iso-8859-2'),
-	'ru':   (_('Russian'),             'koi8-r'),
-	'sr':   (_('Serbian'),             'utf-8'),
-	'sl':   (_('Slovenian'),           'iso-8859-2'),
-	'sv':   (_('Swedish'),             'iso-8859-1'),
-	'tr':   (_('Turkish'),             'iso-8859-9'),
-	'uk':   (_('Ukrainian'),           'utf-8'),
-	'zh_CN':(_('Chinese (China)'),     'utf-8'),
-	'zh_TW':(_('Chinese (Taiwan)'),    'utf-8'),
-}
-
 LC_DESCRIPTIONS = {}
 
 def add_language(code, description, charset):
     LC_DESCRIPTIONS[code] = (description, charset)
 
-for lang in LANGUAGES.split():
-    if lang in LANGUAGE_DICT.keys():
-        add_language(lang, LANGUAGE_DICT[lang][0], LANGUAGE_DICT[lang][1])
+add_language('ca',    _('Catalan'),             'iso-8859-1')
+add_language('cs',    _('Czech'),               'iso-8859-2')
+add_language('da',    _('Danish'),              'iso-8859-1')
+add_language('de',    _('German'),              'iso-8859-1')
+add_language('en',    _('English (USA)'),       'us-ascii')
+add_language('es',    _('Spanish (Spain)'),     'iso-8859-1')
+add_language('et',    _('Estonian'),            'iso-8859-15')
+add_language('eu',    _('Euskara'),             'iso-8859-15') # ¥Ð¥¹¥¯¸ì
+add_language('fi',    _('Finnish'),             'iso-8859-1')
+add_language('fr',    _('French'),              'iso-8859-1')
+add_language('hr',    _('Croatian'),            'iso-8859-2')
+add_language('hu',    _('Hungarian'),           'iso-8859-2')
+add_language('ia',    _('Interlingua'),         'iso-8859-15')
+add_language('it',    _('Italian'),             'iso-8859-1')
+add_language('ja',    _('Japanese'),            'euc-jp')
+add_language('ko',    _('Korean'),              'euc-kr')
+add_language('lt',    _('Lithuanian'),          'iso-8859-13')
+add_language('nl',    _('Dutch'),               'iso-8859-1')
+add_language('no',    _('Norwegian'),           'iso-8859-1')
+add_language('pl',    _('Polish'),              'iso-8859-2')
+add_language('pt',    _('Portuguese'),          'iso-8859-1')
+add_language('pt_BR', _('Portuguese (Brazil)'), 'iso-8859-1')
+add_language('ro',    _('Romanian'),            'iso-8859-2')
+add_language('ru',    _('Russian'),             'koi8-r')
+add_language('sr',    _('Serbian'),             'utf-8')
+add_language('sl',    _('Slovenian'),           'iso-8859-2')
+add_language('sv',    _('Swedish'),             'iso-8859-1')
+add_language('tr',    _('Turkish'),             'iso-8859-9')
+add_language('uk',    _('Ukrainian'),           'utf-8')
+add_language('zh_CN', _('Chinese (China)'),     'utf-8')
+add_language('zh_TW', _('Chinese (Taiwan)'),    'utf-8')
 
 del _
diff -pru mailman-cvs-HEAD/messages/ja/doc/mailman-install.tex mailman-2.1.7.cg/messages/ja/doc/mailman-install.tex
--- mailman-cvs-HEAD/messages/ja/doc/mailman-install.tex	2005-08-28 15:12:36.000000000 +0200
+++ mailman-2.1.7.cg/messages/ja/doc/mailman-install.tex	2005-12-22 08:53:06.000000000 +0100
@@ -487,11 +487,13 @@ Postfix ¤È Mailman ¤òÅý¹ç¤¹¤ë¤È, ¿·¤·¤¤¥
       \file{data/aliases} ¤È \file{data/aliases.db} ¤Î½êÍ­¼Ô¤¬
       \code{mailman} ¤Ç, ¥°¥ë¡¼¥×½êÍ­¼Ô¤¬ \code{mailman} ¤Ç¤¢¤ë¤³¤È¤ò
       ³ÎÇ§¤·¤Æ¤¯¤À¤µ¤¤. ¤³¤ì¤é¤Ï configure ¥³¥Þ¥ó¥É¤ÇÀßÄê¤·¤¿¥æ¡¼¥¶
-      ¥°¥ë¡¼¥×¤Ç¤¹:
+      ¥°¥ë¡¼¥×¤Ç¤¹. ¤Þ¤¿, Î¾Êý¤Î¥Õ¥¡¥¤¥ë¤Ï¥°¥ë¡¼¥×½ñ¤­¹þ¤ßµö²Ä¤¬É¬Í×
+      ¤Ç¤¹:
 
       \begin{verbatim}
         % su
         % chown mailman:mailman data/aliases*
+        % chmod g+w data/aliases*
       \end{verbatim}
 
 \item Postfix ¤Î \file{main.cf} ¥Õ¥¡¥¤¥ë¤Î \var{alias_maps} ÊÑ¿ô¤¬
diff -pru mailman-cvs-HEAD/messages/mailman.pot mailman-2.1.7.cg/messages/mailman.pot
--- mailman-cvs-HEAD/messages/mailman.pot	2006-01-09 13:45:18.000000000 +0100
+++ mailman-2.1.7.cg/messages/mailman.pot	2005-12-20 01:52:24.000000000 +0100
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: Sun Jan  8 15:53:47 2006\n"
+"POT-Creation-Date: Tue Dec 20 09:46:16 2005\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,152 +15,152 @@ msgstr ""
 "Generated-By: pygettext.py 1.4\n"
 
 
-#: Mailman/Archiver/HyperArch.py:122
+#: Mailman/Archiver/HyperArch.py:121
 msgid "size not available"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:128
+#: Mailman/Archiver/HyperArch.py:127
 msgid " %(size)i bytes "
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:283 Mailman/Archiver/HyperArch.py:286
-#: Mailman/Archiver/HyperArch.py:419 Mailman/Archiver/HyperArch.py:471
-#: Mailman/Archiver/HyperArch.py:579 Mailman/Archiver/HyperArch.py:1048
-#: Mailman/Archiver/HyperArch.py:1177
+#: Mailman/Archiver/HyperArch.py:282 Mailman/Archiver/HyperArch.py:285
+#: Mailman/Archiver/HyperArch.py:418 Mailman/Archiver/HyperArch.py:470
+#: Mailman/Archiver/HyperArch.py:578 Mailman/Archiver/HyperArch.py:1047
+#: Mailman/Archiver/HyperArch.py:1176
 msgid " at "
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:500
+#: Mailman/Archiver/HyperArch.py:499
 msgid "Previous message:"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:522
+#: Mailman/Archiver/HyperArch.py:521
 msgid "Next message:"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:689 Mailman/Archiver/HyperArch.py:725
+#: Mailman/Archiver/HyperArch.py:688 Mailman/Archiver/HyperArch.py:724
 msgid "thread"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:690 Mailman/Archiver/HyperArch.py:726
+#: Mailman/Archiver/HyperArch.py:689 Mailman/Archiver/HyperArch.py:725
 msgid "subject"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:691 Mailman/Archiver/HyperArch.py:727
+#: Mailman/Archiver/HyperArch.py:690 Mailman/Archiver/HyperArch.py:726
 msgid "author"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:692 Mailman/Archiver/HyperArch.py:728
+#: Mailman/Archiver/HyperArch.py:691 Mailman/Archiver/HyperArch.py:727
 msgid "date"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:764
+#: Mailman/Archiver/HyperArch.py:763
 msgid "<P>Currently, there are no archives. </P>"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:802
+#: Mailman/Archiver/HyperArch.py:801
 msgid "Gzip'd Text%(sz)s"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:807
+#: Mailman/Archiver/HyperArch.py:806
 msgid "Text%(sz)s"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:897
+#: Mailman/Archiver/HyperArch.py:896
 msgid ""
 "figuring article archives\n"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:907
+#: Mailman/Archiver/HyperArch.py:906
 msgid "April"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:907
+#: Mailman/Archiver/HyperArch.py:906
 msgid "February"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:907
+#: Mailman/Archiver/HyperArch.py:906
 msgid "January"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:907
+#: Mailman/Archiver/HyperArch.py:906
 msgid "March"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:908
+#: Mailman/Archiver/HyperArch.py:907
 msgid "August"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:908
+#: Mailman/Archiver/HyperArch.py:907
 msgid "July"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:908
+#: Mailman/Archiver/HyperArch.py:907
 msgid "June"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:908 Mailman/i18n.py:102
+#: Mailman/Archiver/HyperArch.py:907 Mailman/i18n.py:102
 msgid "May"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:909
+#: Mailman/Archiver/HyperArch.py:908
 msgid "December"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:909
+#: Mailman/Archiver/HyperArch.py:908
 msgid "November"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:909
+#: Mailman/Archiver/HyperArch.py:908
 msgid "October"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:909
+#: Mailman/Archiver/HyperArch.py:908
 msgid "September"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:917
+#: Mailman/Archiver/HyperArch.py:916
 msgid "First"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:917
+#: Mailman/Archiver/HyperArch.py:916
 msgid "Fourth"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:917
+#: Mailman/Archiver/HyperArch.py:916
 msgid "Second"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:917
+#: Mailman/Archiver/HyperArch.py:916
 msgid "Third"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:919
+#: Mailman/Archiver/HyperArch.py:918
 msgid "%(ord)s quarter %(year)i"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:926
+#: Mailman/Archiver/HyperArch.py:925
 msgid "%(month)s %(year)i"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:931
+#: Mailman/Archiver/HyperArch.py:930
 msgid "The Week Of Monday %(day)i %(month)s %(year)i"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:935
+#: Mailman/Archiver/HyperArch.py:934
 msgid "%(day)i %(month)s %(year)i"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:1035
+#: Mailman/Archiver/HyperArch.py:1034
 msgid ""
 "Computing threaded index\n"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:1300
+#: Mailman/Archiver/HyperArch.py:1299
 msgid "Updating HTML for article %(seq)s"
 msgstr ""
 
-#: Mailman/Archiver/HyperArch.py:1307
+#: Mailman/Archiver/HyperArch.py:1306
 msgid "article file %(filename)s is missing!"
 msgstr ""
 
@@ -222,8 +222,8 @@ msgid " The last bounce received from yo
 msgstr ""
 
 #: Mailman/Bouncer.py:279 Mailman/Deliverer.py:145
-#: Mailman/Handlers/Acknowledge.py:44 Mailman/Handlers/CookHeaders.py:285
-#: Mailman/Handlers/Hold.py:209 Mailman/Handlers/ToDigest.py:236
+#: Mailman/Handlers/Acknowledge.py:44 Mailman/Handlers/CookHeaders.py:280
+#: Mailman/Handlers/Hold.py:209 Mailman/Handlers/ToDigest.py:238
 #: Mailman/ListAdmin.py:223
 msgid "(no subject)"
 msgstr ""
@@ -240,20 +240,20 @@ msgstr ""
 msgid "Administrator"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:75 Mailman/Cgi/admindb.py:90 Mailman/Cgi/confirm.py:62
-#: Mailman/Cgi/edithtml.py:69 Mailman/Cgi/listinfo.py:51
-#: Mailman/Cgi/options.py:78 Mailman/Cgi/private.py:108
+#: Mailman/Cgi/admin.py:74 Mailman/Cgi/admindb.py:89 Mailman/Cgi/confirm.py:61
+#: Mailman/Cgi/edithtml.py:68 Mailman/Cgi/listinfo.py:51
+#: Mailman/Cgi/options.py:78 Mailman/Cgi/private.py:109
 #: Mailman/Cgi/rmlist.py:64 Mailman/Cgi/roster.py:57
 #: Mailman/Cgi/subscribe.py:61
 msgid "No such list <em>%(safelistname)s</em>"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:90 Mailman/Cgi/admindb.py:106
-#: Mailman/Cgi/edithtml.py:87 Mailman/Cgi/private.py:133
+#: Mailman/Cgi/admin.py:89 Mailman/Cgi/admindb.py:105
+#: Mailman/Cgi/edithtml.py:86 Mailman/Cgi/private.py:134
 msgid "Authorization failed."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:180
+#: Mailman/Cgi/admin.py:179
 msgid ""
 "You have turned off delivery of both digest and\n"
 "                non-digest messages.  This is an incompatible state of\n"
@@ -262,54 +262,54 @@ msgid ""
 "                unusable."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:184 Mailman/Cgi/admin.py:190 Mailman/Cgi/admin.py:195
-#: Mailman/Cgi/admin.py:1437 Mailman/Gui/GUIBase.py:191
+#: Mailman/Cgi/admin.py:183 Mailman/Cgi/admin.py:189 Mailman/Cgi/admin.py:194
+#: Mailman/Cgi/admin.py:1436 Mailman/Gui/GUIBase.py:191
 msgid "Warning: "
 msgstr ""
 
-#: Mailman/Cgi/admin.py:188
+#: Mailman/Cgi/admin.py:187
 msgid ""
 "You have digest members, but digests are turned\n"
 "                off. Those people will not receive mail."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:193
+#: Mailman/Cgi/admin.py:192
 msgid ""
 "You have regular list members but non-digestified mail is\n"
 "                turned off.  They will receive mail until you fix this\n"
 "                problem."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:217
+#: Mailman/Cgi/admin.py:216
 msgid "%(hostname)s mailing lists - Admin Links"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:247 Mailman/Cgi/listinfo.py:100
+#: Mailman/Cgi/admin.py:246 Mailman/Cgi/listinfo.py:100
 msgid "Welcome!"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:250 Mailman/Cgi/listinfo.py:103
+#: Mailman/Cgi/admin.py:249 Mailman/Cgi/listinfo.py:103
 msgid "Mailman"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:254
+#: Mailman/Cgi/admin.py:253
 msgid ""
 "<p>There currently are no publicly-advertised %(mailmanlink)s\n"
 "            mailing lists on %(hostname)s."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:260
+#: Mailman/Cgi/admin.py:259
 msgid ""
 "<p>Below is the collection of publicly-advertised\n"
 "            %(mailmanlink)s mailing lists on %(hostname)s.  Click on a list\n"
 "            name to visit the configuration pages for that list."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:267
+#: Mailman/Cgi/admin.py:266
 msgid "right "
 msgstr ""
 
-#: Mailman/Cgi/admin.py:269
+#: Mailman/Cgi/admin.py:268
 msgid ""
 "To visit the administrators configuration page for an\n"
 "        unadvertised list, open a URL similar to this one, but with a '/' and\n"
@@ -319,42 +319,42 @@ msgid ""
 "        <p>General list information can be found at "
 msgstr ""
 
-#: Mailman/Cgi/admin.py:276
+#: Mailman/Cgi/admin.py:275
 msgid "the mailing list overview page"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:278
+#: Mailman/Cgi/admin.py:277
 msgid "<p>(Send questions and comments to "
 msgstr ""
 
-#: Mailman/Cgi/admin.py:288 Mailman/Cgi/listinfo.py:135 cron/mailpasswds:216
+#: Mailman/Cgi/admin.py:287 Mailman/Cgi/listinfo.py:135 cron/mailpasswds:216
 msgid "List"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:289 Mailman/Cgi/admin.py:555
+#: Mailman/Cgi/admin.py:288 Mailman/Cgi/admin.py:554
 #: Mailman/Cgi/listinfo.py:136
 msgid "Description"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:295 Mailman/Cgi/listinfo.py:142 bin/list_lists:116
+#: Mailman/Cgi/admin.py:294 Mailman/Cgi/listinfo.py:142 bin/list_lists:116
 msgid "[no description available]"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:328
+#: Mailman/Cgi/admin.py:327
 msgid "No valid variable name found."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:338
+#: Mailman/Cgi/admin.py:337
 msgid ""
 "%(realname)s Mailing list Configuration Help\n"
 "    <br><em>%(varname)s</em> Option"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:345
+#: Mailman/Cgi/admin.py:344
 msgid "Mailman %(varname)s List Option Help"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:363
+#: Mailman/Cgi/admin.py:362
 msgid ""
 "<em><strong>Warning:</strong> changing this option here\n"
 "    could cause other screens to be out-of-sync.  Be sure to reload any other\n"
@@ -362,315 +362,315 @@ msgid ""
 "    "
 msgstr ""
 
-#: Mailman/Cgi/admin.py:374
+#: Mailman/Cgi/admin.py:373
 msgid "return to the %(categoryname)s options page."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:389
+#: Mailman/Cgi/admin.py:388
 msgid "%(realname)s Administration (%(label)s)"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:390
+#: Mailman/Cgi/admin.py:389
 msgid "%(realname)s mailing list administration<br>%(label)s Section"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:406
+#: Mailman/Cgi/admin.py:405
 msgid "Configuration Categories"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:407
+#: Mailman/Cgi/admin.py:406
 msgid "Other Administrative Activities"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:411
+#: Mailman/Cgi/admin.py:410
 msgid "Tend to pending moderator requests"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:413
+#: Mailman/Cgi/admin.py:412
 msgid "Go to the general list information page"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:415
+#: Mailman/Cgi/admin.py:414
 msgid "Edit the public HTML pages and text files"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:417
+#: Mailman/Cgi/admin.py:416
 msgid "Go to list archives"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:423
+#: Mailman/Cgi/admin.py:422
 msgid "Delete this mailing list"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:424
+#: Mailman/Cgi/admin.py:423
 msgid " (requires confirmation)<br>&nbsp;<br>"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:430
+#: Mailman/Cgi/admin.py:429
 msgid "Logout"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:474
+#: Mailman/Cgi/admin.py:473
 msgid "Emergency moderation of all list traffic is enabled"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:485
+#: Mailman/Cgi/admin.py:484
 msgid ""
 "Make your changes in the following section, then submit them\n"
 "        using the <em>Submit Your Changes</em> button below."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:503
+#: Mailman/Cgi/admin.py:502
 msgid "Additional Member Tasks"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:509
+#: Mailman/Cgi/admin.py:508
 msgid ""
 "<li>Set everyone's moderation bit, including\n"
 "            those members not currently visible"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:513
+#: Mailman/Cgi/admin.py:512
 msgid "Off"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:513
+#: Mailman/Cgi/admin.py:512
 msgid "On"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:515
+#: Mailman/Cgi/admin.py:514
 msgid "Set"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:556
+#: Mailman/Cgi/admin.py:555
 msgid "Value"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:610
+#: Mailman/Cgi/admin.py:609
 msgid ""
 "Badly formed options entry:\n"
 " %(record)s"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:668
+#: Mailman/Cgi/admin.py:667
 msgid "<em>Enter the text below, or...</em><br>"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:670
+#: Mailman/Cgi/admin.py:669
 msgid "<br><em>...specify a file to upload</em><br>"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:696 Mailman/Cgi/admin.py:699
+#: Mailman/Cgi/admin.py:695 Mailman/Cgi/admin.py:698
 msgid "Topic %(i)d"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:700 Mailman/Cgi/admin.py:750
+#: Mailman/Cgi/admin.py:699 Mailman/Cgi/admin.py:749
 msgid "Delete"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:701
+#: Mailman/Cgi/admin.py:700
 msgid "Topic name:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:703
+#: Mailman/Cgi/admin.py:702
 msgid "Regexp:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:706 Mailman/Cgi/options.py:1029
+#: Mailman/Cgi/admin.py:705 Mailman/Cgi/options.py:1029
 msgid "Description:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:710 Mailman/Cgi/admin.py:768
+#: Mailman/Cgi/admin.py:709 Mailman/Cgi/admin.py:767
 msgid "Add new item..."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:712 Mailman/Cgi/admin.py:770
+#: Mailman/Cgi/admin.py:711 Mailman/Cgi/admin.py:769
 msgid "...before this one."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:713 Mailman/Cgi/admin.py:771
+#: Mailman/Cgi/admin.py:712 Mailman/Cgi/admin.py:770
 msgid "...after this one."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:746 Mailman/Cgi/admin.py:749
+#: Mailman/Cgi/admin.py:745 Mailman/Cgi/admin.py:748
 msgid "Spam Filter Rule %(i)d"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:751
+#: Mailman/Cgi/admin.py:750
 msgid "Spam Filter Regexp:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:762 Mailman/Cgi/admindb.py:302
-#: Mailman/Cgi/admindb.py:361 Mailman/Cgi/admindb.py:404
-#: Mailman/Cgi/admindb.py:638
+#: Mailman/Cgi/admin.py:761 Mailman/Cgi/admindb.py:301
+#: Mailman/Cgi/admindb.py:360 Mailman/Cgi/admindb.py:403
+#: Mailman/Cgi/admindb.py:637
 msgid "Defer"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:762 Mailman/Cgi/admindb.py:304
-#: Mailman/Cgi/admindb.py:363 Mailman/Cgi/admindb.py:404
-#: Mailman/Cgi/admindb.py:638 Mailman/Gui/ContentFilter.py:37
+#: Mailman/Cgi/admin.py:761 Mailman/Cgi/admindb.py:303
+#: Mailman/Cgi/admindb.py:362 Mailman/Cgi/admindb.py:403
+#: Mailman/Cgi/admindb.py:637 Mailman/Gui/ContentFilter.py:37
 #: Mailman/Gui/Privacy.py:216 Mailman/Gui/Privacy.py:290
 msgid "Reject"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:762 Mailman/Gui/Privacy.py:216
+#: Mailman/Cgi/admin.py:761 Mailman/Gui/Privacy.py:216
 #: Mailman/Gui/Privacy.py:290
 msgid "Hold"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:763 Mailman/Cgi/admindb.py:305
-#: Mailman/Cgi/admindb.py:364 Mailman/Cgi/admindb.py:404
-#: Mailman/Cgi/admindb.py:638 Mailman/Gui/ContentFilter.py:37
+#: Mailman/Cgi/admin.py:762 Mailman/Cgi/admindb.py:304
+#: Mailman/Cgi/admindb.py:363 Mailman/Cgi/admindb.py:403
+#: Mailman/Cgi/admindb.py:637 Mailman/Gui/ContentFilter.py:37
 #: Mailman/Gui/Privacy.py:216 Mailman/Gui/Privacy.py:290
 msgid "Discard"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:763 Mailman/Cgi/admindb.py:404
+#: Mailman/Cgi/admin.py:762 Mailman/Cgi/admindb.py:403
 #: Mailman/Gui/Privacy.py:290
 msgid "Accept"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:766 Mailman/Cgi/admindb.py:644
+#: Mailman/Cgi/admin.py:765 Mailman/Cgi/admindb.py:643
 msgid "Action:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:778
+#: Mailman/Cgi/admin.py:777
 msgid "Move rule up"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:779
+#: Mailman/Cgi/admin.py:778
 msgid "Move rule down"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:812
+#: Mailman/Cgi/admin.py:811
 msgid "<br>(Edit <b>%(varname)s</b>)"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:814
+#: Mailman/Cgi/admin.py:813
 msgid "<br>(Details for <b>%(varname)s</b>)"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:821
+#: Mailman/Cgi/admin.py:820
 msgid ""
 "<br><em><strong>Note:</strong>\n"
 "        setting this value performs an immediate action but does not modify\n"
 "        permanent state.</em>"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:835
+#: Mailman/Cgi/admin.py:834
 msgid "Mass Subscriptions"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:842
+#: Mailman/Cgi/admin.py:841
 msgid "Mass Removals"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:849
+#: Mailman/Cgi/admin.py:848
 msgid "Membership List"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:856
+#: Mailman/Cgi/admin.py:855
 msgid "(help)"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:857
+#: Mailman/Cgi/admin.py:856
 msgid "Find member %(link)s:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:860
+#: Mailman/Cgi/admin.py:859
 msgid "Search..."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:877
+#: Mailman/Cgi/admin.py:876
 msgid "Bad regular expression: "
 msgstr ""
 
-#: Mailman/Cgi/admin.py:933
+#: Mailman/Cgi/admin.py:932
 msgid "%(allcnt)s members total, %(membercnt)s shown"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:936
+#: Mailman/Cgi/admin.py:935
 msgid "%(allcnt)s members total"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:959
+#: Mailman/Cgi/admin.py:958
 msgid "unsub"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:960
+#: Mailman/Cgi/admin.py:959
 msgid "member address<br>member name"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:961
+#: Mailman/Cgi/admin.py:960
 msgid "hide"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:961
+#: Mailman/Cgi/admin.py:960
 msgid "mod"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:962
+#: Mailman/Cgi/admin.py:961
 msgid "nomail<br>[reason]"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:963
+#: Mailman/Cgi/admin.py:962
 msgid "ack"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:963
+#: Mailman/Cgi/admin.py:962
 msgid "not metoo"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:964
+#: Mailman/Cgi/admin.py:963
 msgid "nodupes"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:965
+#: Mailman/Cgi/admin.py:964
 msgid "digest"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:965
+#: Mailman/Cgi/admin.py:964
 msgid "plain"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:966
+#: Mailman/Cgi/admin.py:965
 msgid "language"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:977
+#: Mailman/Cgi/admin.py:976
 msgid "?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:978
+#: Mailman/Cgi/admin.py:977
 msgid "U"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:979
+#: Mailman/Cgi/admin.py:978
 msgid "A"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:980
+#: Mailman/Cgi/admin.py:979
 msgid "B"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1051
+#: Mailman/Cgi/admin.py:1050
 msgid "<b>unsub</b> -- Click on this to unsubscribe the member."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1053
+#: Mailman/Cgi/admin.py:1052
 msgid ""
 "<b>mod</b> -- The user's personal moderation flag.  If this is\n"
 "        set, postings from them will be moderated, otherwise they will be\n"
 "        approved."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1057
+#: Mailman/Cgi/admin.py:1056
 msgid ""
 "<b>hide</b> -- Is the member's address concealed on\n"
 "        the list of subscribers?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1059
+#: Mailman/Cgi/admin.py:1058
 msgid ""
 "<b>nomail</b> -- Is delivery to the member disabled?  If so, an\n"
 "        abbreviation will be given describing the reason for the disabled\n"
@@ -687,78 +687,78 @@ msgid ""
 "            </ul>"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1074
+#: Mailman/Cgi/admin.py:1073
 msgid ""
 "<b>ack</b> -- Does the member get acknowledgements of their\n"
 "        posts?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1077
+#: Mailman/Cgi/admin.py:1076
 msgid ""
 "<b>not metoo</b> -- Does the member want to avoid copies of their\n"
 "        own postings?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1080
+#: Mailman/Cgi/admin.py:1079
 msgid ""
 "<b>nodupes</b> -- Does the member want to avoid duplicates of the\n"
 "        same message?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1083
+#: Mailman/Cgi/admin.py:1082
 msgid ""
 "<b>digest</b> -- Does the member get messages in digests?\n"
 "        (otherwise, individual messages)"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1086
+#: Mailman/Cgi/admin.py:1085
 msgid ""
 "<b>plain</b> -- If getting digests, does the member get plain\n"
 "        text digests?  (otherwise, MIME)"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1088
+#: Mailman/Cgi/admin.py:1087
 msgid "<b>language</b> -- Language preferred by the user"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1102
+#: Mailman/Cgi/admin.py:1101
 msgid "Click here to hide the legend for this table."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1106
+#: Mailman/Cgi/admin.py:1105
 msgid "Click here to include the legend for this table."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1113
+#: Mailman/Cgi/admin.py:1112
 msgid ""
 "<p><em>To view more members, click on the appropriate\n"
 "        range listed below:</em>"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1122
+#: Mailman/Cgi/admin.py:1121
 msgid "from %(start)s to %(end)s"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1135
+#: Mailman/Cgi/admin.py:1134
 msgid "Subscribe these users now or invite them?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1137
+#: Mailman/Cgi/admin.py:1136
 msgid "Invite"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1137 Mailman/Cgi/listinfo.py:178
+#: Mailman/Cgi/admin.py:1136 Mailman/Cgi/listinfo.py:178
 msgid "Subscribe"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1143
+#: Mailman/Cgi/admin.py:1142
 msgid "Send welcome messages to new subscribees?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1145 Mailman/Cgi/admin.py:1154
-#: Mailman/Cgi/admin.py:1187 Mailman/Cgi/admin.py:1195
-#: Mailman/Cgi/confirm.py:290 Mailman/Cgi/create.py:341
-#: Mailman/Cgi/create.py:376 Mailman/Cgi/create.py:414
+#: Mailman/Cgi/admin.py:1144 Mailman/Cgi/admin.py:1153
+#: Mailman/Cgi/admin.py:1186 Mailman/Cgi/admin.py:1194
+#: Mailman/Cgi/confirm.py:289 Mailman/Cgi/create.py:340
+#: Mailman/Cgi/create.py:375 Mailman/Cgi/create.py:413
 #: Mailman/Cgi/rmlist.py:228 Mailman/Gui/Archive.py:33
 #: Mailman/Gui/Autoresponse.py:54 Mailman/Gui/Autoresponse.py:62
 #: Mailman/Gui/Autoresponse.py:71 Mailman/Gui/Bounce.py:77
@@ -782,10 +782,10 @@ msgstr ""
 msgid "No"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1145 Mailman/Cgi/admin.py:1154
-#: Mailman/Cgi/admin.py:1187 Mailman/Cgi/admin.py:1195
-#: Mailman/Cgi/confirm.py:290 Mailman/Cgi/create.py:341
-#: Mailman/Cgi/create.py:376 Mailman/Cgi/create.py:414
+#: Mailman/Cgi/admin.py:1144 Mailman/Cgi/admin.py:1153
+#: Mailman/Cgi/admin.py:1186 Mailman/Cgi/admin.py:1194
+#: Mailman/Cgi/confirm.py:289 Mailman/Cgi/create.py:340
+#: Mailman/Cgi/create.py:375 Mailman/Cgi/create.py:413
 #: Mailman/Cgi/rmlist.py:228 Mailman/Gui/Archive.py:33
 #: Mailman/Gui/Autoresponse.py:54 Mailman/Gui/Autoresponse.py:62
 #: Mailman/Gui/Bounce.py:77 Mailman/Gui/Bounce.py:120
@@ -809,38 +809,38 @@ msgstr ""
 msgid "Yes"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1152
+#: Mailman/Cgi/admin.py:1151
 msgid "Send notifications of new subscriptions to the list owner?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1160 Mailman/Cgi/admin.py:1201
+#: Mailman/Cgi/admin.py:1159 Mailman/Cgi/admin.py:1200
 msgid "Enter one address per line below..."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1165 Mailman/Cgi/admin.py:1206
+#: Mailman/Cgi/admin.py:1164 Mailman/Cgi/admin.py:1205
 msgid "...or specify a file to upload:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1170
+#: Mailman/Cgi/admin.py:1169
 msgid ""
 "Below, enter additional text to be added to the\n"
 "    top of your invitation or the subscription notification.  Include at least\n"
 "    one blank line at the end..."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1185
+#: Mailman/Cgi/admin.py:1184
 msgid "Send unsubscription acknowledgement to the user?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1193
+#: Mailman/Cgi/admin.py:1192
 msgid "Send notifications to the list owner?"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1215
+#: Mailman/Cgi/admin.py:1214
 msgid "Change list ownership passwords"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1218
+#: Mailman/Cgi/admin.py:1217
 msgid ""
 "The <em>list administrators</em> are the people who have ultimate control over\n"
 "all parameters of this mailing list.  They are able to change any list\n"
@@ -858,338 +858,338 @@ msgid ""
 "<a href=\"%(adminurl)s/general\">general options section</a>."
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1237
+#: Mailman/Cgi/admin.py:1236
 msgid "Enter new administrator password:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1239
+#: Mailman/Cgi/admin.py:1238
 msgid "Confirm administrator password:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1244
+#: Mailman/Cgi/admin.py:1243
 msgid "Enter new moderator password:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1246
+#: Mailman/Cgi/admin.py:1245
 msgid "Confirm moderator password:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1256
+#: Mailman/Cgi/admin.py:1255
 msgid "Submit Your Changes"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1279
+#: Mailman/Cgi/admin.py:1278
 msgid "Moderator passwords did not match"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1289
+#: Mailman/Cgi/admin.py:1288
 msgid "Administrator passwords did not match"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1338
+#: Mailman/Cgi/admin.py:1337
 msgid "Already a member"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1341
+#: Mailman/Cgi/admin.py:1340
 msgid "&lt;blank line&gt;"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1342 Mailman/Cgi/admin.py:1345
+#: Mailman/Cgi/admin.py:1341 Mailman/Cgi/admin.py:1344
 msgid "Bad/Invalid email address"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1348
+#: Mailman/Cgi/admin.py:1347
 msgid "Hostile address (illegal characters)"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1351
+#: Mailman/Cgi/admin.py:1350
 msgid "Banned address (matched %(pattern)s)"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1357
+#: Mailman/Cgi/admin.py:1356
 msgid "Successfully invited:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1359
+#: Mailman/Cgi/admin.py:1358
 msgid "Successfully subscribed:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1364
+#: Mailman/Cgi/admin.py:1363
 msgid "Error inviting:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1366
+#: Mailman/Cgi/admin.py:1365
 msgid "Error subscribing:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1395
+#: Mailman/Cgi/admin.py:1394
 msgid "Successfully Unsubscribed:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1400
+#: Mailman/Cgi/admin.py:1399
 msgid "Cannot unsubscribe non-members:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1412
+#: Mailman/Cgi/admin.py:1411
 msgid "Bad moderation flag value"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1433
+#: Mailman/Cgi/admin.py:1432
 msgid "Not subscribed"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1436
+#: Mailman/Cgi/admin.py:1435
 msgid "Ignoring changes to deleted member: %(user)s"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1476
+#: Mailman/Cgi/admin.py:1475
 msgid "Successfully Removed:"
 msgstr ""
 
-#: Mailman/Cgi/admin.py:1480
+#: Mailman/Cgi/admin.py:1479
 msgid "Error Unsubscribing:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:160 Mailman/Cgi/admindb.py:168
+#: Mailman/Cgi/admindb.py:159 Mailman/Cgi/admindb.py:167
 msgid "%(realname)s Administrative Database"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:163
+#: Mailman/Cgi/admindb.py:162
 msgid "%(realname)s Administrative Database Results"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:171
+#: Mailman/Cgi/admindb.py:170
 msgid "There are no pending requests."
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:174
+#: Mailman/Cgi/admindb.py:173
 msgid "Click here to reload this page."
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:185
+#: Mailman/Cgi/admindb.py:184
 msgid "Detailed instructions for the administrative database"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:189
+#: Mailman/Cgi/admindb.py:188
 msgid "Administrative requests for mailing list:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:192 Mailman/Cgi/admindb.py:247
+#: Mailman/Cgi/admindb.py:191 Mailman/Cgi/admindb.py:246
 msgid "Submit All Data"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:197 Mailman/Cgi/admindb.py:245
+#: Mailman/Cgi/admindb.py:196 Mailman/Cgi/admindb.py:244
 msgid "Discard all messages marked <em>Defer</em>"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:211
+#: Mailman/Cgi/admindb.py:210
 msgid "all of %(esender)s's held messages."
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:216
+#: Mailman/Cgi/admindb.py:215
 msgid "a single held message."
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:221
+#: Mailman/Cgi/admindb.py:220
 msgid "all held messages."
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:262
+#: Mailman/Cgi/admindb.py:261
 msgid "Mailman Administrative Database Error"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:267
+#: Mailman/Cgi/admindb.py:266
 msgid "list of available mailing lists."
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:268
+#: Mailman/Cgi/admindb.py:267
 msgid "You must specify a list name.  Here is the %(link)s"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:281
+#: Mailman/Cgi/admindb.py:280
 msgid "Subscription Requests"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:283
+#: Mailman/Cgi/admindb.py:282
 msgid "Address/name"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:284 Mailman/Cgi/admindb.py:335
+#: Mailman/Cgi/admindb.py:283 Mailman/Cgi/admindb.py:334
 msgid "Your decision"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:285 Mailman/Cgi/admindb.py:336
+#: Mailman/Cgi/admindb.py:284 Mailman/Cgi/admindb.py:335
 msgid "Reason for refusal"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:303 Mailman/Cgi/admindb.py:362
-#: Mailman/Cgi/admindb.py:638
+#: Mailman/Cgi/admindb.py:302 Mailman/Cgi/admindb.py:361
+#: Mailman/Cgi/admindb.py:637
 msgid "Approve"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:313
+#: Mailman/Cgi/admindb.py:312
 msgid "Permanently ban from this list"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:334
+#: Mailman/Cgi/admindb.py:333
 msgid "User address/name"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:374
+#: Mailman/Cgi/admindb.py:373
 msgid "Unsubscription Requests"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:397 Mailman/Cgi/admindb.py:621
+#: Mailman/Cgi/admindb.py:396 Mailman/Cgi/admindb.py:620
 msgid "From:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:400
+#: Mailman/Cgi/admindb.py:399
 msgid "Action to take on all these held messages:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:412
+#: Mailman/Cgi/admindb.py:411
 msgid "Preserve messages for the site administrator"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:418
+#: Mailman/Cgi/admindb.py:417
 msgid "Forward messages (individually) to:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:436
+#: Mailman/Cgi/admindb.py:435
 msgid "Clear this member's <em>moderate</em> flag"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:440
+#: Mailman/Cgi/admindb.py:439
 msgid "<em>The sender is now a member of this list</em>"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:449
+#: Mailman/Cgi/admindb.py:448
 msgid "Add <b>%(esender)s</b> to one of these sender filters:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:454
+#: Mailman/Cgi/admindb.py:453
 msgid "Accepts"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:454
+#: Mailman/Cgi/admindb.py:453
 msgid "Discards"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:454
+#: Mailman/Cgi/admindb.py:453
 msgid "Holds"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:454
+#: Mailman/Cgi/admindb.py:453
 msgid "Rejects"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:463
+#: Mailman/Cgi/admindb.py:462
 msgid ""
 "Ban <b>%(esender)s</b> from ever subscribing to this\n"
 "                    mailing list"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:468
+#: Mailman/Cgi/admindb.py:467
 msgid ""
 "Click on the message number to view the individual\n"
 "            message, or you can "
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:470
+#: Mailman/Cgi/admindb.py:469
 msgid "view all messages from %(esender)s"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:492 Mailman/Cgi/admindb.py:624
+#: Mailman/Cgi/admindb.py:491 Mailman/Cgi/admindb.py:623
 msgid "Subject:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:495
+#: Mailman/Cgi/admindb.py:494
 msgid " bytes"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:495
+#: Mailman/Cgi/admindb.py:494
 msgid "Size:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:499 Mailman/Handlers/Scrubber.py:209
-#: Mailman/Handlers/Scrubber.py:306 Mailman/Handlers/Scrubber.py:307
+#: Mailman/Cgi/admindb.py:498 Mailman/Handlers/Scrubber.py:208
+#: Mailman/Handlers/Scrubber.py:305 Mailman/Handlers/Scrubber.py:306
 msgid "not available"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:500 Mailman/Cgi/admindb.py:627
+#: Mailman/Cgi/admindb.py:499 Mailman/Cgi/admindb.py:626
 msgid "Reason:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:504 Mailman/Cgi/admindb.py:631
+#: Mailman/Cgi/admindb.py:503 Mailman/Cgi/admindb.py:630
 msgid "Received:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:562
+#: Mailman/Cgi/admindb.py:561
 msgid "Posting Held for Approval"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:564
+#: Mailman/Cgi/admindb.py:563
 msgid " (%(count)d of %(total)d)"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:575
+#: Mailman/Cgi/admindb.py:574
 msgid "<em>Message with id #%(id)d was lost."
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:584
+#: Mailman/Cgi/admindb.py:583
 msgid "<em>Message with id #%(id)d is corrupted."
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:648
+#: Mailman/Cgi/admindb.py:647
 msgid "Preserve message for site administrator"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:652
+#: Mailman/Cgi/admindb.py:651
 msgid "Additionally, forward this message to: "
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:656
+#: Mailman/Cgi/admindb.py:655
 msgid "[No explanation given]"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:658
+#: Mailman/Cgi/admindb.py:657
 msgid "If you reject this post,<br>please explain (optional):"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:664
+#: Mailman/Cgi/admindb.py:663
 msgid "Message Headers:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:669
+#: Mailman/Cgi/admindb.py:668
 msgid "Message Excerpt:"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:709 Mailman/Deliverer.py:143
+#: Mailman/Cgi/admindb.py:708 Mailman/Deliverer.py:143
 msgid "No reason given"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:771 Mailman/ListAdmin.py:296
+#: Mailman/Cgi/admindb.py:770 Mailman/ListAdmin.py:296
 #: Mailman/ListAdmin.py:414
 msgid "[No reason given]"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:803
+#: Mailman/Cgi/admindb.py:802
 msgid "Database Updated..."
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:806
+#: Mailman/Cgi/admindb.py:805
 msgid " is already a member"
 msgstr ""
 
-#: Mailman/Cgi/admindb.py:809
+#: Mailman/Cgi/admindb.py:808
 msgid "%(addr)s is banned (matched: %(patt)s)"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:76
+#: Mailman/Cgi/confirm.py:75
 msgid "Confirmation string was empty."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:96
+#: Mailman/Cgi/confirm.py:95
 msgid ""
 "<b>Invalid confirmation string:</b>\n"
 "    %(safecookie)s.\n"
@@ -1201,33 +1201,33 @@ msgid ""
 "    string."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:129
+#: Mailman/Cgi/confirm.py:128
 msgid ""
 "The address requesting unsubscription is not\n"
 "                a member of the mailing list.  Perhaps you have already been\n"
 "                unsubscribed, e.g. by the list administrator?"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:145
+#: Mailman/Cgi/confirm.py:144
 msgid ""
 "The address requesting to be changed has\n"
 "                    been subsequently unsubscribed.  This request has been\n"
 "                    cancelled."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:165
+#: Mailman/Cgi/confirm.py:164
 msgid "System error, bad content: %(content)s"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:175
+#: Mailman/Cgi/confirm.py:174
 msgid "Bad confirmation string"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:194
+#: Mailman/Cgi/confirm.py:193
 msgid "Enter confirmation cookie"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:207
+#: Mailman/Cgi/confirm.py:206
 msgid ""
 "Please enter the confirmation string\n"
 "    (i.e. <em>cookie</em>) that you received in your email message, in the box\n"
@@ -1235,19 +1235,19 @@ msgid ""
 "    confirmation step."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:212
+#: Mailman/Cgi/confirm.py:211
 msgid "Confirmation string:"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:214
+#: Mailman/Cgi/confirm.py:213
 msgid "Submit"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:231
+#: Mailman/Cgi/confirm.py:230
 msgid "Confirm subscription request"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:246
+#: Mailman/Cgi/confirm.py:245
 msgid ""
 "Your confirmation is required in order to complete the\n"
 "    subscription request to the mailing list <em>%(listname)s</em>.  Your\n"
@@ -1264,7 +1264,7 @@ msgid ""
 "    subscribe to this list."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:261
+#: Mailman/Cgi/confirm.py:260
 msgid ""
 "Your confirmation is required in order to continue with\n"
 "        the subscription request to the mailing list <em>%(listname)s</em>.\n"
@@ -1283,39 +1283,39 @@ msgid ""
 "        request</em>."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:279
+#: Mailman/Cgi/confirm.py:278
 msgid "Your email address:"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:280
+#: Mailman/Cgi/confirm.py:279
 msgid "Your real name:"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:289
+#: Mailman/Cgi/confirm.py:288
 msgid "Receive digests?"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:298
+#: Mailman/Cgi/confirm.py:297
 msgid "Preferred language:"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:303
+#: Mailman/Cgi/confirm.py:302
 msgid "Cancel my subscription request"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:304
+#: Mailman/Cgi/confirm.py:303
 msgid "Subscribe to list %(listname)s"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:321
+#: Mailman/Cgi/confirm.py:320
 msgid "You have canceled your subscription request."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:359
+#: Mailman/Cgi/confirm.py:358
 msgid "Awaiting moderator approval"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:362
+#: Mailman/Cgi/confirm.py:361
 msgid ""
 "            You have successfully confirmed your subscription request to the\n"
 "            mailing list %(listname)s, however final approval is required from\n"
@@ -1324,37 +1324,37 @@ msgid ""
 "            of the moderator's decision."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:369 Mailman/Cgi/confirm.py:434
-#: Mailman/Cgi/confirm.py:523 Mailman/Cgi/confirm.py:752
+#: Mailman/Cgi/confirm.py:368 Mailman/Cgi/confirm.py:433
+#: Mailman/Cgi/confirm.py:522 Mailman/Cgi/confirm.py:751
 msgid ""
 "Invalid confirmation string.  It is\n"
 "            possible that you are attempting to confirm a request for an\n"
 "            address that has already been unsubscribed."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:373
+#: Mailman/Cgi/confirm.py:372
 msgid "You are already a member of this mailing list!"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:376
+#: Mailman/Cgi/confirm.py:375
 msgid ""
 "You are currently banned from subscribing to\n"
 "            this list.  If you think this restriction is erroneous, please\n"
 "            contact the list owners at %(owneraddr)s."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:380
+#: Mailman/Cgi/confirm.py:379
 msgid ""
 "            You were not invited to this mailing list.  The invitation has\n"
 "            been discarded, and both list administrators have been\n"
 "            alerted."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:390
+#: Mailman/Cgi/confirm.py:389
 msgid "Subscription request confirmed"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:394
+#: Mailman/Cgi/confirm.py:393
 msgid ""
 "            You have successfully confirmed your subscription request for\n"
 "            \"%(addr)s\" to the %(listname)s mailing list.  A separate\n"
@@ -1366,30 +1366,30 @@ msgid ""
 "            page</a>."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:412
+#: Mailman/Cgi/confirm.py:411
 msgid "You have canceled your unsubscription request."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:440
+#: Mailman/Cgi/confirm.py:439
 msgid "Unsubscription request confirmed"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:444
+#: Mailman/Cgi/confirm.py:443
 msgid ""
 "            You have successfully unsubscribed from the %(listname)s mailing\n"
 "            list.  You can now <a href=\"%(listinfourl)s\">visit the list's main\n"
 "            information page</a>."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:455
+#: Mailman/Cgi/confirm.py:454
 msgid "Confirm unsubscription request"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:470 Mailman/Cgi/confirm.py:566
+#: Mailman/Cgi/confirm.py:469 Mailman/Cgi/confirm.py:565
 msgid "<em>Not available</em>"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:473
+#: Mailman/Cgi/confirm.py:472
 msgid ""
 "Your confirmation is required in order to complete the\n"
 "    unsubscription request from the mailing list <em>%(listname)s</em>.  You\n"
@@ -1406,31 +1406,31 @@ msgid ""
 "    request."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:489 Mailman/Cgi/options.py:746
+#: Mailman/Cgi/confirm.py:488 Mailman/Cgi/options.py:746
 #: Mailman/Cgi/options.py:887 Mailman/Cgi/options.py:897
 msgid "Unsubscribe"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:490 Mailman/Cgi/confirm.py:595
+#: Mailman/Cgi/confirm.py:489 Mailman/Cgi/confirm.py:594
 msgid "Cancel and discard"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:500
+#: Mailman/Cgi/confirm.py:499
 msgid "You have canceled your change of address request."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:529
+#: Mailman/Cgi/confirm.py:528
 msgid ""
 "%(newaddr)s is banned from subscribing to the\n"
 "            %(realname)s list.  If you think this restriction is erroneous,\n"
 "            please contact the list owners at %(owneraddr)s."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:535
+#: Mailman/Cgi/confirm.py:534
 msgid "Change of address request confirmed"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:539
+#: Mailman/Cgi/confirm.py:538
 msgid ""
 "            You have successfully changed your address on the %(listname)s\n"
 "            mailing list from <b>%(oldaddr)s</b> to <b>%(newaddr)s</b>.  You\n"
@@ -1438,15 +1438,15 @@ msgid ""
 "            login page</a>."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:551
+#: Mailman/Cgi/confirm.py:550
 msgid "Confirm change of address request"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:570
+#: Mailman/Cgi/confirm.py:569
 msgid "globally"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:573
+#: Mailman/Cgi/confirm.py:572
 msgid ""
 "Your confirmation is required in order to complete the\n"
 "    change of address request for the mailing list <em>%(listname)s</em>.  You\n"
@@ -1468,25 +1468,25 @@ msgid ""
 "    request."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:594
+#: Mailman/Cgi/confirm.py:593
 msgid "Change address"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:603 Mailman/Cgi/confirm.py:717
+#: Mailman/Cgi/confirm.py:602 Mailman/Cgi/confirm.py:716
 msgid "Continue awaiting approval"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:611
+#: Mailman/Cgi/confirm.py:610
 msgid ""
 "Okay, the list moderator will still have the\n"
 "    opportunity to approve or reject this message."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:637
+#: Mailman/Cgi/confirm.py:636
 msgid "Sender discarded message via web."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:639
+#: Mailman/Cgi/confirm.py:638
 msgid ""
 "The held message with the Subject:\n"
 "            header <em>%(subject)s</em> could not be found.  The most likely\n"
@@ -1495,28 +1495,28 @@ msgid ""
 "            time."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:647
+#: Mailman/Cgi/confirm.py:646
 msgid "Posted message canceled"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:650
+#: Mailman/Cgi/confirm.py:649
 msgid ""
 "            You have successfully canceled the posting of your message with\n"
 "            the Subject: header <em>%(subject)s</em> to the mailing list\n"
 "            %(listname)s."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:661
+#: Mailman/Cgi/confirm.py:660
 msgid "Cancel held message posting"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:686
+#: Mailman/Cgi/confirm.py:685
 msgid ""
 "The held message you were referred to has\n"
 "        already been handled by the list administrator."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:700
+#: Mailman/Cgi/confirm.py:699
 msgid ""
 "Your confirmation is required in order to cancel the\n"
 "    posting of your message to the mailing list <em>%(listname)s</em>:\n"
@@ -1532,22 +1532,22 @@ msgid ""
 "    allow the list moderator to approve or reject the message."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:716
+#: Mailman/Cgi/confirm.py:715
 msgid "Cancel posting"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:728
+#: Mailman/Cgi/confirm.py:727
 msgid ""
 "You have canceled the re-enabling of your membership.  If\n"
 "    we continue to receive bounces from your address, it could be deleted from\n"
 "    this mailing list."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:758
+#: Mailman/Cgi/confirm.py:757
 msgid "Membership re-enabled."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:762
+#: Mailman/Cgi/confirm.py:761
 msgid ""
 "            You have successfully re-enabled your membership in the\n"
 "            %(listname)s mailing list.  You can now <a\n"
@@ -1555,22 +1555,22 @@ msgid ""
 "            "
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:774
+#: Mailman/Cgi/confirm.py:773
 msgid "Re-enable mailing list membership"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:791
+#: Mailman/Cgi/confirm.py:790
 msgid ""
 "We're sorry, but you have already been unsubscribed\n"
 "        from this mailing list.  To re-subscribe, please visit the\n"
 "        <a href=\"%(listinfourl)s\">list information page</a>."
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:806
+#: Mailman/Cgi/confirm.py:805
 msgid "<em>not available</em>"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:810
+#: Mailman/Cgi/confirm.py:809
 msgid ""
 "Your membership in the %(realname)s mailing list is\n"
 "    currently disabled due to excessive bounces.  Your confirmation is\n"
@@ -1590,128 +1590,128 @@ msgid ""
 "    "
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:830
+#: Mailman/Cgi/confirm.py:829
 msgid "Re-enable membership"
 msgstr ""
 
-#: Mailman/Cgi/confirm.py:831
+#: Mailman/Cgi/confirm.py:830
 msgid "Cancel"
 msgstr ""
 
-#: Mailman/Cgi/create.py:49 Mailman/Cgi/rmlist.py:48
+#: Mailman/Cgi/create.py:48 Mailman/Cgi/rmlist.py:48
 msgid "Bad URL specification"
 msgstr ""
 
-#: Mailman/Cgi/create.py:64 Mailman/Cgi/rmlist.py:176
+#: Mailman/Cgi/create.py:63 Mailman/Cgi/rmlist.py:176
 msgid "Return to the "
 msgstr ""
 
-#: Mailman/Cgi/create.py:66 Mailman/Cgi/rmlist.py:178
+#: Mailman/Cgi/create.py:65 Mailman/Cgi/rmlist.py:178
 msgid "general list overview"
 msgstr ""
 
-#: Mailman/Cgi/create.py:67 Mailman/Cgi/rmlist.py:179
+#: Mailman/Cgi/create.py:66 Mailman/Cgi/rmlist.py:179
 msgid "<br>Return to the "
 msgstr ""
 
-#: Mailman/Cgi/create.py:69 Mailman/Cgi/rmlist.py:181
+#: Mailman/Cgi/create.py:68 Mailman/Cgi/rmlist.py:181
 msgid "administrative list overview"
 msgstr ""
 
-#: Mailman/Cgi/create.py:104
+#: Mailman/Cgi/create.py:103
 msgid "List name must not include \"@\": %(safelistname)s"
 msgstr ""
 
-#: Mailman/Cgi/create.py:111
+#: Mailman/Cgi/create.py:110
 msgid "List already exists: %(safelistname)s"
 msgstr ""
 
-#: Mailman/Cgi/create.py:115
+#: Mailman/Cgi/create.py:114
 msgid "You forgot to enter the list name"
 msgstr ""
 
-#: Mailman/Cgi/create.py:119
+#: Mailman/Cgi/create.py:118
 msgid "You forgot to specify the list owner"
 msgstr ""
 
-#: Mailman/Cgi/create.py:126
+#: Mailman/Cgi/create.py:125
 msgid ""
 "Leave the initial password (and confirmation) fields\n"
 "                blank if you want Mailman to autogenerate the list\n"
 "                passwords."
 msgstr ""
 
-#: Mailman/Cgi/create.py:135
+#: Mailman/Cgi/create.py:134
 msgid "Initial list passwords do not match"
 msgstr ""
 
-#: Mailman/Cgi/create.py:144
+#: Mailman/Cgi/create.py:143
 msgid "The list password cannot be empty<!-- ignore -->"
 msgstr ""
 
-#: Mailman/Cgi/create.py:156
+#: Mailman/Cgi/create.py:155
 msgid "You are not authorized to create new mailing lists"
 msgstr ""
 
-#: Mailman/Cgi/create.py:164
+#: Mailman/Cgi/create.py:163
 msgid "Unknown virtual host: %(safehostname)s"
 msgstr ""
 
-#: Mailman/Cgi/create.py:195 bin/newlist:202
+#: Mailman/Cgi/create.py:194 bin/newlist:202
 msgid "Bad owner email address: %(s)s"
 msgstr ""
 
-#: Mailman/Cgi/create.py:199 bin/newlist:170 bin/newlist:204
+#: Mailman/Cgi/create.py:198 bin/newlist:170 bin/newlist:204
 msgid "List already exists: %(listname)s"
 msgstr ""
 
-#: Mailman/Cgi/create.py:203 bin/newlist:200
+#: Mailman/Cgi/create.py:202 bin/newlist:200
 msgid "Illegal list name: %(s)s"
 msgstr ""
 
-#: Mailman/Cgi/create.py:208
+#: Mailman/Cgi/create.py:207
 msgid ""
 "Some unknown error occurred while creating the list.\n"
 "                Please contact the site administrator for assistance."
 msgstr ""
 
-#: Mailman/Cgi/create.py:245 bin/newlist:245
+#: Mailman/Cgi/create.py:244 bin/newlist:245
 msgid "Your new mailing list: %(listname)s"
 msgstr ""
 
-#: Mailman/Cgi/create.py:254
+#: Mailman/Cgi/create.py:253
 msgid "Mailing list creation results"
 msgstr ""
 
-#: Mailman/Cgi/create.py:260
+#: Mailman/Cgi/create.py:259
 msgid ""
 "You have successfully created the mailing list\n"
 "    <b>%(listname)s</b> and notification has been sent to the list owner\n"
 "    <b>%(owner)s</b>.  You can now:"
 msgstr ""
 
-#: Mailman/Cgi/create.py:264
+#: Mailman/Cgi/create.py:263
 msgid "Visit the list's info page"
 msgstr ""
 
-#: Mailman/Cgi/create.py:265
+#: Mailman/Cgi/create.py:264
 msgid "Visit the list's admin page"
 msgstr ""
 
-#: Mailman/Cgi/create.py:266
+#: Mailman/Cgi/create.py:265
 msgid "Create another list"
 msgstr ""
 
-#: Mailman/Cgi/create.py:284
+#: Mailman/Cgi/create.py:283
 msgid "Create a %(hostname)s Mailing List"
 msgstr ""
 
-#: Mailman/Cgi/create.py:293 Mailman/Cgi/rmlist.py:199
+#: Mailman/Cgi/create.py:292 Mailman/Cgi/rmlist.py:199
 #: Mailman/Gui/Bounce.py:187 Mailman/htmlformat.py:339
 msgid "Error: "
 msgstr ""
 
-#: Mailman/Cgi/create.py:295
+#: Mailman/Cgi/create.py:294
 msgid ""
 "You can create a new mailing list by entering the\n"
 "    relevant information into the form below.  The name of the mailing list\n"
@@ -1735,125 +1735,125 @@ msgid ""
 "    "
 msgstr ""
 
-#: Mailman/Cgi/create.py:321
+#: Mailman/Cgi/create.py:320
 msgid "List Identity"
 msgstr ""
 
-#: Mailman/Cgi/create.py:325
+#: Mailman/Cgi/create.py:324
 msgid "Name of list:"
 msgstr ""
 
-#: Mailman/Cgi/create.py:331
+#: Mailman/Cgi/create.py:330
 msgid "Initial list owner address:"
 msgstr ""
 
-#: Mailman/Cgi/create.py:340
+#: Mailman/Cgi/create.py:339
 msgid "Auto-generate initial list password?"
 msgstr ""
 
-#: Mailman/Cgi/create.py:348
+#: Mailman/Cgi/create.py:347
 msgid "Initial list password:"
 msgstr ""
 
-#: Mailman/Cgi/create.py:354
+#: Mailman/Cgi/create.py:353
 msgid "Confirm initial password:"
 msgstr ""
 
-#: Mailman/Cgi/create.py:369
+#: Mailman/Cgi/create.py:368
 msgid "List Characteristics"
 msgstr ""
 
-#: Mailman/Cgi/create.py:373
+#: Mailman/Cgi/create.py:372
 msgid ""
 "Should new members be quarantined before they\n"
 "    are allowed to post unmoderated to this list?  Answer <em>Yes</em> to hold\n"
 "    new member postings for moderator approval by default."
 msgstr ""
 
-#: Mailman/Cgi/create.py:402
+#: Mailman/Cgi/create.py:401
 msgid ""
 "Initial list of supported languages.  <p>Note that if you do not\n"
 "        select at least one initial language, the list will use the server\n"
 "        default language of %(deflang)s"
 msgstr ""
 
-#: Mailman/Cgi/create.py:413
+#: Mailman/Cgi/create.py:412
 msgid "Send \"list created\" email to list owner?"
 msgstr ""
 
-#: Mailman/Cgi/create.py:422
+#: Mailman/Cgi/create.py:421
 msgid "List creator's (authentication) password:"
 msgstr ""
 
-#: Mailman/Cgi/create.py:427
+#: Mailman/Cgi/create.py:426
 msgid "Create List"
 msgstr ""
 
-#: Mailman/Cgi/create.py:428
+#: Mailman/Cgi/create.py:427
 msgid "Clear Form"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:44
+#: Mailman/Cgi/edithtml.py:43
 msgid "General list information page"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:45
+#: Mailman/Cgi/edithtml.py:44
 msgid "Subscribe results page"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:46
+#: Mailman/Cgi/edithtml.py:45
 msgid "User specific options page"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:47
+#: Mailman/Cgi/edithtml.py:46
 msgid "Welcome email text file"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:59
+#: Mailman/Cgi/edithtml.py:58
 msgid "List name is required."
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:99
+#: Mailman/Cgi/edithtml.py:98
 msgid "%(realname)s -- Edit html for %(template_info)s"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:105
+#: Mailman/Cgi/edithtml.py:104
 msgid "Edit HTML : Error"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:106
+#: Mailman/Cgi/edithtml.py:105
 msgid "%(safetemplatename)s: Invalid template"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:111 Mailman/Cgi/edithtml.py:112
+#: Mailman/Cgi/edithtml.py:110 Mailman/Cgi/edithtml.py:111
 msgid "%(realname)s -- HTML Page Editing"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:113
+#: Mailman/Cgi/edithtml.py:112
 msgid "Select page to edit:"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:139
+#: Mailman/Cgi/edithtml.py:138
 msgid "View or edit the list configuration information."
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:147
+#: Mailman/Cgi/edithtml.py:146
 msgid "When you are done making changes..."
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:148
+#: Mailman/Cgi/edithtml.py:147
 msgid "Submit Changes"
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:155
+#: Mailman/Cgi/edithtml.py:154
 msgid "Can't have empty html page."
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:156
+#: Mailman/Cgi/edithtml.py:155
 msgid "HTML Unchanged."
 msgstr ""
 
-#: Mailman/Cgi/edithtml.py:176
+#: Mailman/Cgi/edithtml.py:175
 msgid "HTML successfully updated."
 msgstr ""
 
@@ -2240,23 +2240,23 @@ msgstr ""
 msgid "Pattern (as regexp):"
 msgstr ""
 
-#: Mailman/Cgi/private.py:64
+#: Mailman/Cgi/private.py:65
 msgid "Private Archive Error"
 msgstr ""
 
-#: Mailman/Cgi/private.py:65
+#: Mailman/Cgi/private.py:66
 msgid "You must specify a list."
 msgstr ""
 
-#: Mailman/Cgi/private.py:72
+#: Mailman/Cgi/private.py:73
 msgid "Private archive - \"./\" and \"../\" not allowed in URL."
 msgstr ""
 
-#: Mailman/Cgi/private.py:109
+#: Mailman/Cgi/private.py:110
 msgid "Private Archive Error - %(msg)s"
 msgstr ""
 
-#: Mailman/Cgi/private.py:178
+#: Mailman/Cgi/private.py:180
 msgid "Private archive file not found"
 msgstr ""
 
@@ -2397,7 +2397,7 @@ msgid ""
 "moderator's decision when they get to your request."
 msgstr ""
 
-#: Mailman/Cgi/subscribe.py:216 Mailman/Commands/cmd_confirm.py:61
+#: Mailman/Cgi/subscribe.py:216 Mailman/Commands/cmd_confirm.py:60
 msgid "You are already subscribed."
 msgstr ""
 
@@ -2433,7 +2433,7 @@ msgstr ""
 msgid "You have been successfully subscribed to the %(realname)s mailing list."
 msgstr ""
 
-#: Mailman/Commands/cmd_confirm.py:18
+#: Mailman/Commands/cmd_confirm.py:17
 #, docstring
 msgid ""
 "\n"
@@ -2442,13 +2442,13 @@ msgid ""
 "        supplied by a mailback confirmation notice.\n"
 msgstr ""
 
-#: Mailman/Commands/cmd_confirm.py:41 Mailman/Commands/cmd_lists.py:40
+#: Mailman/Commands/cmd_confirm.py:40 Mailman/Commands/cmd_lists.py:40
 #: Mailman/Commands/cmd_set.py:133 Mailman/Commands/cmd_subscribe.py:69
 #: Mailman/Commands/cmd_unsubscribe.py:52 Mailman/Commands/cmd_who.py:65
 msgid "Usage:"
 msgstr ""
 
-#: Mailman/Commands/cmd_confirm.py:50
+#: Mailman/Commands/cmd_confirm.py:49
 msgid ""
 "Invalid confirmation string.  Note that confirmation strings expire\n"
 "approximately %(days)s days after the initial subscription request.  If your\n"
@@ -2456,34 +2456,34 @@ msgid ""
 "message."
 msgstr ""
 
-#: Mailman/Commands/cmd_confirm.py:56
+#: Mailman/Commands/cmd_confirm.py:55
 msgid "Your request has been forwarded to the list moderator for approval."
 msgstr ""
 
-#: Mailman/Commands/cmd_confirm.py:64
+#: Mailman/Commands/cmd_confirm.py:63
 msgid ""
 "You are not currently a member.  Have you already unsubscribed or changed\n"
 "your email address?"
 msgstr ""
 
-#: Mailman/Commands/cmd_confirm.py:69
+#: Mailman/Commands/cmd_confirm.py:68
 msgid ""
 "You are currently banned from subscribing to this list.  If you think this\n"
 "restriction is erroneous, please contact the list owners at\n"
 "%(owneraddr)s."
 msgstr ""
 
-#: Mailman/Commands/cmd_confirm.py:74
+#: Mailman/Commands/cmd_confirm.py:73
 msgid ""
 "You were not invited to this mailing list.  The invitation has been discarded,\n"
 "and both list administrators have been alerted."
 msgstr ""
 
-#: Mailman/Commands/cmd_confirm.py:78
+#: Mailman/Commands/cmd_confirm.py:77
 msgid "Bad approval password given.  Held message is still being held."
 msgstr ""
 
-#: Mailman/Commands/cmd_confirm.py:87
+#: Mailman/Commands/cmd_confirm.py:86
 msgid "Confirmation succeeded"
 msgstr ""
 
@@ -2975,127 +2975,127 @@ msgstr ""
 msgid "Digest members:"
 msgstr ""
 
-#: Mailman/Defaults.py:1321
+#: Mailman/Defaults.py:1315
 msgid "Catalan"
 msgstr ""
 
-#: Mailman/Defaults.py:1322
+#: Mailman/Defaults.py:1316
 msgid "Czech"
 msgstr ""
 
-#: Mailman/Defaults.py:1323
+#: Mailman/Defaults.py:1317
 msgid "Danish"
 msgstr ""
 
-#: Mailman/Defaults.py:1324
+#: Mailman/Defaults.py:1318
 msgid "German"
 msgstr ""
 
-#: Mailman/Defaults.py:1325
+#: Mailman/Defaults.py:1319
 msgid "English (USA)"
 msgstr ""
 
-#: Mailman/Defaults.py:1326
+#: Mailman/Defaults.py:1320
 msgid "Spanish (Spain)"
 msgstr ""
 
-#: Mailman/Defaults.py:1327
+#: Mailman/Defaults.py:1321
 msgid "Estonian"
 msgstr ""
 
-#: Mailman/Defaults.py:1328
+#: Mailman/Defaults.py:1322
 msgid "Euskara"
 msgstr ""
 
-#: Mailman/Defaults.py:1329
+#: Mailman/Defaults.py:1323
 msgid "Finnish"
 msgstr ""
 
-#: Mailman/Defaults.py:1330
+#: Mailman/Defaults.py:1324
 msgid "French"
 msgstr ""
 
-#: Mailman/Defaults.py:1331
+#: Mailman/Defaults.py:1325
 msgid "Croatian"
 msgstr ""
 
-#: Mailman/Defaults.py:1332
+#: Mailman/Defaults.py:1326
 msgid "Hungarian"
 msgstr ""
 
-#: Mailman/Defaults.py:1333
+#: Mailman/Defaults.py:1327
 msgid "Interlingua"
 msgstr ""
 
-#: Mailman/Defaults.py:1334
+#: Mailman/Defaults.py:1328
 msgid "Italian"
 msgstr ""
 
-#: Mailman/Defaults.py:1335
+#: Mailman/Defaults.py:1329
 msgid "Japanese"
 msgstr ""
 
-#: Mailman/Defaults.py:1336
+#: Mailman/Defaults.py:1330
 msgid "Korean"
 msgstr ""
 
-#: Mailman/Defaults.py:1337
+#: Mailman/Defaults.py:1331
 msgid "Lithuanian"
 msgstr ""
 
-#: Mailman/Defaults.py:1338
+#: Mailman/Defaults.py:1332
 msgid "Dutch"
 msgstr ""
 
-#: Mailman/Defaults.py:1339
+#: Mailman/Defaults.py:1333
 msgid "Norwegian"
 msgstr ""
 
-#: Mailman/Defaults.py:1340
+#: Mailman/Defaults.py:1334
 msgid "Polish"
 msgstr ""
 
-#: Mailman/Defaults.py:1341
+#: Mailman/Defaults.py:1335
 msgid "Portuguese"
 msgstr ""
 
-#: Mailman/Defaults.py:1342
+#: Mailman/Defaults.py:1336
 msgid "Portuguese (Brazil)"
 msgstr ""
 
-#: Mailman/Defaults.py:1343
+#: Mailman/Defaults.py:1337
 msgid "Romanian"
 msgstr ""
 
-#: Mailman/Defaults.py:1344
+#: Mailman/Defaults.py:1338
 msgid "Russian"
 msgstr ""
 
-#: Mailman/Defaults.py:1345
+#: Mailman/Defaults.py:1339
 msgid "Serbian"
 msgstr ""
 
-#: Mailman/Defaults.py:1346
+#: Mailman/Defaults.py:1340
 msgid "Slovenian"
 msgstr ""
 
-#: Mailman/Defaults.py:1347
+#: Mailman/Defaults.py:1341
 msgid "Swedish"
 msgstr ""
 
-#: Mailman/Defaults.py:1348
+#: Mailman/Defaults.py:1342
 msgid "Turkish"
 msgstr ""
 
-#: Mailman/Defaults.py:1349
+#: Mailman/Defaults.py:1343
 msgid "Ukrainian"
 msgstr ""
 
-#: Mailman/Defaults.py:1350
+#: Mailman/Defaults.py:1344
 msgid "Chinese (China)"
 msgstr ""
 
-#: Mailman/Defaults.py:1351
+#: Mailman/Defaults.py:1345
 msgid "Chinese (Taiwan)"
 msgstr ""
 
@@ -5536,23 +5536,23 @@ msgid ""
 "also appear in the first line of the body of the reply."
 msgstr ""
 
-#: Mailman/Handlers/MimeDel.py:59
+#: Mailman/Handlers/MimeDel.py:58
 msgid "The message's content type was explicitly disallowed"
 msgstr ""
 
-#: Mailman/Handlers/MimeDel.py:64
+#: Mailman/Handlers/MimeDel.py:63
 msgid "The message's content type was not explicitly allowed"
 msgstr ""
 
-#: Mailman/Handlers/MimeDel.py:72
+#: Mailman/Handlers/MimeDel.py:71
 msgid "The message's file extension was explicitly disallowed"
 msgstr ""
 
-#: Mailman/Handlers/MimeDel.py:75
+#: Mailman/Handlers/MimeDel.py:74
 msgid "The message's file extension was not explicitly allowed"
 msgstr ""
 
-#: Mailman/Handlers/MimeDel.py:87
+#: Mailman/Handlers/MimeDel.py:86
 msgid "After content filtering, the message was empty"
 msgstr ""
 
@@ -5591,36 +5591,36 @@ msgstr ""
 msgid "The Mailman Replybot"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:211
+#: Mailman/Handlers/Scrubber.py:210
 msgid ""
 "An embedded and charset-unspecified text was scrubbed...\n"
 "Name: %(filename)s\n"
 "Url: %(url)s\n"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:221
+#: Mailman/Handlers/Scrubber.py:220
 msgid "HTML attachment scrubbed and removed"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:237 Mailman/Handlers/Scrubber.py:262
+#: Mailman/Handlers/Scrubber.py:236 Mailman/Handlers/Scrubber.py:261
 msgid ""
 "An HTML attachment was scrubbed...\n"
 "URL: %(url)s\n"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:274
+#: Mailman/Handlers/Scrubber.py:273
 msgid "no subject"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:275
+#: Mailman/Handlers/Scrubber.py:274
 msgid "no date"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:276
+#: Mailman/Handlers/Scrubber.py:275
 msgid "unknown sender"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:278
+#: Mailman/Handlers/Scrubber.py:277
 msgid ""
 "An embedded message was scrubbed...\n"
 "From: %(who)s\n"
@@ -5630,7 +5630,7 @@ msgid ""
 "Url: %(url)s\n"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:309
+#: Mailman/Handlers/Scrubber.py:308
 msgid ""
 "A non-text attachment was scrubbed...\n"
 "Name: %(filename)s\n"
@@ -5640,58 +5640,58 @@ msgid ""
 "Url : %(url)s\n"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:344
+#: Mailman/Handlers/Scrubber.py:343
 msgid ""
 "Skipped content of type %(partctype)s\n"
 msgstr ""
 
-#: Mailman/Handlers/Scrubber.py:384
+#: Mailman/Handlers/Scrubber.py:383
 msgid ""
 "-------------- next part --------------\n"
 msgstr ""
 
-#: Mailman/Handlers/SpamDetect.py:55
+#: Mailman/Handlers/SpamDetect.py:54
 msgid "The message headers matched a filter rule"
 msgstr ""
 
-#: Mailman/Handlers/SpamDetect.py:134
+#: Mailman/Handlers/SpamDetect.py:136
 msgid "Message rejected by filter rule match"
 msgstr ""
 
-#: Mailman/Handlers/ToDigest.py:159
+#: Mailman/Handlers/ToDigest.py:161
 msgid "%(realname)s Digest, Vol %(volume)d, Issue %(issue)d"
 msgstr ""
 
-#: Mailman/Handlers/ToDigest.py:205
+#: Mailman/Handlers/ToDigest.py:207
 msgid "digest header"
 msgstr ""
 
-#: Mailman/Handlers/ToDigest.py:208
+#: Mailman/Handlers/ToDigest.py:210
 msgid "Digest Header"
 msgstr ""
 
-#: Mailman/Handlers/ToDigest.py:221
+#: Mailman/Handlers/ToDigest.py:223
 msgid ""
 "Today's Topics:\n"
 msgstr ""
 
-#: Mailman/Handlers/ToDigest.py:301
+#: Mailman/Handlers/ToDigest.py:303
 msgid "Today's Topics (%(msgcount)d messages)"
 msgstr ""
 
-#: Mailman/Handlers/ToDigest.py:327
+#: Mailman/Handlers/ToDigest.py:329
 msgid "[Message discarded by content filter]"
 msgstr ""
 
-#: Mailman/Handlers/ToDigest.py:359
+#: Mailman/Handlers/ToDigest.py:361
 msgid "digest footer"
 msgstr ""
 
-#: Mailman/Handlers/ToDigest.py:362
+#: Mailman/Handlers/ToDigest.py:364
 msgid "Digest Footer"
 msgstr ""
 
-#: Mailman/Handlers/ToDigest.py:376
+#: Mailman/Handlers/ToDigest.py:378
 msgid "End of "
 msgstr ""
 
@@ -5727,7 +5727,7 @@ msgstr ""
 msgid "Request to mailing list %(realname)s rejected"
 msgstr ""
 
-#: Mailman/MTA/Manual.py:66
+#: Mailman/MTA/Manual.py:65
 msgid ""
 "The mailing list `%(listname)s' has been created via the through-the-web\n"
 "interface.  In order to complete the activation of this mailing list, the\n"
@@ -5737,22 +5737,22 @@ msgid ""
 "Here are the entries for the /etc/aliases file:\n"
 msgstr ""
 
-#: Mailman/MTA/Manual.py:77
+#: Mailman/MTA/Manual.py:76
 msgid ""
 "To finish creating your mailing list, you must edit your /etc/aliases (or\n"
 "equivalent) file by adding the following lines, and possibly running the\n"
 "`newaliases' program:\n"
 msgstr ""
 
-#: Mailman/MTA/Manual.py:82
+#: Mailman/MTA/Manual.py:81
 msgid "## %(listname)s mailing list"
 msgstr ""
 
-#: Mailman/MTA/Manual.py:99
+#: Mailman/MTA/Manual.py:98
 msgid "Mailing list creation request for list %(listname)s"
 msgstr ""
 
-#: Mailman/MTA/Manual.py:113
+#: Mailman/MTA/Manual.py:112
 msgid ""
 "The mailing list `%(listname)s' has been removed via the through-the-web\n"
 "interface.  In order to complete the de-activation of this mailing list, the\n"
@@ -5762,7 +5762,7 @@ msgid ""
 "Here are the entries in the /etc/aliases file that should be removed:\n"
 msgstr ""
 
-#: Mailman/MTA/Manual.py:123
+#: Mailman/MTA/Manual.py:122
 msgid ""
 "\n"
 "To finish removing your mailing list, you must edit your /etc/aliases (or\n"
@@ -5772,7 +5772,7 @@ msgid ""
 "## %(listname)s mailing list"
 msgstr ""
 
-#: Mailman/MTA/Manual.py:142
+#: Mailman/MTA/Manual.py:141
 msgid "Mailing list removal request for list %(listname)s"
 msgstr ""
 
@@ -5805,39 +5805,39 @@ msgstr ""
 msgid "%(dbfile)s permissions must be 066x (got %(octmode)s)"
 msgstr ""
 
-#: Mailman/MailList.py:215
+#: Mailman/MailList.py:214
 msgid "Your confirmation is required to join the %(listname)s mailing list"
 msgstr ""
 
-#: Mailman/MailList.py:225
+#: Mailman/MailList.py:224
 msgid "Your confirmation is required to leave the %(listname)s mailing list"
 msgstr ""
 
-#: Mailman/MailList.py:878 Mailman/MailList.py:1290
+#: Mailman/MailList.py:877 Mailman/MailList.py:1289
 msgid " from %(remote)s"
 msgstr ""
 
-#: Mailman/MailList.py:911
+#: Mailman/MailList.py:910
 msgid "subscriptions to %(realname)s require moderator approval"
 msgstr ""
 
-#: Mailman/MailList.py:980 bin/add_members:242
+#: Mailman/MailList.py:979 bin/add_members:242
 msgid "%(realname)s subscription notification"
 msgstr ""
 
-#: Mailman/MailList.py:999
+#: Mailman/MailList.py:998
 msgid "unsubscriptions require moderator approval"
 msgstr ""
 
-#: Mailman/MailList.py:1019
+#: Mailman/MailList.py:1018
 msgid "%(realname)s unsubscribe notification"
 msgstr ""
 
-#: Mailman/MailList.py:1199
+#: Mailman/MailList.py:1198
 msgid "subscriptions to %(name)s require administrator approval"
 msgstr ""
 
-#: Mailman/MailList.py:1462
+#: Mailman/MailList.py:1461
 msgid "Last autoresponse notification for today"
 msgstr ""
 
@@ -6068,9 +6068,9 @@ msgstr ""
 msgid "Cannot read both digest and normal members from standard input."
 msgstr ""
 
-#: bin/add_members:210 bin/config_list:109 bin/find_member:97 bin/inject:90
-#: bin/list_admins:89 bin/list_members:232 bin/sync_members:222
-#: cron/bumpdigests:86
+#: bin/add_members:210 bin/config_list:108 bin/config_list.orig:105
+#: bin/find_member:97 bin/inject:90 bin/list_admins:89 bin/list_members:232
+#: bin/sync_members:222 cron/bumpdigests:86
 msgid "No such list: %(listname)s"
 msgstr ""
 
@@ -6126,7 +6126,7 @@ msgstr ""
 msgid "listname is required"
 msgstr ""
 
-#: bin/arch:143 bin/change_pw:106 bin/config_list:256
+#: bin/arch:143 bin/change_pw:106 bin/config_list:255 bin/config_list.orig:242
 msgid ""
 "No such list \"%(listname)s\"\n"
 "%(e)s"
@@ -6545,7 +6545,7 @@ msgid ""
 "%(e)s"
 msgstr ""
 
-#: bin/config_list:20
+#: bin/config_list:19 bin/config_list.orig:19
 #, docstring
 msgid ""
 "Configure a list from a text file description.\n"
@@ -6593,7 +6593,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: bin/config_list:117
+#: bin/config_list:116
 msgid ""
 "# -*- python -*-\n"
 "# -*- coding: %(charset)s -*-\n"
@@ -6601,46 +6601,52 @@ msgid ""
 "## captured on %(when)s\n"
 msgstr ""
 
-#: bin/config_list:143
+#: bin/config_list:142 bin/config_list.orig:131
 msgid "options"
 msgstr ""
 
-#: bin/config_list:202
+#: bin/config_list:201 bin/config_list.orig:188
 msgid "legal values are:"
 msgstr ""
 
-#: bin/config_list:269
+#: bin/config_list:268 bin/config_list.orig:255
 msgid "attribute \"%(k)s\" ignored"
 msgstr ""
 
-#: bin/config_list:272
+#: bin/config_list:271 bin/config_list.orig:258
 msgid "attribute \"%(k)s\" changed"
 msgstr ""
 
-#: bin/config_list:278
+#: bin/config_list:277 bin/config_list.orig:264
 msgid "Non-standard property restored: %(k)s"
 msgstr ""
 
-#: bin/config_list:286
+#: bin/config_list:285 bin/config_list.orig:272
 msgid "Invalid value for property: %(k)s"
 msgstr ""
 
-#: bin/config_list:288
+#: bin/config_list:287 bin/config_list.orig:274
 msgid "Bad email address for option %(k)s: %(v)s"
 msgstr ""
 
-#: bin/config_list:345
+#: bin/config_list:344 bin/config_list.orig:331
 msgid "Only one of -i or -o is allowed"
 msgstr ""
 
-#: bin/config_list:347
+#: bin/config_list:346 bin/config_list.orig:333
 msgid "One of -i or -o is required"
 msgstr ""
 
-#: bin/config_list:351
+#: bin/config_list:350 bin/config_list.orig:337
 msgid "List name is required"
 msgstr ""
 
+#: bin/config_list.orig:109
+msgid ""
+"## \"%(listname)s\" mailing list configuration settings -*- python -*-\n"
+"## captured on %(when)s\n"
+msgstr ""
+
 #: bin/convert.py:19
 #, docstring
 msgid ""
@@ -7389,16 +7395,6 @@ msgstr ""
 msgid "Hit enter to notify %(listname)s owner..."
 msgstr ""
 
-#: bin/po2templ.py:23
-#, docstring
-msgid ""
-"po2templ.py\n"
-"\n"
-"Extract templates from language po file.\n"
-"\n"
-"Usage: po2templ.py languages\n"
-msgstr ""
-
 #: bin/qrunner:19
 #, docstring
 msgid ""
@@ -7495,7 +7491,7 @@ msgid ""
 "This script is provided for convenience purposes only.  It isn't supported.\n"
 msgstr ""
 
-#: bin/remove_members:20
+#: bin/remove_members:19
 #, docstring
 msgid ""
 "Remove members from a list.\n"
@@ -7538,6 +7534,7 @@ msgid ""
 "    listname is the name of the mailing list to use.\n"
 "\n"
 "    addr1 ... are additional addresses to remove.\n"
+"\n"
 msgstr ""
 
 #: bin/remove_members:156
@@ -7774,20 +7771,6 @@ msgstr ""
 msgid "Removed: %(s)s"
 msgstr ""
 
-#: bin/templ2pot.py:5
-#, docstring
-msgid ""
-"templ2pot.py -- convert mailman template (en) to pot format.\n"
-"\n"
-"Usage: templ2pot.py inputfile ...\n"
-"\n"
-"Options:\n"
-"\n"
-"    -h, --help\n"
-"\n"
-"Inputfiles are english templates.  Outputs are written to stdout.\n"
-msgstr ""
-
 #: bin/transcheck:18
 #, docstring
 msgid ""
@@ -8491,1533 +8474,3 @@ msgid ""
 "        lists are sent out.\n"
 msgstr ""
 
-#: templates/en/admindbdetails.html:1
-#, template
-msgid ""
-"The administrative requests are displayed in one of two ways, on a <a\n"
-"href=\"%(summaryurl)s\">summary page</a>, and on a <em>details</em>\n"
-"page.  The summary page contains pending subscription and\n"
-"unsubscription requests, as well as postings being held for your\n"
-"approval, grouped by sender email address.  The details page contains\n"
-"a more detailed view of each held message, including the all the\n"
-"message's headers and an excerpt of the message body.\n"
-"\n"
-"<p>On all the pages, the following actions are available:\n"
-"\n"
-"<ul>\n"
-"<li><b>Defer</b> -- Defer your decision until later.  No action is\n"
-"    taken now for this pending administrative request, but for held\n"
-"    postings, you can still forward or preserve the message (see\n"
-"    below).\n"
-"\n"
-"<li><b>Approve</b> -- Approve the message, sending it on to the list.\n"
-"    For membership requests, approve the change in membership status.\n"
-"\n"
-"<li><b>Reject</b> -- Reject the message, sending a rejection notice to\n"
-"    the sender, and discarding the original message.  For membership\n"
-"    requests, reject the change in membership status.  In either case,\n"
-"    you should add a reason for the rejection in the accompanying text\n"
-"    box.\n"
-"\n"
-"<li><b>Discard</b> -- Throw away the original message, without sending\n"
-"    a rejection notice.  For membership requests, this simply discards\n"
-"    the request without notice to the person making the request.  This\n"
-"    is usually the action you want to take for known spam.\n"
-"</ul>\n"
-"\n"
-"<p>For held messages, turn on the <b>Preserve</b> option if you want\n"
-"to save a copy of the message for the site administrator.  This is\n"
-"useful for abusive messages that you want to discard, but need to keep\n"
-"a record of for later inspection.\n"
-"\n"
-"<p>Turn on the <b>Forward to</b> option, and fill in the forwarding\n"
-"address if you want to forward the message to someone else not on the\n"
-"list.  To edit a held message before it is sent on to the list, you\n"
-"should forward the message to yourself (or the list owners), and\n"
-"discard the original message.  Then, when the message shows up in your\n"
-"mailbox, make your edits and resend the message to the list, including\n"
-"an <tt>Approved:</tt> header with the list password as its value.  It\n"
-"is proper netiquette in this case to include a note in the resent\n"
-"message, explaining that you have modified the text.\n"
-"\n"
-"<p>If the sender is a list member who is being moderated, you can\n"
-"optionally clear their moderation flag.  This is useful when your list\n"
-"is configured to put new members on probation, and you've decided that\n"
-"this member can be trusted to post to the list without approval.\n"
-"\n"
-"<p>If the sender is not a list member, you can add the email address to\n"
-"a <em>sender filter</em>.  Sender filters are described on the <a\n"
-"href=\"%(filterurl)s\">sender filter privacy page</a>, and may be one of\n"
-"<b>auto-accept</b> (Accepts), <b>auto-hold</b> (Holds),\n"
-"<b>auto-reject</b> (Rejects), or <b>auto-discard</b> (Discards).  This\n"
-"option will not be available if the address is already on one of the\n"
-"sender filters.\n"
-"\n"
-"<p>When you're finished, click on the <em>Submit All Data</em> button\n"
-"at the top or bottom of the page.  This button will submit all\n"
-"selected actions for all administrative requests that you've made a\n"
-"decision for.\n"
-"\n"
-"<p><a href=\"%(summaryurl)s\">Return to the summary page</a>."
-msgstr ""
-
-#: templates/en/admindbpreamble.html:1
-#, template
-msgid ""
-"This page contains a subset of the <em>%(listname)s</em> mailing list\n"
-"postings that are being held for your approval.  It currently shows\n"
-"%(description)s\n"
-"\n"
-"<p>For each administrative request, please select the action to take,\n"
-"clicking on the <b>Submit All Data</b> when finished.  More detailed\n"
-"instructions are available <a href=\"%(detailsurl)s\">here</a>.\n"
-"\n"
-"<p>You can also <a href=\"%(summaryurl)s\">view a summary</a> of all\n"
-"pending requests."
-msgstr ""
-
-#: templates/en/admindbsummary.html:1
-#, template
-msgid ""
-"This page contains a summary of the current set of administrative\n"
-"requests requiring your approval for the\n"
-"<a href=\"%(adminurl)s\"><em>%(listname)s</em> mailing list</a>.\n"
-"First, you will find the list of pending\n"
-"subscription and unsubscription requests, if any, followed by any\n"
-"postings being held for your approval.\n"
-"\n"
-"<p>For each administrative request, please select the action to take,\n"
-"clicking on the <b>Submit All Data</b> button when finished.\n"
-"<a href=\"%(detailsurl)s\">More detailed instructions</a> are also\n"
-"available.\n"
-"\n"
-"<p>You can also <a href=\"%(viewallurl)s\">view the details</a> of all\n"
-"held postings."
-msgstr ""
-
-#: templates/en/adminsubscribeack.txt:1
-#, template
-msgid ""
-"%(member)s has been successfully subscribed to %(listname)s.\n"
-"\n"
-msgstr ""
-
-#: templates/en/adminunsubscribeack.txt:1
-#, template
-msgid ""
-"%(member)s has been removed from %(listname)s.\n"
-msgstr ""
-
-#: templates/en/admlogin.html:1
-#, template
-msgid ""
-"<html>\n"
-"<head>\n"
-"  <title>%(listname)s %(who)s Authentication</title>\n"
-"</head>\n"
-"<body bgcolor=\"#ffffff\">\n"
-"<FORM METHOD=POST ACTION=\"%(path)s\">\n"
-"%(message)s\n"
-"  <TABLE WIDTH=\"100%%\" BORDER=\"0\" CELLSPACING=\"4\" CELLPADDING=\"5\">\n"
-"    <TR>\n"
-"      <TD COLSPAN=\"2\" WIDTH=\"100%%\" BGCOLOR=\"#99CCFF\" ALIGN=\"CENTER\">\n"
-"\t<B><FONT COLOR=\"#000000\" SIZE=\"+1\">%(listname)s %(who)s\n"
-"\t    Authentication</FONT></B>\n"
-"      </TD>\n"
-"    </TR>\n"
-"    <tr>\n"
-"      <TD><div ALIGN=\"Right\">List %(who)s Password:</div></TD>\n"
-"      <TD><INPUT TYPE=\"password\" NAME=\"adminpw\" SIZE=\"30\"></TD>\n"
-"    </tr>\n"
-"    <tr>\n"
-"      <td colspan=2 align=middle><INPUT type=\"SUBMIT\"\n"
-"                                        name=\"admlogin\"\n"
-"\t\t\t\t\tvalue=\"Let me in...\">\n"
-"      </td>\n"
-"    </tr>\n"
-"  </TABLE>\n"
-"      <p><strong><em>Important:</em></strong> From this point on, you\n"
-"      must have cookies enabled in your browser, otherwise no\n"
-"      administrative changes will take effect.\n"
-"\n"
-"      <p>Session cookies are used in Mailman's\n"
-"      administrative interface so that you don't need to\n"
-"      re-authenticate with every administrative operation.  This\n"
-"      cookie will expire automatically when you exit your browser, or\n"
-"      you can explicitly expire the cookie by hitting the\n"
-"      <em>Logout</em> link under <em>Other Administrative\n"
-"      Activities</em> (which you'll see once you successfully log in).\n"
-"</FORM>\n"
-"</body>\n"
-"</html>"
-msgstr ""
-
-#: templates/en/approve.txt:1
-#, template
-msgid ""
-"Your request to %(requestaddr)s:\n"
-"\n"
-"    %(cmd)s\n"
-"\n"
-"has been forwarded to the person running the list.\n"
-"\n"
-"This is probably because you are trying to subscribe to a 'closed'\n"
-"list.\n"
-"\n"
-"You will receive email notification of the list owner's decision about\n"
-"your subscription request.\n"
-"\n"
-"Any questions about the list owner's policy should be directed to:\n"
-"\n"
-"    %(adminaddr)s"
-msgstr ""
-
-#: templates/en/archidxentry.html:1
-#, template
-msgid ""
-"<LI><A HREF=\"%(filename)s\">%(subject)s\n"
-"</A><A NAME=\"%(sequence)i\">&nbsp;</A>\n"
-"<I>%(author)s\n"
-"</I>"
-msgstr ""
-
-#: templates/en/archidxfoot.html:1
-#, template
-msgid ""
-"    </ul>\n"
-"    <p>\n"
-"      <a name=\"end\"><b>Last message date:</b></a> \n"
-"       <i>%(lastdate)s</i><br>\n"
-"    <b>Archived on:</b> <i>%(archivedate)s</i>\n"
-"    <p>\n"
-"   <ul>\n"
-"         <li> <b>Messages sorted by:</b>\n"
-"\t        %(thread_ref)s\n"
-"\t\t%(subject_ref)s\n"
-"\t\t%(author_ref)s\n"
-"\t\t%(date_ref)s\n"
-"\t     <li><b><a href=\"%(listinfo)s\">More info on this list...\n"
-"                    </a></b></li>\n"
-"     </ul>\n"
-"     <p>\n"
-"     <hr>\n"
-"     <i>This archive was generated by\n"
-"     Pipermail %(version)s.</i>\n"
-"  </BODY>\n"
-"</HTML>"
-msgstr ""
-
-#: templates/en/archidxhead.html:1
-#, template
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n"
-"<HTML>\n"
-"  <HEAD>\n"
-"     <title>The %(listname)s %(archive)s Archive by %(archtype)s</title>\n"
-"     <META NAME=\"robots\" CONTENT=\"noindex,follow\">\n"
-"     %(encoding)s\n"
-"  </HEAD>\n"
-"  <BODY BGCOLOR=\"#ffffff\">\n"
-"      <a name=\"start\"></A>\n"
-"      <h1>%(archive)s Archives by %(archtype)s</h1>\n"
-"      <ul>\n"
-"         <li> <b>Messages sorted by:</b>\n"
-"\t        %(thread_ref)s\n"
-"\t\t%(subject_ref)s\n"
-"\t\t%(author_ref)s\n"
-"\t\t%(date_ref)s\n"
-"\n"
-"\t     <li><b><a href=\"%(listinfo)s\">More info on this list...\n"
-"                    </a></b></li>\n"
-"      </ul>\n"
-"      <p><b>Starting:</b> <i>%(firstdate)s</i><br>\n"
-"         <b>Ending:</b> <i>%(lastdate)s</i><br>\n"
-"         <b>Messages:</b> %(size)s<p>\n"
-"     <ul>"
-msgstr ""
-
-#: templates/en/archlistend.html:1
-#, template
-msgid "         </table>\n"
-msgstr ""
-
-#: templates/en/archliststart.html:1
-#, template
-msgid ""
-"\t<table border=3>\n"
-"          <tr><td>Archive</td>\n"
-"          <td>View by:</td>\n"
-"          <td>Downloadable version</td></tr>"
-msgstr ""
-
-#: templates/en/archtoc.html:1
-#, template
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n"
-"<HTML>\n"
-"  <HEAD>\n"
-"     <title>The %(listname)s Archives</title>\n"
-"     <META NAME=\"robots\" CONTENT=\"noindex,follow\">\n"
-"     %(meta)s\n"
-"  </HEAD>\n"
-"  <BODY BGCOLOR=\"#ffffff\">\n"
-"     <h1>The %(listname)s Archives </h1>\n"
-"     <p>\n"
-"      You can get <a href=\"%(listinfo)s\">more information about this list</a>\n"
-"      or you can <a href=\"%(fullarch)s\">download the full raw archive</a>\n"
-"      (%(size)s).\n"
-"     </p>\n"
-"     %(noarchive_msg)s\n"
-"     %(archive_listing_start)s\n"
-"     %(archive_listing)s\n"
-"     %(archive_listing_end)s\n"
-"     </BODY>\n"
-"     </HTML>"
-msgstr ""
-
-#: templates/en/archtocentry.html:1
-#, template
-msgid ""
-"\n"
-"\t    <tr>\n"
-"            <td>%(archivelabel)s:</td>\n"
-"            <td>\n"
-"              <A href=\"%(archive)s/thread.html\">[ Thread ]</a>\n"
-"              <A href=\"%(archive)s/subject.html\">[ Subject ]</a>\n"
-"              <A href=\"%(archive)s/author.html\">[ Author ]</a>\n"
-"              <A href=\"%(archive)s/date.html\">[ Date ]</a>\n"
-"            </td>\n"
-"            %(textlink)s\n"
-"            </tr>\n"
-msgstr ""
-
-#: templates/en/article.html:1
-#, template
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n"
-"<HTML>\n"
-" <HEAD>\n"
-"   <TITLE> %(title)s\n"
-"   </TITLE>\n"
-"   <LINK REL=\"Index\" HREF=\"index.html\" >\n"
-"   <LINK REL=\"made\" HREF=\"mailto:%(email_url)s?Subject=%(subject_url)s&In-Reply-To=%(in_reply_to_url)s\">\n"
-"   <META NAME=\"robots\" CONTENT=\"index,nofollow\">\n"
-"   %(encoding)s\n"
-"   %(prev)s\n"
-"   %(next)s\n"
-" </HEAD>\n"
-" <BODY BGCOLOR=\"#ffffff\">\n"
-"   <H1>%(subject_html)s</H1>\n"
-"    <B>%(author_html)s</B> \n"
-"    <A HREF=\"mailto:%(email_url)s?Subject=%(subject_url)s&In-Reply-To=%(in_reply_to_url)s\"\n"
-"       TITLE=\"%(subject_html)s\">%(email_html)s\n"
-"       </A><BR>\n"
-"    <I>%(datestr_html)s</I>\n"
-"    <P><UL>\n"
-"        %(prev_wsubj)s\n"
-"        %(next_wsubj)s\n"
-"         <LI> <B>Messages sorted by:</B> \n"
-"              <a href=\"date.html#%(sequence)s\">[ date ]</a>\n"
-"              <a href=\"thread.html#%(sequence)s\">[ thread ]</a>\n"
-"              <a href=\"subject.html#%(sequence)s\">[ subject ]</a>\n"
-"              <a href=\"author.html#%(sequence)s\">[ author ]</a>\n"
-"         </LI>\n"
-"       </UL>\n"
-"    <HR>  \n"
-"<!--beginarticle-->\n"
-"%(body)s\n"
-"<!--endarticle-->\n"
-"    <HR>\n"
-"    <P><UL>\n"
-"        <!--threads-->\n"
-"\t%(prev_wsubj)s\n"
-"\t%(next_wsubj)s\n"
-"         <LI> <B>Messages sorted by:</B> \n"
-"              <a href=\"date.html#%(sequence)s\">[ date ]</a>\n"
-"              <a href=\"thread.html#%(sequence)s\">[ thread ]</a>\n"
-"              <a href=\"subject.html#%(sequence)s\">[ subject ]</a>\n"
-"              <a href=\"author.html#%(sequence)s\">[ author ]</a>\n"
-"         </LI>\n"
-"       </UL>\n"
-"\n"
-"<hr>\n"
-"<a href=\"%(listurl)s\">More information about the %(listname)s\n"
-"mailing list</a><br>\n"
-"</body></html>"
-msgstr ""
-
-#: templates/en/bounce.txt:1
-#, template
-msgid ""
-"This is a Mailman mailing list bounce action notice:\n"
-"\n"
-"    List:       %(listname)s\n"
-"    Member:     %(addr)s\n"
-"    Action:     Subscription %(negative)s%(did)s.\n"
-"    Reason:     Excessive or fatal bounces.\n"
-"    %(but)s\n"
-"\n"
-"%(reenable)s\n"
-"The triggering bounce notice is attached below.\n"
-"\n"
-"Questions?  \n"
-"Contact the Mailman site administrator at %(owneraddr)s."
-msgstr ""
-
-#: templates/en/convert.txt:1
-#, template
-msgid ""
-"The %(listname)s mailing list has just undergone a big change.  It is\n"
-"running on a new mailing list package called \"Mailman\".  This will\n"
-"hopefully solve a lot of problems that administering this list has\n"
-"presented.\n"
-"\n"
-"How does this affect you?\n"
-"\n"
-"1) Mail intended for the whole list should be sent to: %(listaddr)s.\n"
-"\n"
-"2) You have been given an arbitrary password to prevent others from\n"
-"unsubscribing you without your knowledge.  It will be mailed to you in \n"
-"a separate email, which you may have already received.  Don't worry if \n"
-"you forget this password; a reminder will be sent to you via email\n"
-"every month.\n"
-"\n"
-"3) If you have World Wide Web access, you can use it any time to\n"
-"unsubscribe from this list, to switch to and from digest mode, to\n"
-"check back issues of the list (which will be available after the list\n"
-"has been getting posts for a day or so), etc.  The Web address for\n"
-"these resources is:\n"
-"\n"
-"    %(listinfo_url)s\n"
-"\n"
-"4) If you do not have WWW access, you can do these same things via\n"
-"email.  Send mail to %(requestaddr)s with a subject or body containing \n"
-"just the word \"help\" (without the quotes).  You will receive an\n"
-"automated reply giving you further directions.\n"
-"\n"
-"Please address any questions or problems with this new setup to:\n"
-"%(adminaddr)s.\n"
-"\n"
-"This message was auto-generated by Mailman %(version)s.  For more\n"
-"information on the Mailman software, visit the Mailman homepage at\n"
-"http://www.list.org/"
-msgstr ""
-
-#: templates/en/checkdbs.txt:1
-#, template
-msgid ""
-"The %(real_name)s@%(host_name)s mailing list has %(count)d request(s)\n"
-"waiting for your consideration at:\n"
-"\n"
-"\t%(adminDB)s\n"
-"\t\n"
-"Please attend to this at your earliest convenience.  This notice of\n"
-"pending requests, if any, will be sent out daily."
-msgstr ""
-
-#: templates/en/cronpass.txt:1
-#, template
-msgid ""
-"This is a reminder, sent out once a month, about your %(hostname)s\n"
-"mailing list memberships.  It includes your subscription info and how\n"
-"to use it to change it or unsubscribe from a list.\n"
-"\n"
-"You can visit the URLs to change your membership status or\n"
-"configuration, including unsubscribing, setting digest-style delivery\n"
-"or disabling delivery altogether (e.g., for a vacation), and so on.\n"
-"\n"
-"In addition to the URL interfaces, you can also use email to make such\n"
-"changes.  For more info, send a message to the '-request' address of\n"
-"the list (for example, %(exreq)s) containing just the word 'help' in\n"
-"the message body, and an email message will be sent to you with\n"
-"instructions.\n"
-"\n"
-"If you have questions, problems, comments, etc, send them to\n"
-"%(owner)s.  Thanks!\n"
-"\n"
-"Passwords for %(useraddr)s:\n"
-msgstr ""
-
-#: templates/en/disabled.txt:1
-#, template
-msgid ""
-"Your membership in the mailing list %(listname)s has been disabled\n"
-"%(reason)s.  You will not get any more messages from this\n"
-"list until you re-enable your membership.  You will receive\n"
-"%(noticesleft)s more reminders like this before your membership in the\n"
-"list is deleted.\n"
-"\n"
-"To re-enable your membership, you can simply respond to this message\n"
-"(leaving the Subject: line intact), or visit the confirmation page at\n"
-"\n"
-"    %(confirmurl)s\n"
-"\n"
-"You can also visit your membership page at\n"
-"\n"
-"    %(optionsurl)s\n"
-"\n"
-"On your membership page, you can change various delivery options such\n"
-"as your email address and whether you get digests or not.  As a\n"
-"reminder, your membership password is\n"
-"\n"
-"    %(password)s\n"
-"\n"
-"If you have any questions or problems, you can contact the list owner\n"
-"at\n"
-"\n"
-"    %(owneraddr)s"
-msgstr ""
-
-#: templates/en/emptyarchive.html:1
-#, template
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n"
-"<HTML>\n"
-"  <HEAD>\n"
-"     <title>The %(listname)s Archives</title>\n"
-"     <META NAME=\"robots\" CONTENT=\"noindex,follow\">\n"
-"  </HEAD>\n"
-"  <BODY BGCOLOR=\"#ffffff\">\n"
-"     <h1>The %(listname)s Archives </h1>\n"
-"     <p>\n"
-"      No messages have been posted to this list yet, so the archives are\n"
-"      currently empty.  You can get <a href=\"%(listinfo)s\">more information\n"
-"      about this list</a>.\n"
-"     </p>\n"
-"  </BODY>\n"
-"  </HTML>"
-msgstr ""
-
-#: templates/en/headfoot.html:1
-#, template
-msgid ""
-"This text can include \n"
-"<a href=\"http://www.python.org/doc/current/lib/typesseq-strings.html\">Python\n"
-"format strings</a> which are resolved against list attributes.  The\n"
-"list of substitutions allowed are:\n"
-"\n"
-"<ul>\n"
-"    <li><b>real_name</b> - The \"pretty\" name of the list; usually\n"
-"    the list name with capitalization.\n"
-"\n"
-"    <li><b>list_name</b> - The name by which the list is\n"
-"    identified in URLs, where case is significant.\n"
-"\n"
-"    <li><b>host_name</b> - The fully qualified domain name\n"
-"    that the list server runs on.\n"
-"\n"
-"    <li><b>web_page_url</b> - The base URL for Mailman.  This\n"
-"    can be appended with,\n"
-"    e.g. <em>listinfo/%(list_name)s</em> to yield the\n"
-"    listinfo page for the mailing list.\n"
-"\n"
-"    <li><b>description</b> - The brief description of the\n"
-"    mailing list.\n"
-"\n"
-"    <li><b>info</b> - The full description of the mailing\n"
-"    list.\n"
-"\n"
-"    <li><b>cgiext</b> - The extension added to CGI scripts.\n"
-"</ul>"
-msgstr ""
-
-#: templates/en/help.txt:1
-#, template
-msgid ""
-"Help for %(listname)s mailing list:\n"
-"\n"
-"This is email command help for version %(version)s of the \"Mailman\"\n"
-"list manager.  The following describes commands you can send to get\n"
-"information about and control your subscription to Mailman lists at\n"
-"this site.  A command can be in the subject line or in the body of the\n"
-"message.\n"
-"\n"
-"Note that much of the following can also be accomplished via the World\n"
-"Wide Web, at:\n"
-"\n"
-"    %(listinfo_url)s\n"
-"\n"
-"In particular, you can use the Web site to have your password sent to\n"
-"your delivery address.\n"
-"\n"
-"List specific commands (subscribe, who, etc) should be sent to the\n"
-"*-request address for the particular list, e.g. for the 'mailman'\n"
-"list, use 'mailman-request@...'.\n"
-"\n"
-"About the descriptions - words in \"<>\"s signify REQUIRED items and\n"
-"words in \"[]\" denote OPTIONAL items.  Do not include the \"<>\"s or\n"
-"\"[]\"s when you use the commands.\n"
-"\n"
-"The following commands are valid:\n"
-"\n"
-"    %(commands)s\n"
-"\n"
-"Commands should be sent to %(requestaddr)s\n"
-"\n"
-"Questions and concerns for the attention of a person should be sent to\n"
-"\n"
-"    %(adminaddr)s"
-msgstr ""
-
-#: templates/en/invite.txt:1
-#, template
-msgid ""
-"Your address \"%(email)s\" has been invited to join the %(listname)s\n"
-"mailing list at %(hostname)s by the %(listname)s mailing list owner.\n"
-"You may accept the invitation by simply replying to this message,\n"
-"keeping the Subject: header intact.\n"
-"\n"
-"You can also visit this web page:\n"
-"\n"
-"    %(confirmurl)s\n"
-"\n"
-"Or you should include the following line -- and only the following\n"
-"line -- in a message to %(requestaddr)s:\n"
-"\n"
-"    confirm %(cookie)s\n"
-"\n"
-"Note that simply sending a `reply' to this message should work from\n"
-"most mail readers.\n"
-"\n"
-"If you want to decline this invitation, please simply disregard this\n"
-"message.  If you have any questions, please send them to\n"
-"%(listowner)s."
-msgstr ""
-
-#: templates/en/listinfo.html:1
-#, template
-msgid ""
-"<!-- $Revision: 2.49 $ -->\n"
-"<HTML>\n"
-"  <HEAD>\n"
-"    <TITLE><MM-List-Name> Info Page</TITLE>\n"
-"  \n"
-"  </HEAD>\n"
-"  <BODY BGCOLOR=\"#ffffff\">\n"
-"\n"
-"    <P>\n"
-"      <TABLE COLS=\"1\" BORDER=\"0\" CELLSPACING=\"4\" CELLPADDING=\"5\">\n"
-"\t<TR>\n"
-"\t  <TD COLSPAN=\"2\" WIDTH=\"100%\" BGCOLOR=\"#99CCFF\" ALIGN=\"CENTER\">\n"
-"\t    <B><FONT COLOR=\"#000000\" SIZE=\"+1\"><MM-List-Name> --\n"
-"\t<MM-List-Description></FONT></B>\n"
-"\t  </TD>\n"
-"\t</TR>\n"
-"\t<tr>\n"
-"\t    <td colspan=\"2\">\n"
-"\t      <p>&nbsp;\n"
-"\t    </td>\n"
-"\t  </tr>\n"
-"\t  <tr>\n"
-"\t    <TD COLSPAN=\"1\" WIDTH=\"100%\" BGCOLOR=\"#FFF0D0\">\n"
-"\t      <B><FONT COLOR=\"#000000\">About <MM-List-Name></FONT></B>\n"
-"\t    </TD>\n"
-"            <TD COLSPAN=\"1\" WIDTH=\"100%\" BGCOLOR=\"#FFF0D0\">\n"
-"              <MM-lang-form-start><MM-displang-box> <MM-list-langs>\n"
-"              <MM-form-end>\n"
-"    <MM-Subscribe-Form-Start>\n"
-"            </TD>\n"
-"\t  </TR>\n"
-"\t    <tr>\n"
-"\t      <td colspan=\"2\">\n"
-"\t\t<P><MM-List-Info></P>\n"
-"\t  <p> To see the collection of prior postings to the list,\n"
-"\t      visit the <MM-Archive><MM-List-Name>\n"
-"\t\t  Archives</MM-Archive>.\n"
-"\t      <MM-Restricted-List-Message>\n"
-"\t  </p>\n"
-"\t</TD>\n"
-"      </TR>\n"
-"      <TR>\n"
-"\t<TD COLSPAN=\"2\" WIDTH=\"100%\" BGCOLOR=\"#FFF0D0\">\n"
-"\t  <B><FONT COLOR=\"#000000\">Using <MM-List-Name></FONT></B>\n"
-"\t</TD>\n"
-"      </TR>\n"
-"      <tr>\n"
-"\t<td colspan=\"2\">\n"
-"\t  To post a message to all the list members, send email to\n"
-"\t  <A HREF=\"mailto:<MM-Posting-Addr>\"><MM-Posting-Addr></A>.\n"
-"\n"
-"\t  <p>You can subscribe to the list, or change your existing\n"
-"\t    subscription, in the sections below.\n"
-"\t</td>\n"
-"      </tr>\n"
-"      <TR>\n"
-"\t<TD COLSPAN=\"2\" WIDTH=\"100%\" BGCOLOR=\"#FFF0D0\">\n"
-"\t  <B><FONT COLOR=\"#000000\">Subscribing to <MM-List-Name></FONT></B>\n"
-"\t</TD>\n"
-"      </TR>\n"
-"      <tr>\n"
-"\t<td colspan=\"2\">\n"
-"\t  <P>\n"
-"\t    Subscribe to <MM-List-Name> by filling out the following\n"
-"\t      form.\n"
-"\t  <MM-List-Subscription-Msg>\n"
-"\t  <ul>\n"
-"\t      <TABLE BORDER=\"0\" CELLSPACING=\"2\" CELLPADDING=\"2\"\n"
-"\t\tWIDTH=\"70%\" HEIGHT= \"112\">\n"
-"\t\t<TR>\n"
-"\t\t  <TD BGCOLOR=\"#dddddd\" WIDTH=\"55%\">Your email address:</TD>\n"
-"\t\t  <TD WIDTH=\"33%\"><MM-Subscribe-Box>\n"
-"\t</TD>\n"
-"\t<TD WIDTH=\"12%\">&nbsp;</TD></TR>\n"
-"      <tr>\n"
-"        <td bgcolor=\"#dddddd\" width=\"55%\">Your name (optional):</td>\n"
-"        <td width=\"33%\"><mm-fullname-box></td>\n"
-"\t<TD WIDTH=\"12%\">&nbsp;</TD></TR>\n"
-"      <TR>\n"
-"\t<TD COLSPAN=\"3\"><FONT SIZE=-1>You may enter a\n"
-"\t    privacy password below. This provides only mild security,\n"
-"\t    but should prevent others from messing with your\n"
-"\t    subscription.  <b>Do not use a valuable password</b> as\n"
-"\t    it will occasionally be emailed back to you in cleartext.\n"
-"\n"
-"            <p>If you choose not to enter a password, one will be\n"
-"            automatically generated for you, and it will be sent to\n"
-"            you once you've confirmed your subscription.  You can\n"
-"            always request a mail-back of your password when you edit\n"
-"            your personal options.\n"
-"\t    <MM-Reminder>\n"
-"\t</TD>\n"
-"      </TR>  \n"
-"      <TR>\n"
-"\t<TD BGCOLOR=\"#dddddd\">Pick a password:</TD>\n"
-"\t<TD><MM-New-Password-Box></TD>\n"
-"\t<TD>&nbsp;</TD></TR>\n"
-"      <TR> \n"
-"\t<TD BGCOLOR=\"#dddddd\">Reenter password to confirm:</TD>\n"
-"\t<TD><MM-Confirm-Password></TD>\n"
-"\t<TD>&nbsp; </TD></TR>\n"
-"      <tr>\n"
-"        <TD BGCOLOR=\"#dddddd\">Which language do you prefer to display your messages?</TD> \n"
-"        <TD> <MM-list-langs></TD>\n"
-"        <TD>&nbsp; </TD></TR>\n"
-"      <mm-digest-question-start>\n"
-"      <tr>\n"
-"\t<td>Would you like to receive list mail batched in a daily\n"
-"\t  digest?\n"
-"\t  </td>\n"
-"\t<td><MM-Undigest-Radio-Button> No\n"
-"\t    <MM-Digest-Radio-Button>  Yes\n"
-"\t</TD>\n"
-"      </tr>\n"
-"      <mm-digest-question-end>\n"
-"      <tr>\n"
-"\t<td colspan=\"3\">\n"
-"\t  <center><MM-Subscribe-Button></P></center>\n"
-"    </TABLE>\n"
-"    <MM-Form-End>\n"
-"    </ul>\n"
-"    </td>\n"
-"    </tr>\n"
-"    <TR>\n"
-"      <TD COLSPAN=\"2\" WIDTH=\"100%\" BGCOLOR=\"#FFF0D0\">\n"
-"\t<a name=\"subscribers\">\n"
-"        <B><FONT COLOR=\"#000000\"><MM-List-Name> Subscribers</FONT></B></a>\n"
-"      </TD>\n"
-"    </TR>\n"
-"    <tr>\n"
-"      <TD COLSPAN=\"2\" WIDTH=\"100%\">\n"
-"\t<MM-Roster-Form-Start>\n"
-"\t<MM-Roster-Option>\n"
-"\t    <MM-Form-End>\n"
-"\t  <p>\n"
-"\t<MM-Options-Form-Start>\n"
-"\t<MM-Editing-Options>\n"
-"\t\t<MM-Form-End>\n"
-"      </td>\n"
-"    </tr>\n"
-"  </table>\n"
-"<MM-Mailman-Footer>\n"
-"</BODY>\n"
-"</HTML>"
-msgstr ""
-
-#: templates/en/masthead.txt:1
-#, template
-msgid ""
-"Send %(real_name)s mailing list submissions to\n"
-"\t%(got_list_email)s\n"
-"\n"
-"To subscribe or unsubscribe via the World Wide Web, visit\n"
-"\t%(got_listinfo_url)s\n"
-"or, via email, send a message with subject or body 'help' to\n"
-"\t%(got_request_email)s\n"
-"\n"
-"You can reach the person managing the list at\n"
-"\t%(got_owner_email)s\n"
-"\n"
-"When replying, please edit your Subject line so it is more specific than\n"
-"\"Re: Contents of %(real_name)s digest...\""
-msgstr ""
-
-#: templates/en/newlist.txt:1
-#, template
-msgid ""
-"The mailing list `%(listname)s' has just been created for you.  The\n"
-"following is some basic information about your mailing list.\n"
-"\n"
-"Your mailing list password is:\n"
-"\n"
-"    %(password)s\n"
-"\n"
-"You need this password to configure your mailing list.  You also need\n"
-"it to handle administrative requests, such as approving mail if you\n"
-"choose to run a moderated list.\n"
-"\n"
-"You can configure your mailing list at the following web page:\n"
-"\n"
-"    %(admin_url)s\n"
-"\n"
-"The web page for users of your mailing list is: \n"
-"\n"
-"    %(listinfo_url)s\n"
-"\n"
-"You can even customize these web pages from the list configuration\n"
-"page.  However, you do need to know HTML to be able to do this.\n"
-"\n"
-"There is also an email-based interface for users (not administrators)\n"
-"of your list; you can get info about using it by sending a message\n"
-"with just the word `help' as subject or in the body, to:\n"
-"\n"
-"    %(requestaddr)s\n"
-"\n"
-"To unsubscribe a user: from the mailing list 'listinfo' web page,\n"
-"click on or enter the user's email address as if you were that user.\n"
-"Where that user would put in their password to unsubscribe, put in\n"
-"your admin password.  You can also use your password to change\n"
-"member's options, including digestification, delivery disabling, etc.\n"
-"\n"
-"Please address all questions to %(siteowner)s."
-msgstr ""
-
-#: templates/en/nomoretoday.txt:1
-#, template
-msgid ""
-"We have received a message from your address `%(sender)s' requesting\n"
-"an automated response from the %(listname)s mailing list.  We have\n"
-"seen %(num)s such messages from you today.  In order to avoid problems\n"
-"such as mail loops between email robots, we will not be sending you\n"
-"any further email responses today.  Please try again tomorrow.\n"
-"\n"
-"If you believe this message is in error, or if you have any questions,\n"
-"please contact the list owner at %(owneremail)s."
-msgstr ""
-
-#: templates/en/options.html:1
-#, template
-msgid ""
-"<html>\n"
-"<head>\n"
-"    <link rel=\"SHORTCUT ICON\" href=\"<mm-favicon>\">\n"
-"    <title><MM-Presentable-User> membership configuration for <MM-List-Name>\n"
-"    </title>\n"
-"</head>\n"
-"<BODY BGCOLOR=\"#ffffff\">\n"
-"    <TABLE WIDTH=\"100%\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"5\">\n"
-"    <TR><TD WIDTH=\"100%\" BGCOLOR=\"#99CCFF\"><B>\n"
-"        <FONT COLOR=\"#000000\" SIZE=+1>\n"
-"        <MM-List-Name> mailing list membership configuration for\n"
-"        <MM-Presentable-User>\n"
-"        </FONT></B></TD></TR>\n"
-"    </TABLE>\n"
-"<p>\n"
-"<table width=\"100%\" border=\"0\" cellspacing=\"5\" cellpadding=\"5\">\n"
-"    <tr><td>\n"
-"        <b><MM-Presentable-User></b>'s subscription status,\n"
-"        password, and options for the <MM-List-Name> mailing list.\n"
-"        </td><td><MM-Form-Start><mm-logout-button><MM-Form-End></td>\n"
-"    </tr><tr>\n"
-"        <td colspan=\"2\">\n"
-"        <MM-Case-Preserved-User>\n"
-"\n"
-"        <MM-Disabled-Notice>\n"
-"\n"
-"        <p><mm-results>\n"
-"        </td>\n"
-"    </tr>\n"
-"</table>\n"
-"\n"
-"<MM-Form-Start>\n"
-"<p>\n"
-"<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"5\">\n"
-"    <TR><TD WIDTH=\"100%\" BGCOLOR=\"#FFF0D0\" colspan=\"2\">\n"
-"        <FONT COLOR=\"#000000\">\n"
-"        <B>Changing your <MM-List-Name> membership information</B>\n"
-"        </FONT></TD></TR>\n"
-"    <tr><td colspan=\"2\">You can change the address that you are subscribed\n"
-"        to the mailing list with by entering the new address in the\n"
-"        fields below.  Note that a confirmation email will be sent to\n"
-"        the new address, and the change must be confirmed before it is\n"
-"        processed.\n"
-"\n"
-"        <p>Confirmations time out after about <mm-pending-days>.\n"
-"\n"
-"        <p>You can also optionally set or change your real name\n"
-"        (i.e. <em>John Smith</em>).\n"
-"\n"
-"        <p>If you want to make the membership changes for all the\n"
-"        lists that you are subscribed to at <mm-host>, turn on the\n"
-"        <em>Change globally</em> check box.\n"
-"\n"
-"        </td></tr>\n"
-"    <tr><td><center>\n"
-"        <table border=\"0\" cellspacing=\"2\" cellpadding=\"2\" width=\"80%\" cols=\"2\">\n"
-"        <tr><td bgcolor=\"#dddddd\"><div align=\"right\">New address:</div></td>\n"
-"            <td><mm-new-address-box></td>\n"
-"            </tr>\n"
-"        <tr><td bgcolor=\"#dddddd\"><div align=\"right\">Again to\n"
-"            confirm:</div></td> \n"
-"            <td><mm-confirm-address-box></td>\n"
-"            </tr>\n"
-"        </tr></table></center>\n"
-"        </td>\n"
-"        <td><center>\n"
-"        <table border=\"0\" cellspacing=\"2\" cellpadding=\"2\" width=\"80%\" cols=\"2\">\n"
-"            <tr><td bgcolor=\"#dddddd\"><div align=\"right\">Your name\n"
-"            (optional):</div></td>\n"
-"            <td><mm-fullname-box></td>\n"
-"            </tr>\n"
-"        </table></center>\n"
-"        </td>\n"
-"        </tr>\n"
-"    <tr><td colspan=\"2\"><center><mm-change-address-button>\n"
-"        <p><mm-global-change-of-address>Change globally</center></td>\n"
-"    </tr>\n"
-"</table>\n"
-"\n"
-"<p>\n"
-"<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLSPACING=\"5\" CELLPADDING=\"5\">\n"
-"    <TR><TD WIDTH=\"50%\" BGCOLOR=\"#FFF0D0\"><FONT COLOR=\"#000000\">\n"
-"        <B>Unsubscribing from <MM-List-Name></B></td>\n"
-"\n"
-"        <TD WIDTH=\"50%\" BGCOLOR=\"#FFF0D0\"><FONT COLOR=\"#000000\">\n"
-"        <B>Your other <MM-Host> subscriptions</B>\n"
-"        </FONT></TD></TR>\n"
-"\n"
-"    <tr><td>\n"
-"        Turn on the confirmation checkbox and hit this button to\n"
-"        unsubscribe from this mailing list.  <strong>Warning:</strong>\n"
-"        This action will be taken immediately!\n"
-"        <p>\n"
-"        <center><MM-Unsubscribe-Button></center></td>\n"
-"    <td>\n"
-"        You can view a list of all the other mailing lists at\n"
-"        <mm-host> for which you are a member.  Use this if you want to\n"
-"        make the same membership option changes to this other\n"
-"        subscriptions.\n"
-"\n"
-"        <p>\n"
-"        <center><MM-Other-Subscriptions-Submit></center>\n"
-"        </TD></TR>\n"
-"</table>\n"
-"\n"
-"<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"5\">\n"
-"    <TR><TD COLSPAN=2 WIDTH=\"100%\" BGCOLOR=\"#FFF0D0\"><FONT COLOR=\"#000000\">\n"
-"        <B>Your <MM-List-Name> Password</B>\n"
-"        </FONT></TD></TR>\n"
-"\n"
-"    <tr valign=\"TOP\"><td WIDTH=\"50%\">\n"
-"        <a name=reminder>\n"
-"        <center>\n"
-"        <h3>Forgotten Your Password?</h3>\n"
-"        </center>\n"
-"        Click this button to have your password emailed to your\n"
-"        membership address.\n"
-"        <p><MM-Umbrella-Notice>\n"
-"        <center>\n"
-"        <MM-Email-My-Pw>\n"
-"        </center>\n"
-"        </td>\n"
-"\n"
-"    <td WIDTH=\"50%\">\n"
-"        <a name=changepw>\n"
-"        <center>\n"
-"        <h3>Change Your Password</h3>\n"
-"        <TABLE BORDER=\"0\" CELLSPACING=\"2\" CELLPADDING=\"2\" WIDTH=\"70%\" COLS=2>\n"
-"            <TR><TD BGCOLOR=\"#dddddd\"><div align=\"right\">New\n"
-"                password:</div></TD>\n"
-"                <TD><MM-New-Pass-Box></TD>\n"
-"                </TR>\n"
-"            <TR>\n"
-"                <TD BGCOLOR=\"#dddddd\"><div align=\"right\">Again to\n"
-"                confirm:</div></TD>\n"
-"                <TD><MM-Confirm-Pass-Box></TD>\n"
-"            </TR>\n"
-"        </table>\n"
-"\n"
-"        <MM-Change-Pass-Button>\n"
-"        <p><center><mm-global-pw-changes-button>Change globally.\n"
-"        </center>\n"
-"</TABLE>\n"
-"\n"
-"<p>\n"
-"<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"5\">\n"
-"    <TR><TD WIDTH=\"100%\" BGCOLOR=\"#FFF0D0\"><FONT COLOR=\"#000000\">\n"
-"        <B>Your <MM-List-Name> Subscription Options</B>\n"
-"        </FONT></TD></TR>\n"
-"</table>\n"
-"\n"
-"<p>\n"
-"<i><strong>Current values are checked.</strong></i>\n"
-"\n"
-"<p>Note that some of the options have a <em>Set globally</em>\n"
-"checkbox.  Checking this field will cause the changes to be made to\n"
-"every mailing list that you are a member of on <mm-host>.  Click on\n"
-"<em>List my other subscriptions</em> above to see which other mailing\n"
-"lists you are subscribed to.\n"
-"<p>\n"
-"<TABLE BORDER=\"0\" CELLSPACING=\"3\" CELLPADDING=\"4\" WIDTH=\"100%\">\n"
-"    <tr><TD BGCOLOR=\"#cccccc\">\n"
-"        <a name=\"disable\">\n"
-"        <strong>Mail delivery</strong></a><p>\n"
-"        Set this option to <em>Enabled</em> to receive messages posted\n"
-"        to this mailing list.  Set it to <em>Disabled</em> if you want\n"
-"        to stay subscribed, but don't want mail delivered to you for a\n"
-"        while (e.g. you're going on vacation).  If you disable mail\n"
-"        delivery, don't forget to re-enable it when you come back; it\n"
-"        will not be automatically re-enabled.\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <mm-delivery-enable-button>Enabled<br>\n"
-"        <mm-delivery-disable-button>Disabled<p>\n"
-"        <mm-global-deliver-button><i>Set globally</i>\n"
-"        </td></tr>\n"
-"\n"
-"    <tr><TD BGCOLOR=\"#cccccc\">\n"
-"        <strong>Set Digest Mode</strong><p>\n"
-"        If you turn digest mode on, you'll get posts bundled together\n"
-"        (usually one per day but possibly more on busy lists), instead\n"
-"        of singly when they're sent.  If digest mode is changed from\n"
-"        on to off, you may receive one last digest.\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <MM-Undigest-Radio-Button>Off<br>\n"
-"        <MM-Digest-Radio-Button>On\n"
-"        </td></tr>\n"
-"        \n"
-"    <tr><TD BGCOLOR=\"#cccccc\">\n"
-"        <strong>Get MIME or Plain Text Digests?</strong><p>\n"
-"        Your mail reader may or may not support MIME digests.  In\n"
-"        general MIME digests are preferred, but if you have a problem\n"
-"        reading them, select plain text digests.\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <MM-Mime-Digests-Button>MIME<br>\n"
-"        <MM-Plain-Digests-Button>Plain Text<p>\n"
-"        <mm-global-mime-button><i>Set globally</i>\n"
-"        </td></tr>\n"
-"        \n"
-"    <tr><TD BGCOLOR=\"#cccccc\">\n"
-"        <strong>Receive your own posts to the list?</strong><p>\n"
-"        Ordinarily, you will get a copy of every message you post to\n"
-"        the list.  If you don't want to receive this copy, set this\n"
-"        option to <em>No</em>.\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <mm-dont-receive-own-mail-button>No<br>\n"
-"        <mm-receive-own-mail-button>Yes\n"
-"        </td></tr>\n"
-"\n"
-"    <tr><TD BGCOLOR=\"#cccccc\">\n"
-"        <strong>Receive acknowledgement mail when you send mail to\n"
-"        the list?</strong><p>\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <mm-dont-ack-posts-button>No<br>\n"
-"        <mm-ack-posts-button>Yes\n"
-"        </td></tr>\n"
-"\n"
-"    <tr><td bgcolor=\"#cccccc\">\n"
-"        <strong>Get password reminder email for this list?</strong><p>\n"
-"        Once a month, you will get an email containing a password\n"
-"        reminder for every list at this host to which you are\n"
-"        subscribed.  You can turn this off on a per-list basis by\n"
-"        selecting <em>No</em> for this option.  If you turn off\n"
-"        password reminders for all the lists you are subscribed to, no\n"
-"        reminder email will be sent to you.\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <mm-dont-get-password-reminder-button>No<br>\n"
-"        <mm-get-password-reminder-button>Yes<p>\n"
-"        <mm-global-remind-button><i>Set globally</i>\n"
-"        </td></tr>\n"
-"\n"
-"    <tr><TD BGCOLOR=\"#cccccc\">\n"
-"        <strong>Conceal yourself from subscriber list?</strong><p>\n"
-"        When someone views the list membership, your email address is\n"
-"        normally shown (in an obscured fashion to thwart spam\n"
-"        harvesters).  If you do not want your email address to show up\n"
-"        on this membership roster at all, select <em>Yes</em> for this option.\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <MM-Public-Subscription-Button>No<br>\n"
-"        <MM-Hide-Subscription-Button>Yes\n"
-"        </td></tr>\n"
-"\n"
-"    <tr><TD BGCOLOR=\"#cccccc\">\n"
-"        <strong>What language do you prefer?</strong><p>\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <MM-list-langs>\n"
-"        </td></tr>\n"
-"\n"
-"    <tr><td bgcolor=\"#cccccc\">\n"
-"        <strong>Which topic categories would you like to subscribe\n"
-"                to?</strong><p>\n"
-"                By selecting one or more topics, you can filter the\n"
-"                traffic on the mailing list, so as to receive only a\n"
-"                subset of the messages.  If a message matches one of\n"
-"                your selected topics, then you will get the message,\n"
-"                otherwise you will not.\n"
-"\n"
-"                <p>If a message does not match any topic, the delivery\n"
-"                rule depends on the setting of the option below.  If\n"
-"                you do not select any topics of interest, you will get\n"
-"                all the messages sent to the mailing list.\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <mm-topics>\n"
-"        </td></tr>\n"
-"\n"
-"    <tr><td bgcolor=\"#cccccc\">\n"
-"        <strong>Do you want to receive messages that do not match any\n"
-"                topic filter?</strong><p>\n"
-"\n"
-"                This option only takes effect if you've subscribed to\n"
-"                at least one topic above.  It describes what the\n"
-"                default delivery rule is for messages that don't match\n"
-"                any topic filter.  Selecting <em>No</em> says that if\n"
-"                the message does not match any topic filters, then you\n"
-"                won't get the message, while selecting <em>Yes</em>\n"
-"                says to deliver such non-matching messages to you.\n"
-"\n"
-"                <p>If no topics of interest are selected above, then\n"
-"                you will receive every message sent to the mailing\n"
-"                list.\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <mm-suppress-nonmatching-topics>No<br>\n"
-"        <mm-receive-nonmatching-topics>Yes\n"
-"        </td></tr>\n"
-"\n"
-"    <tr><td bgcolor=\"#cccccc\">\n"
-"        <strong>Avoid duplicate copies of messages?</strong><p>\n"
-"\n"
-"                When you are listed explicitly in the <tt>To:</tt> or\n"
-"                <tt>Cc:</tt> headers of a list message, you can opt to\n"
-"                not receive another copy from the mailing list.\n"
-"                Select <em>Yes</em> to avoid receiving copies from the\n"
-"                mailing list; select <em>No</em> to receive copies.\n"
-"\n"
-"                <p>If the list has member personalized messages\n"
-"                enabled, and you elect to receive copies, every copy\n"
-"                will have a <tt>X-Mailman-Copy: yes</tt> header added\n"
-"                to it.\n"
-"\n"
-"        </td><td bgcolor=\"#cccccc\">\n"
-"        <mm-receive-duplicates-button>No<br>\n"
-"        <mm-dont-receive-duplicates-button>Yes<p>\n"
-"        <mm-global-nodupes-button><i>Set globally</i>\n"
-"        </td></tr>\n"
-"\n"
-"    <tr><TD colspan=\"2\">\n"
-"        <center><MM-options-Submit-button></center>\n"
-"        </td></tr>\n"
-"\n"
-"</table>\n"
-"</center>\n"
-"<p>\n"
-"<MM-Form-End>\n"
-"\n"
-"<MM-Mailman-Footer>\n"
-"</body>\n"
-"</html>"
-msgstr ""
-
-#: templates/en/postack.txt:1
-#, template
-msgid ""
-"Your message entitled\n"
-"\n"
-"    %(subject)s\n"
-"\n"
-"was successfully received by the %(listname)s mailing list.\n"
-"\n"
-"List info page: %(listinfo_url)s\n"
-"Your preferences: %(optionsurl)s"
-msgstr ""
-
-#: templates/en/postauth.txt:1
-#, template
-msgid ""
-"As list administrator, your authorization is requested for the\n"
-"following mailing list posting:\n"
-"\n"
-"    List:    %(listname)s@%(hostname)s\n"
-"    From:    %(sender)s\n"
-"    Subject: %(subject)s\n"
-"    Reason:  %(reason)s\n"
-"\n"
-"At your convenience, visit:\n"
-"\n"
-"    %(admindb_url)s\n"
-"        \n"
-"to approve or deny the request."
-msgstr ""
-
-#: templates/en/postheld.txt:1
-#, template
-msgid ""
-"Your mail to '%(listname)s' with the subject\n"
-"\n"
-"    %(subject)s\n"
-"\n"
-"Is being held until the list moderator can review it for approval.\n"
-"\n"
-"The reason it is being held:\n"
-"\n"
-"    %(reason)s\n"
-"\n"
-"Either the message will get posted to the list, or you will receive\n"
-"notification of the moderator's decision.  If you would like to cancel\n"
-"this posting, please visit the following URL:\n"
-"\n"
-"    %(confirmurl)s"
-msgstr ""
-
-#: templates/en/private.html:1
-#, template
-msgid ""
-"<html>\n"
-"<head>\n"
-"    <title>%(realname)s Private Archives Authentication</title>\n"
-"</head>\n"
-"<body bgcolor=\"#ffffff\">\n"
-"<FORM METHOD=POST ACTION=\"%(action)s\">\n"
-"%(message)s\n"
-"  <TABLE WIDTH=\"100%%\" BORDER=\"0\" CELLSPACING=\"4\" CELLPADDING=\"5\">\n"
-"    <TR>\n"
-"      <TD COLSPAN=\"2\" WIDTH=\"100%%\" BGCOLOR=\"#99CCFF\" ALIGN=\"CENTER\">\n"
-"\t<B><FONT COLOR=\"#000000\" SIZE=\"+1\">%(realname)s Private\n"
-"\t    Archives Authentication</FONT></B>\n"
-"      </TD>\n"
-"    </TR>\n"
-"    <tr>\n"
-"        <TD><div ALIGN=\"Right\">Email address:</div></TD>\n"
-"        <TD><INPUT TYPE=\"text\" NAME=\"username\" SIZE=\"30\"></TD>\n"
-"    </tr>\n"
-"    <tr>\n"
-"      <TD><div ALIGN=\"Right\">Password:</div></TD>\n"
-"      <TD><INPUT TYPE=\"password\" NAME=\"password\" SIZE=\"30\"></TD>\n"
-"    </tr>\n"
-"    <tr>\n"
-"      <td colspan=2 align=\"middle\"><INPUT type=\"SUBMIT\"\n"
-"                                          name=\"submit\"\n"
-"\t\t\t\t\t  value=\"Let me in...\">\n"
-"      </td>\n"
-"    </tr>\n"
-"  </TABLE>\n"
-"      <p><strong><em>Important:</em></strong> From this point on, you\n"
-"      must have cookies enabled in your browser, otherwise\n"
-"      you will have to re-authenticate with every operation.\n"
-"\n"
-"      <p>Session cookies are used in Mailman's\n"
-"      private archive interface so that you don't need to\n"
-"      re-authenticate with every operation.  This\n"
-"      cookie will expire automatically when you exit your browser, or\n"
-"      you can explicitly expire the cookie by visiting your\n"
-"      member options page and clicking the\n"
-"      <em>Log out</em> button.\n"
-"</FORM>\n"
-"</body>\n"
-"</html>"
-msgstr ""
-
-#: templates/en/probe.txt:1
-#, template
-msgid ""
-"This is a probe message.  You can ignore this message.\n"
-"\n"
-"The %(listname)s mailing list has received a number of bounces from you,\n"
-"indicating that there may be a problem delivering messages to %(address)s.\n"
-"A bounce sample is attached below.  Please examine this message to make sure\n"
-"there are no problems with your email address.  You may want to check with\n"
-"your mail administrator for more help.\n"
-"\n"
-"If you are reading this, you don't need to do anything to remain an enabled\n"
-"member of the mailing list.  If this message had bounced, you would not be\n"
-"reading it, and your membership would have been disabled.  Normally when you\n"
-"are disabled, you receive occasional messages asking you to re-enable your\n"
-"subscription.\n"
-"\n"
-"You can also visit your membership page at\n"
-"\n"
-"    %(optionsurl)s\n"
-"\n"
-"On your membership page, you can change various delivery options such\n"
-"as your email address and whether you get digests or not.\n"
-"\n"
-"If you have any questions or problems, you can contact the list owner\n"
-"at\n"
-"\n"
-"    %(owneraddr)s"
-msgstr ""
-
-#: templates/en/refuse.txt:1
-#, template
-msgid ""
-"Your request to the %(listname)s mailing list\n"
-"\n"
-"    %(request)s\n"
-"\n"
-"has been rejected by the list moderator.  The moderator gave the\n"
-"following reason for rejecting your request:\n"
-"\n"
-"\"%(reason)s\"\n"
-"\n"
-"Any questions or comments should be directed to the list administrator \n"
-"at:\n"
-"\n"
-"    %(adminaddr)s"
-msgstr ""
-
-#: templates/en/roster.html:1
-#, template
-msgid ""
-"<!-- $Revision: 2.49 $ -->\n"
-"<HTML>\n"
-"  <HEAD>\n"
-"    <TITLE><MM-List-Name> Subscribers</TITLE>\n"
-"  \n"
-"  </HEAD>\n"
-"  <BODY BGCOLOR=\"#ffffff\">\n"
-"\n"
-"    <P>\n"
-"    <TABLE WIDTH=\"100%\" COLS=\"1\" BORDER=\"0\" CELLSPACING=\"4\" CELLPADDING=\"5\">\n"
-"      <TR>\n"
-"\t<TD COLSPAN=\"2\" WIDTH=\"100%\" BGCOLOR=\"#99CCFF\" ALIGN=\"CENTER\">\n"
-"\t  <B><FONT COLOR=\"#000000\" SIZE=\"+1\"><MM-List-Name>\n"
-"\t\tSubscribers</FONT></B>\n"
-"\t</TD>\n"
-"      </TR>\n"
-"      <TR>\n"
-"\t<TD COLSPAN=\"2\" WIDTH=\"100%\" ALIGN=\"CENTER\">\n"
-"\t    \n"
-"          <P align = \"right\"> <MM-lang-form-start><MM-displang-box>\n"
-"                       <MM-list-langs><MM-form-end></p>        \n"
-"\n"
-"\t  <P>Click on your address to visit your subscription\n"
-"\t      options page.<br><I>(Parenthesized entries have list delivery \n"
-"\t      disabled.)</I></P>\n"
-"\t</TD>\n"
-"      </TR>\n"
-"      <TR WIDTH=\"100%\" VALIGN=\"top\">\n"
-"\t<TD BGCOLOR=\"#FFF0D0\" WIDTH=\"50%\">\n"
-"\t  <center>\n"
-"\t    <B><FONT COLOR=\"#000000\"><MM-Num-Reg-Users>\n"
-"\t\t  Non-digested Members of <MM-List-Name>:</FONT></B>\n"
-"\t  </center>\n"
-"\t</TD>\n"
-"\t<TD BGCOLOR=\"#FFF0D0\" WIDTH=\"50%\">\n"
-"\t  <center>\n"
-"\t    <B><FONT COLOR=\"#000000\"><MM-Num-Digesters> Digested\n"
-"\t\t  Members of <MM-List-Name>:</FONT></B> \n"
-"\t  </center>\n"
-"\t</TD>\n"
-"      </TR>\n"
-"      <TR VALIGN=\"top\">\n"
-"\t<td>\n"
-"\t  <P><MM-Regular-Users>\n"
-"\t</td>\n"
-"\t<td>\n"
-"\t  <P><MM-Digest-Users>\n"
-"\t</td>\n"
-"      </tr>\n"
-"    </table>\n"
-"<MM-Mailman-Footer>\n"
-"</BODY>\n"
-"</HTML>"
-msgstr ""
-
-#: templates/en/subauth.txt:1
-#, template
-msgid ""
-"Your authorization is required for a mailing list subscription request\n"
-"approval:\n"
-"\n"
-"    For:  %(username)s\n"
-"    List: %(listname)s@%(hostname)s\n"
-"\n"
-"At your convenience, visit:\n"
-"\n"
-"    %(admindb_url)s\n"
-"\t\n"
-"to process the request."
-msgstr ""
-
-#: templates/en/subscribe.html:1
-#, template
-msgid ""
-"<!-- $Revision: 2.49 $ -->\n"
-"<html>\n"
-"<head><title><MM-List-Name> Subscription results</title></head>\n"
-"<body bgcolor=\"white\">\n"
-"<h1><MM-List-Name> Subscription results</h1>\n"
-"<MM-Results>\n"
-"<MM-Mailman-Footer>\n"
-"</body>\n"
-"</html>"
-msgstr ""
-
-#: templates/en/subscribeack.txt:1
-#, template
-msgid ""
-"Welcome to the %(real_name)s@%(host_name)s mailing list!\n"
-"%(welcome)s\n"
-"To post to this list, send your email to:\n"
-"\n"
-"  %(emailaddr)s\n"
-"\n"
-"General information about the mailing list is at:\n"
-"\n"
-"  %(listinfo_url)s\n"
-"\n"
-"If you ever want to unsubscribe or change your options (eg, switch to or\n"
-"from digest mode, change your password, etc.), visit your subscription\n"
-"page at:\n"
-"\n"
-"  %(optionsurl)s\n"
-"%(umbrella)s\n"
-"You can also make such adjustments via email by sending a message to:\n"
-"\n"
-"  %(real_name)s-request@%(host_name)s\n"
-"\n"
-"with the word `help' in the subject or body (don't include the\n"
-"quotes), and you will get back a message with instructions.\n"
-"\n"
-"You must know your password to change your options (including changing\n"
-"the password, itself) or to unsubscribe.  It is:\n"
-"\n"
-"  %(password)s\n"
-"\n"
-"Normally, Mailman will remind you of your %(host_name)s mailing list\n"
-"passwords once every month, although you can disable this if you\n"
-"prefer.  This reminder will also include instructions on how to\n"
-"unsubscribe or change your account options.  There is also a button on\n"
-"your options page that will email your current password to you."
-msgstr ""
-
-#: templates/en/unsub.txt:1
-#, template
-msgid ""
-"Mailing list removal confirmation notice for mailing list %(listname)s\n"
-"\n"
-"We have received a request%(remote)s for the removal of your email\n"
-"address, \"%(email)s\" from the %(listaddr)s mailing list.  To confirm\n"
-"that you want to be removed from this mailing list, simply reply to\n"
-"this message, keeping the Subject: header intact.  Or visit this web\n"
-"page:\n"
-"\n"
-"    %(confirmurl)s\n"
-"\n"
-"Or include the following line -- and only the following line -- in a\n"
-"message to %(requestaddr)s:\n"
-"\n"
-"    confirm %(cookie)s\n"
-"\n"
-"Note that simply sending a `reply' to this message should work from\n"
-"most mail readers, since that usually leaves the Subject: line in\n"
-"the right form (additional \"Re:\" text in the Subject: is okay).\n"
-"\n"
-"If you do not wish to be removed from this list, please simply\n"
-"disregard this message.  If you think you are being maliciously\n"
-"removed from the list, or have any other questions, send them to\n"
-"%(listadmin)s."
-msgstr ""
-
-#: templates/en/unsubauth.txt:1
-#, template
-msgid ""
-"Your authorization is required for a mailing list unsubscription\n"
-"request approval:\n"
-"\n"
-"    By:   %(username)s\n"
-"    From: %(listname)s@%(hostname)s\n"
-"\n"
-"At your convenience, visit:\n"
-"\n"
-"    %(admindb_url)s\n"
-"\n"
-"to process the request."
-msgstr ""
-
-#: templates/en/userpass.txt:1
-#, template
-msgid ""
-"You, or someone posing as you, has requested a password reminder for\n"
-"your membership on the mailing list %(fqdn_lname)s.  You will need\n"
-"this password in order to change your membership options (e.g. do you\n"
-"want regular delivery or digest delivery), and having this password\n"
-"makes it easier for you to unsubscribe from the mailing list.\n"
-"\n"
-"You are subscribed with the address: %(user)s\n"
-"\n"
-"Your %(listname)s password is: %(password)s\n"
-"\n"
-"To make changes to your membership options, log in and visit your\n"
-"options web page:\n"
-"\n"
-"    %(options_url)s\n"
-"\n"
-"You can also make such changes via email by sending a message to:\n"
-"\n"
-"    %(requestaddr)s\n"
-"\n"
-"with the text \"help\" in the subject or body.  The automatic reply will\n"
-"contain more detailed instructions.\n"
-"\n"
-"Questions or comments?  Please send them to the %(listname)s mailing\n"
-"list administrator at %(owneraddr)s."
-msgstr ""
-
-#: templates/en/verify.txt:1
-#, template
-msgid ""
-"Mailing list subscription confirmation notice for mailing list %(listname)s\n"
-"\n"
-"We have received a request%(remote)s for subscription of your email\n"
-"address, \"%(email)s\", to the %(listaddr)s mailing list.  To confirm\n"
-"that you want to be added to this mailing list, simply reply to this\n"
-"message, keeping the Subject: header intact.  Or visit this web page:\n"
-"\n"
-"    %(confirmurl)s\n"
-"\n"
-"Or include the following line -- and only the following line -- in a\n"
-"message to %(requestaddr)s:\n"
-"\n"
-"    confirm %(cookie)s\n"
-"\n"
-"Note that simply sending a `reply' to this message should work from\n"
-"most mail readers, since that usually leaves the Subject: line in\n"
-"the right form (additional \"Re:\" text in the Subject: is okay).\n"
-"\n"
-"If you do not wish to be subscribed to this list, please simply\n"
-"disregard this message.  If you think you are being maliciously\n"
-"subscribed to the list, or have any other questions, send them to\n"
-"%(listadmin)s."
-msgstr ""
-
-#: templates/en/archtocnombox.html:1
-#, template
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n"
-"<HTML>\n"
-"  <HEAD>\n"
-"     <title>The %(listname)s Archives</title>\n"
-"     <META NAME=\"robots\" CONTENT=\"noindex,follow\">\n"
-"     %(meta)s\n"
-"  </HEAD>\n"
-"  <BODY BGCOLOR=\"#ffffff\">\n"
-"     <h1>The %(listname)s Archives </h1>\n"
-"     <p>\n"
-"      You can get <a href=\"%(listinfo)s\">more information about this list</a>.\n"
-"     </p>\n"
-"     %(noarchive_msg)s\n"
-"     %(archive_listing_start)s\n"
-"     %(archive_listing)s\n"
-"     %(archive_listing_end)s\n"
-"     </BODY>\n"
-"     </HTML>"
-msgstr ""
-
diff -pru mailman-cvs-HEAD/messages/Makefile.in mailman-2.1.7.cg/messages/Makefile.in
--- mailman-cvs-HEAD/messages/Makefile.in	2005-12-06 05:28:16.000000000 +0100
+++ mailman-2.1.7.cg/messages/Makefile.in	2005-10-23 10:24:01.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2003 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2005 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
@@ -47,8 +47,9 @@ DIRSETGID=	chmod g+s
 MSGFMT= 	@PYTHON@ ../build/bin/msgfmt.py
 MSGMERGE=	msgmerge
 
-# Languages from configure script
-LANGUAGES=      @LANGUAGES@
+# CVS available languages
+LANGUAGES=	ca cs da de es et eu fi fr hr hu ia it ja ko lt nl no pl \
+		pt pt_BR ro ru sl sr sv tr uk zh_CN zh_TW
 LANGDIRS=	$(LANGUAGES:%=messages/%/LC_MESSAGES)
 # Human readable po file
 POFILES=	$(LANGUAGES:%=%/LC_MESSAGES/mailman.po)
@@ -64,7 +65,6 @@ EXEMODE=	755
 FILEMODE=	644
 INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
 PROG=		@PYTHON@ build/bin/pygettext.py
-TEMPL2POT=	@PYTHON@ build/bin/templ2pot.py
 
 .SUFFIXES:	.po .mo
 .po.mo:
@@ -119,7 +119,7 @@ clean:
 	-rm -f */LC_MESSAGES/mailman.mo
 
 fileclean:
-	-rm -f marked.files docstring.files template.files
+	-rm -f marked.files docstring.files
 
 potclean: fileclean
 	-rm -f Makefile $(POTFILE)
@@ -136,14 +136,9 @@ docstring.files:
 	(cd ..; grep -d skip -l -i '^#! .*python.*' `find bin cron scripts -name ".#*" -prune -o -print` | grep -v pygettext >| messages/$@)
 	(cd ..; ls Mailman/Commands/cmd_*.py >> messages/$@)
 
-template.files:
-	@echo "Calculating template input files for templ2pot"
-	(cd ..; find templates/en -name '*.*' >| messages/$@)
-
-potfile: marked.files docstring.files template.files
+potfile: marked.files docstring.files
 	@echo "Running pygettext on $@; this make take a while."
 	(cd ..; $(PROG) -p messages -d mailman -D -X messages/marked.files `cat messages/marked.files messages/docstring.files`)
-	(cd ..; $(TEMPL2POT) `cat messages/template.files` >> messages/mailman.pot)
 
 # Update the individual mailman.po files with the new changes to the
 # .pot file
diff -pru mailman-cvs-HEAD/messages/marked.files mailman-2.1.7.cg/messages/marked.files
--- mailman-cvs-HEAD/messages/marked.files	2005-12-06 05:28:16.000000000 +0100
+++ mailman-2.1.7.cg/messages/marked.files	2005-12-11 08:15:03.000000000 +0100
@@ -4,8 +4,8 @@ Mailman/Archiver/HyperDatabase.py
 Mailman/Archiver/__init__.py
 Mailman/Archiver/pipermail.py
 Mailman/Autoresponder.py
-Mailman/BDBMemberAdaptor.py
 Mailman/Bouncer.py
+Mailman/Defaults.py
 Mailman/Deliverer.py
 Mailman/Digester.py
 Mailman/Errors.py
@@ -127,4 +127,3 @@ Mailman/Queue/Switchboard.py
 Mailman/Queue/VirginRunner.py
 Mailman/Queue/__init__.py
 Mailman/Queue/sbcache.py
-Mailman/Defaults.py
diff -pru mailman-cvs-HEAD/misc/Makefile.in mailman-2.1.7.cg/misc/Makefile.in
--- mailman-cvs-HEAD/misc/Makefile.in	2006-03-10 11:36:04.000000000 +0100
+++ mailman-2.1.7.cg/misc/Makefile.in	2005-08-27 03:40:17.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
@@ -12,8 +12,7 @@
 # 
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 # NOTE: Makefile.in is converted into Makefile by the configure script
 # in the parent directory.  Once configure has run, you can recreate
@@ -51,10 +50,13 @@ SETUPINSTOPTS=	--install-lib $(DESTDIR)$
 		--install-purelib $(DESTDIR)$(PYTHONLIBDIR) \
 		--install-data $(DESTDIR)$(PYTHONLIBDIR)
 SETUPCMD=	setup.py --quiet install $(SETUPINSTOPTS)
+PKGDIR= 	$(srcdir)
 
-EMAILPKG=	email-2.5.7
+EMAILPKG=	email-2.5.6
+JACODECSPKG=	JapaneseCodecs-1.4.11
+KOCODECSPKG=	KoreanCodecs-2.0.5
 
-PACKAGES= $(EMAILPKG)
+PACKAGES= $(EMAILPKG) $(JACODECSPKG) $(KOCODECSPKG)
 
 # Modes for directories and executables created by the install
 # process.  Default to group-writable directories but
@@ -75,7 +77,10 @@ all:
 install: install-other install-packages
 
 install-other:
-	$(INSTALL) -m $(FILEMODE) $(ICONS) $(DESTDIR)$(ICONDIR)
+	for i in $(ICONS); \
+	do \
+	  $(INSTALL) -m $(FILEMODE) $$i $(DESTDIR)$(ICONDIR); \
+	done
 	for d in $(PATHSDIRS); \
 	do \
 	    dir=$(DESTDIR)$(prefix)/$$d; \
@@ -87,8 +92,8 @@ install-other:
 install-packages:
 	for p in $(PACKAGES); \
 	do \
-	    gunzip -c $(srcdir)/$$p.tar.gz | tar xf -; \
-	    (cd $$p ; umask 02 ; PYTHONPATH=$(PYTHONLIBDIR) $(PYTHON) $(SETUPCMD)); \
+	    gunzip -c $(srcdir)/$$p.tar.gz | (cd $(PKGDIR) ; tar xf -); \
+	    (cd $(PKGDIR)/$$p ; umask 02 ; PYTHONPATH=$(PYTHONLIBDIR) $(PYTHON) $(SETUPCMD)); \
 	done
 
 finish:
diff -pru mailman-cvs-HEAD/misc/paths.py.in mailman-2.1.7.cg/misc/paths.py.in
--- mailman-cvs-HEAD/misc/paths.py.in	2005-12-30 19:56:46.000000000 +0100
+++ mailman-2.1.7.cg/misc/paths.py.in	2005-12-30 19:50:08.000000000 +0100
@@ -6,14 +6,14 @@
 # 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 
+# along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
 # USA.
 
@@ -49,6 +49,16 @@ sitedir = os.path.join(sys.prefix, 'lib'
                        'site-packages')
 sys.path.append(sitedir)
 
+
+# In a normal interactive Python environment, the japanese.pth and korean.pth
+# files would be imported automatically.  But because we inhibit the importing
+# of the site module, we need to be explicit about importing these codecs.
+import japanese
+# As of KoreanCodecs 2.0.5, you had to do the second import to get the Korean
+# codecs installed, however leave the first import in there in case an upgrade
+# changes this.
+import korean
+import korean.aliases
 # Arabic and Hebrew (RFC-1556) encoding aliases. (temporary solution)
 import encodings.aliases
 encodings.aliases.aliases.update({
diff -pru mailman-cvs-HEAD/NEWS mailman-2.1.7.cg/NEWS
--- mailman-cvs-HEAD/NEWS	2006-03-03 01:20:28.000000000 +0100
+++ mailman-2.1.7.cg/NEWS	2005-12-31 12:43:55.000000000 +0100
@@ -4,21 +4,6 @@ Copyright (C) 1998-2005 by the Free Soft
 
 Here is a history of user visible changes to Mailman.
 
-2.2 alpha 1 (XX-XXX-200X)
-
-  Internationalization Big Changes
-
-    - Now the languages should be selected during the 'configure' run.
-
-    - Translators should work only on messages/<lang>/LC_MESSAGES/mailman.po.
-      Templates files are generated from mailman.po during the make process.
-
-  New Features
-
-    - Confirmed member change of address is logged in the 'subscribe' log,
-      and if admin_notify_mchanges is true, a notice is sent to the list
-      owner using a new adminaddrchgack.txt template.
-
 2.1.7 (31-Dec-2005)
 
   Security
diff -pru mailman-cvs-HEAD/README mailman-2.1.7.cg/README
--- mailman-cvs-HEAD/README	2005-08-28 06:05:07.000000000 +0200
+++ mailman-2.1.7.cg/README	2006-03-13 10:07:48.000000000 +0100
@@ -1,5 +1,5 @@
 Mailman - The GNU Mailing List Management System
-Copyright (C) 1998-2005 by the Free Software Foundation, Inc.
+Copyright (C) 1998-2004 by the Free Software Foundation, Inc.
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
 
 INTRODUCTION
@@ -29,14 +29,19 @@ INTRODUCTION
         http://www.gnu.org/software/mailman
         http://mailman.sf.net
 
-    Mailman 2.2 requires Python 2.3.5 or greater, which can be downloaded from:
+    Mailman 2.1 requires Python 2.1.3 or greater, which can be downloaded from:
 
         http://www.python.org
 
-    It is recommended that you use Python 2.4.1, the latest release as of this
-    writing (28-Aug-2005).
-
-        http://www.python.org/2.4.1
+    It is recommended that you use Python 2.3.3, the latest release as of this
+    writing (31-Dec-2003).  Update: 15-May-2004, the Python 2.3.4 release is
+    imminent, see:
+
+        http://www.python.org/2.3.4
+
+    Mailman will work with Python 2.2.3 as well, which is the latest release
+    on the Python 2.2 branch.  Mailman 2.1 is not compatible with Python 2.0
+    or any earlier version.
 
     You will also need an ANSI C compiler to build both Python and Mailman;
     gcc (the GNU C compiler) works just fine.  Mailman currently works only on
diff -pru mailman-cvs-HEAD/templates/Makefile.in mailman-2.1.7.cg/templates/Makefile.in
--- mailman-cvs-HEAD/templates/Makefile.in	2006-01-14 09:11:21.000000000 +0100
+++ mailman-2.1.7.cg/templates/Makefile.in	2005-10-23 10:24:01.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2003 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2005 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
@@ -42,8 +42,8 @@ TEMPLATEDIR= 	$(prefix)/templates
 
 SHELL=		/bin/sh
 
-LANGUAGES=	en @LANGUAGES@
-MAKELANGS=	@LANGUAGES@
+LANGUAGES=	ca cs da de en es et eu fi fr hr hu ia it ja ko lt nl \
+		no pl pt pt_BR ro ru sl sr sv tr uk zh_CN zh_TW
 
 # Modes for directories and executables created by the install
 # process.  Default to group-writable directories but
@@ -52,18 +52,13 @@ DIRMODE=	775
 EXEMODE=	755
 FILEMODE=	644
 INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
-PO2TEMPL= @PYTHON@ build/bin/po2templ.py
 
 
 # Rules
 
 all:
-	for d in $(MAKELANGS); \
-	do \
-	    (mkdir -p $$d; cd ..; $(PO2TEMPL) $$d) \
-	done
 
-install: all
+install:
 	for d in $(LANGUAGES); \
 	do \
 	    $(srcdir)/../mkinstalldirs $(DESTDIR)$(TEMPLATEDIR)/$$d; \
@@ -76,8 +71,6 @@ install: all
 finish:
 
 clean:
-	-rm -rf $(MAKELANGS)
 
 distclean:
 	-rm -f Makefile
-	-rm -rf $(MAKELANGS)
diff -pru mailman-cvs-HEAD/tests/test_bounces.py mailman-2.1.7.cg/tests/test_bounces.py
--- mailman-cvs-HEAD/tests/test_bounces.py	2006-03-10 11:36:15.000000000 +0100
+++ mailman-2.1.7.cg/tests/test_bounces.py	2005-08-27 03:40:17.000000000 +0200
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001,2002 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
@@ -12,8 +12,7 @@
 #
 # 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """Test the bounce detection modules."""
 
@@ -22,8 +21,6 @@ import os
 import unittest
 import email
 
-from Mailman.Bouncers.BouncerAPI import Stop
-
 
 
 class BounceTest(unittest.TestCase):
@@ -43,24 +40,14 @@ class BounceTest(unittest.TestCase):
         ('SimpleMatch', 'simple_04.txt', ['claird@starbase.neosoft.com']),
         ('SimpleMatch', 'newmailru_01.txt', ['zzzzz@newmail.ru']),
         ('SimpleMatch', 'hotpop_01.txt', ['allensmithee@hotpop.com']),
-        ('SimpleMatch', 'microsoft_03.txt', ['midica@banknbr.com']),
-        ('SimpleMatch', 'simple_05.txt', ['rlosardo@sbcglobal.net']),
-        ('SimpleMatch', 'simple_06.txt', ['dlyle@hamiltonpacific.com']),
-        ('SimpleMatch', 'simple_07.txt', ['william.xxxx@sbcglobal.net']),
-        ('SimpleMatch', 'simple_08.txt', ['severin.XXX@t-online.de']),
-        ('SimpleMatch', 'simple_09.txt', ['RobotMail@auto-walther.de']),
-        ('SimpleMatch', 'simple_10.txt', ['sais@thehartford.com']),
-        ('SimpleMatch', 'simple_11.txt', ['carlosr73@hartfordlife.com']),
         # SimpleWarning
-        ('SimpleWarning', 'simple_03.txt', Stop),
+        ('SimpleWarning', 'simple_03.txt', ['jacobus@geo.co.za']),
         # GroupWise
         ('GroupWise', 'groupwise_01.txt', ['thoff@MAINEX1.ASU.EDU']),
         # This one really sucks 'cause it's text/html.  Just make sure it
         # doesn't throw an exception, but we won't get any meaningful
         # addresses back from it.
         ('GroupWise', 'groupwise_02.txt', []),
-        # Actually, it's from Exchange, and Exchange does recognize it
-        ('Exchange', 'groupwise_02.txt', ['omarmo@thebas.com']),
         # Yale's own
         ('Yale', 'yale_01.txt', ['thomas.dtankengine@cs.yale.edu',
                                  'thomas.dtankengine@yale.edu']),
@@ -69,14 +56,13 @@ class BounceTest(unittest.TestCase):
         ('DSN', 'dsn_02.txt', ['zzzzz@zeus.hud.ac.uk']),
         ('DSN', 'dsn_03.txt', ['ddd.kkk@advalvas.be']),
         ('DSN', 'dsn_04.txt', ['max.haas@unibas.ch']),
-        ('DSN', 'dsn_05.txt', Stop),
-        ('DSN', 'dsn_06.txt', Stop),
-        ('DSN', 'dsn_07.txt', Stop),
-        ('DSN', 'dsn_08.txt', Stop),
+        ('DSN', 'dsn_05.txt', ['pkocmid@atlas.cz']),
+        ('DSN', 'dsn_06.txt', ['hao-nghi.au@fr.thalesgroup.com']),
+        ('DSN', 'dsn_07.txt', ['david.farrar@parliament.govt.nz']),
+        ('DSN', 'dsn_08.txt', ['news-list.zope@localhost.bln.innominate.de']),
         ('DSN', 'dsn_09.txt', ['pr@allen-heath.com']),
         ('DSN', 'dsn_10.txt', ['anne.person@dom.ain']),
         ('DSN', 'dsn_11.txt', ['joem@example.com']),
-        ('DSN', 'dsn_12.txt', ['auaauqdgrdz@jtc-con.co.jp']),
         # Microsoft Exchange
         ('Exchange', 'microsoft_01.txt', ['DJBENNETT@IKON.COM']),
         ('Exchange', 'microsoft_02.txt', ['MDMOORE@BALL.COM']),
@@ -84,13 +70,8 @@ class BounceTest(unittest.TestCase):
         ('SMTP32', 'smtp32_01.txt', ['oliver@pcworld.com.ph']),
         ('SMTP32', 'smtp32_02.txt', ['lists@mail.spicynoodles.com']),
         ('SMTP32', 'smtp32_03.txt', ['borisk@gw.xraymedia.com']),
-        ('SMTP32', 'smtp32_04.txt', ['after_another@pacbell.net',
-                                     'one_bad_address@pacbell.net']),
-        ('SMTP32', 'smtp32_05.txt', ['jmrpowersports@jmrpowersports.com']),
-        ('SMTP32', 'smtp32_06.txt', ['Absolute_garbage_addr@pacbell.net']),
         # Qmail
         ('Qmail', 'qmail_01.txt', ['psadisc@wwwmail.n-h.de']),
-        ('Qmail', 'qmail_02.txt', ['rauschlo@frontfin.com']),
         # LLNL's custom Sendmail
         ('LLNL', 'llnl_01.txt', ['trotts1@llnl.gov']),
         # Netscape's server...
@@ -120,9 +101,6 @@ class BounceTest(unittest.TestCase):
                                    'yuli_kolesnikov@yahoo.com']),
         ('Yahoo', 'yahoo_09.txt', ['hankel_o_fung@yahoo.com',
                                    'ultravirus2001@yahoo.com']),
-        ('Yahoo', 'yahoo_10.txt', ['jajcchoo@yahoo.com',
-                                   'lyons94706@yahoo.com',
-                                   'turtle4jne@yahoo.com']),
         # sina.com appears to use their own weird SINAEMAIL MTA
         ('Sina', 'sina_01.txt', ['boboman76@sina.com', 'alan_t18@sina.com']),
         # No address can be detected in these...
@@ -143,12 +121,8 @@ class BounceTest(unittest.TestCase):
             # Some modules return None instead of [] for failure
             if foundaddrs is None:
                 foundaddrs = []
-            if foundaddrs is not Stop:
-                # MAS: The following strip() is only because of my
-                # hybrid test environment.  It is not otherwise needed.
-                foundaddrs = [found.strip() for found in foundaddrs]
-                addrs.sort()
-                foundaddrs.sort()
+            addrs.sort()
+            foundaddrs.sort()
             self.assertEqual(addrs, foundaddrs)
 
     def test_SMTP32_failure(self):
diff -pru mailman-cvs-HEAD/TODO mailman-2.1.7.cg/TODO
--- mailman-cvs-HEAD/TODO	2005-08-27 03:54:02.000000000 +0200
+++ mailman-2.1.7.cg/TODO	2005-08-27 03:40:15.000000000 +0200
@@ -4,7 +4,7 @@ Copyright (C) 1998-2003 by the Free Soft
 
 
 The Mailman Wishlist
-(Last Update: $Date: 2005/08/27 01:54:02 $)
+(Last Update: $Date: 2005/08/27 01:40:15 $)
 
     Here's the wish list for future versions of Mailman.  Many new
     features have been added to Mailman 2.1, and it is currently
