From 759edbf3f4207a0d5654911cfa38150d2e7220b3 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Sun, 15 Nov 2009 18:04:04 -0600 Subject: Factor out most of the i18n subsystem and convert to using the flufl.i18n package. --- src/mailman/Archiver/HyperArch.py | 35 ++-- src/mailman/Archiver/pipermail.py | 2 +- src/mailman/Utils.py | 4 +- src/mailman/__init__.py | 5 + src/mailman/app/bounces.py | 2 +- src/mailman/app/membership.py | 4 +- src/mailman/app/moderator.py | 7 +- src/mailman/app/notifications.py | 7 +- src/mailman/app/registrar.py | 2 +- src/mailman/app/replybot.py | 3 +- src/mailman/bin/arch.py | 9 +- src/mailman/bin/bumpdigests.py | 2 +- src/mailman/bin/check_perms.py | 2 +- src/mailman/bin/checkdbs.py | 22 +-- src/mailman/bin/cleanarch.py | 2 +- src/mailman/bin/config_list.py | 9 +- src/mailman/bin/disabled.py | 2 +- src/mailman/bin/dumpdb.py | 2 +- src/mailman/bin/export.py | 2 +- src/mailman/bin/find_member.py | 2 +- src/mailman/bin/gate_news.py | 2 +- src/mailman/bin/genaliases.py | 2 +- src/mailman/bin/import.py | 4 +- src/mailman/bin/list_members.py | 2 +- src/mailman/bin/list_owners.py | 2 +- src/mailman/bin/mailman.py | 2 +- src/mailman/bin/master.py | 2 +- src/mailman/bin/mmsitepass.py | 2 +- src/mailman/bin/nightly_gzip.py | 2 +- src/mailman/bin/qrunner.py | 2 +- src/mailman/bin/senddigests.py | 2 +- src/mailman/bin/set_members.py | 6 +- src/mailman/bin/show_config.py | 2 +- src/mailman/bin/show_qfiles.py | 2 +- src/mailman/bin/unshunt.py | 2 +- src/mailman/bin/update.py | 2 +- src/mailman/bin/withlist.py | 2 +- src/mailman/chains/accept.py | 2 +- src/mailman/chains/builtin.py | 2 +- src/mailman/chains/discard.py | 2 +- src/mailman/chains/headers.py | 2 +- src/mailman/chains/hold.py | 7 +- src/mailman/chains/reject.py | 2 +- src/mailman/commands/cli_control.py | 2 +- src/mailman/commands/cli_info.py | 2 +- src/mailman/commands/cli_inject.py | 2 +- src/mailman/commands/cli_lists.py | 4 +- src/mailman/commands/cli_members.py | 2 +- src/mailman/commands/eml_echo.py | 2 +- src/mailman/commands/eml_end.py | 2 +- src/mailman/commands/eml_join.py | 2 +- src/mailman/config/config.py | 3 + src/mailman/core/i18n.py | 111 ++++++++++++ src/mailman/core/initialize.py | 1 + src/mailman/core/pipelines.py | 2 +- src/mailman/i18n.py | 259 --------------------------- src/mailman/interfaces/domain.py | 2 +- src/mailman/interfaces/mailinglist.py | 2 +- src/mailman/interfaces/system.py | 2 +- src/mailman/mta/postfix.py | 2 +- src/mailman/options.py | 2 +- src/mailman/pipeline/acknowledge.py | 2 +- src/mailman/pipeline/after_delivery.py | 2 +- src/mailman/pipeline/avoid_duplicates.py | 2 +- src/mailman/pipeline/calculate_recipients.py | 2 +- src/mailman/pipeline/cleanse.py | 2 +- src/mailman/pipeline/cleanse_dkim.py | 2 +- src/mailman/pipeline/cook_headers.py | 2 +- src/mailman/pipeline/decorate.py | 2 +- src/mailman/pipeline/file_recipients.py | 2 +- src/mailman/pipeline/mime_delete.py | 3 +- src/mailman/pipeline/moderate.py | 2 +- src/mailman/pipeline/replybot.py | 2 +- src/mailman/pipeline/scrubber.py | 2 +- src/mailman/pipeline/tagger.py | 2 +- src/mailman/pipeline/to_archive.py | 2 +- src/mailman/pipeline/to_digest.py | 2 +- src/mailman/pipeline/to_outgoing.py | 2 +- src/mailman/pipeline/to_usenet.py | 2 +- src/mailman/queue/__init__.py | 4 +- src/mailman/queue/bounce.py | 7 +- src/mailman/queue/command.py | 2 +- src/mailman/queue/digest.py | 7 +- src/mailman/rules/administrivia.py | 2 +- src/mailman/rules/any.py | 2 +- src/mailman/rules/approved.py | 2 +- src/mailman/rules/emergency.py | 2 +- src/mailman/rules/implicit_dest.py | 2 +- src/mailman/rules/loop.py | 2 +- src/mailman/rules/max_recipients.py | 2 +- src/mailman/rules/max_size.py | 2 +- src/mailman/rules/moderation.py | 2 +- src/mailman/rules/news_moderation.py | 2 +- src/mailman/rules/no_subject.py | 2 +- src/mailman/rules/suspicious.py | 2 +- src/mailman/rules/truth.py | 2 +- src/mailman/styles/default.py | 2 +- src/mailman/testing/layers.py | 2 +- 98 files changed, 260 insertions(+), 413 deletions(-) create mode 100644 src/mailman/core/i18n.py delete mode 100644 src/mailman/i18n.py (limited to 'src') diff --git a/src/mailman/Archiver/HyperArch.py b/src/mailman/Archiver/HyperArch.py index c7b1b0045..67c62a682 100644 --- a/src/mailman/Archiver/HyperArch.py +++ b/src/mailman/Archiver/HyperArch.py @@ -46,21 +46,18 @@ from string import Template from zope.component import getUtility from mailman import Utils -from mailman import i18n from mailman.Archiver import HyperDatabase from mailman.Archiver import pipermail from mailman.config import config +from mailman.core.i18n import _, ctime from mailman.interfaces.listmanager import IListManager log = logging.getLogger('mailman.error') - -# Set up i18n. Assume the current language has already been set in the caller. -_ = i18n._ - EMPTYSTRING = '' NL = '\n' + # MacOSX has a default stack size that is too small for deeply recursive # regular expressions. We see this as crashes in the Python test suite when # running test_re.py and test_sre.py. The fix is to set the stack limit to @@ -109,7 +106,7 @@ def sizeof(filename, lang): if e.errno <> errno.ENOENT: raise return _('size not available') if size < 1000: - with i18n.using_language(lang.code): + with _.using(lang.code): out = _(' %(size)i bytes ') return out elif size < 1000000: @@ -256,7 +253,7 @@ class Article(pipermail.Article): # article (for this list) could be different from the site-wide # preferred language, so we need to ensure no side-effects will # occur. Think what happens when executing bin/arch. - with i18n.using_language(lang.code): + with _.using(lang.code): if self.author == self.email: self.author = self.email = re.sub('@', _(' at '), self.email) @@ -359,7 +356,7 @@ class Article(pipermail.Article): self.decoded['email'] = email if subject: if as_boolean(config.archiver.pipermail.obscure_email_addresses): - with i18n.using_language(self._lang.code): + with _.using(self._lang.code): atmark = _(' at ') subject = re.sub(r'([-+,.\w]+)@([-+.\w]+)', '\g<1>' + atmark + '\g<2>', subject) @@ -396,8 +393,8 @@ class Article(pipermail.Article): def as_html(self): d = self.__dict__.copy() - # avoid i18n side-effects - with i18n.using_language(self._lang.code): + # Avoid i18n side-effects + with _.using(self._lang.code): d["prev"], d["prev_wsubj"] = self._get_prev() d["next"], d["next_wsubj"] = self._get_next() @@ -415,7 +412,7 @@ class Article(pipermail.Article): emailurl = self.email d["author_html"] = self.quote(author) d["email_url"] = url_quote(emailurl) - d["datestr_html"] = self.quote(i18n.ctime(int(self.date))) + d["datestr_html"] = self.quote(ctime(int(self.date))) d["body"] = self._get_body() d['listurl'] = self._mlist.script_url('listinfo') d['listname'] = self._mlist.real_name @@ -511,7 +508,7 @@ class Article(pipermail.Article): if not isinstance(body, unicode): body = unicode(body, cset, 'replace') if as_boolean(config.archiver.pipermail.obscure_email_addresses): - with i18n.using_language(self._lang.code): + with _.using(self._lang.code): atmark = _(' at ') body = re.sub(r'([-+,.\w]+)@([-+.\w]+)', '\g<1>' + atmark + '\g<2>', body) @@ -608,12 +605,12 @@ class HyperArchive(pipermail.T): mlist=self.maillist) def html_foot(self): - # avoid i18n side-effects mlist = self.maillist # Convenience def quotetime(s): - return html_quote(i18n.ctime(s), self.lang.code) - with i18n.using_language(mlist.preferred_language.code): + return html_quote(ctime(s), self.lang.code) + # Avoid i18n side-effects + with _.using(mlist.preferred_language.code): d = {"lastdate": quotetime(self.lastdate), "archivedate": quotetime(self.archivedate), "listinfo": mlist.script_url('listinfo'), @@ -636,12 +633,12 @@ class HyperArchive(pipermail.T): mlist=mlist) def html_head(self): - # avoid i18n side-effects mlist = self.maillist # Convenience def quotetime(s): - return html_quote(i18n.ctime(s), self.lang.code) - with i18n.using_language(mlist.preferred_language.code): + return html_quote(ctime(s), self.lang.code) + # Avoid i18n side-effects + with _.using(mlist.preferred_language.code): d = {"listname": html_quote(mlist.real_name, self.lang.code), "archtype": self.type, "archive": self.volNameToDesc(self.archive), @@ -682,7 +679,7 @@ class HyperArchive(pipermail.T): 'meta': '', } # Avoid i18n side-effects - with i18n.using_language(mlist.preferred_language.code): + with _.using(mlist.preferred_language.code): if not self.archives: d["noarchive_msg"] = _( '
Currently, there are no archives.
') diff --git a/src/mailman/Archiver/pipermail.py b/src/mailman/Archiver/pipermail.py index e6c87baa0..f47600eb1 100644 --- a/src/mailman/Archiver/pipermail.py +++ b/src/mailman/Archiver/pipermail.py @@ -18,7 +18,7 @@ VERSION = __version__ CACHESIZE = 100 # Number of slots in the cache from mailman.core import errors -from mailman.i18n import _ +from mailman.core.i18n import _ SPACE = ' ' diff --git a/src/mailman/Utils.py b/src/mailman/Utils.py index 7f2fd2a8f..bde703cf4 100644 --- a/src/mailman/Utils.py +++ b/src/mailman/Utils.py @@ -50,6 +50,7 @@ import mailman.templates from mailman import passwords from mailman.config import config from mailman.core import errors +from mailman.core.i18n import _ from mailman.utilities.string import expand @@ -398,10 +399,9 @@ def findtext(templatefile, raw_dict=None, raw=False, lang=None, mlist=None): # We never found the template. BAD! raise IOError(errno.ENOENT, 'No template file found', templatefile) else: - from mailman.i18n import get_translation # XXX BROKEN HACK data = fp.read()[:-1] - template = get_translation().ugettext(data) + template = _(data) fp.close() else: template = fp.read() diff --git a/src/mailman/__init__.py b/src/mailman/__init__.py index e5f46e3d4..5f1ced22f 100644 --- a/src/mailman/__init__.py +++ b/src/mailman/__init__.py @@ -38,3 +38,8 @@ try: except ImportError: import pkgutil __path__ = pkgutil.extend_path(__path__, __name__) + + +# We have to initialize the i18n subsystem before anything else happens. +from mailman.core.i18n import initialize +initialize() diff --git a/src/mailman/app/bounces.py b/src/mailman/app/bounces.py index 3972e2e6d..34939edc4 100644 --- a/src/mailman/app/bounces.py +++ b/src/mailman/app/bounces.py @@ -30,8 +30,8 @@ from email.mime.message import MIMEMessage from email.mime.text import MIMEText from mailman.Utils import oneline +from mailman.core.i18n import _ from mailman.email.message import UserNotification -from mailman.i18n import _ log = logging.getLogger('mailman.config') diff --git a/src/mailman/app/membership.py b/src/mailman/app/membership.py index 5f58b66d5..f8234f808 100644 --- a/src/mailman/app/membership.py +++ b/src/mailman/app/membership.py @@ -30,16 +30,14 @@ from email.utils import formataddr from zope.component import getUtility from mailman import Utils -from mailman import i18n from mailman.app.notifications import send_goodbye_message from mailman.core import errors +from mailman.core.i18n import _ from mailman.email.message import OwnerNotification from mailman.email.validate import validate from mailman.interfaces.member import AlreadySubscribedError, MemberRole from mailman.interfaces.usermanager import IUserManager -_ = i18n._ - def add_member(mlist, address, realname, password, delivery_mode, language): diff --git a/src/mailman/app/moderator.py b/src/mailman/app/moderator.py index 1a09567e7..3151e91c8 100644 --- a/src/mailman/app/moderator.py +++ b/src/mailman/app/moderator.py @@ -36,12 +36,12 @@ from email.utils import formataddr, formatdate, getaddresses, make_msgid from zope.component import getUtility from mailman import Utils -from mailman import i18n from mailman.app.membership import add_member, delete_member from mailman.app.notifications import ( send_admin_subscription_notice, send_welcome_message) from mailman.config import config from mailman.core import errors +from mailman.core.i18n import _ from mailman.email.message import UserNotification from mailman.interfaces.action import Action from mailman.interfaces.member import AlreadySubscribedError, DeliveryMode @@ -49,7 +49,6 @@ from mailman.interfaces.messages import IMessageStore from mailman.interfaces.requests import IRequests, RequestType -_ = i18n._ NL = '\n' vlog = logging.getLogger('mailman.vette') @@ -169,7 +168,7 @@ def handle_message(mlist, id, action, member = mlist.members.get_member(addresses[0]) if member: language = member.preferred_language - with i18n.using_language(language.code): + with _.using(language.code): fmsg = UserNotification( addresses, mlist.bounces_address, _('Forward of moderated message'), @@ -343,7 +342,7 @@ def _refuse(mlist, request, recip, comment, origmsg=None, lang=None): 'reason' : comment, 'adminaddr': mlist.owner_address, }, lang=lang.code, mlist=mlist) - with i18n.using_language(lang.code): + with _.using(lang.code): # add in original message, but not wrap/filled if origmsg: text = NL.join( diff --git a/src/mailman/app/notifications.py b/src/mailman/app/notifications.py index ac57a2154..bb72e8bc4 100644 --- a/src/mailman/app/notifications.py +++ b/src/mailman/app/notifications.py @@ -31,15 +31,12 @@ from email.utils import formataddr from lazr.config import as_boolean from mailman import Utils -from mailman import i18n from mailman.config import config +from mailman.core.i18n import _ from mailman.email.message import OwnerNotification, UserNotification from mailman.interfaces.member import DeliveryMode -_ = i18n._ - - def send_welcome_message(mlist, address, language, delivery_mode, text=''): """Send a welcome message to a subscriber. @@ -124,7 +121,7 @@ def send_admin_subscription_notice(mlist, address, full_name, language): :param language: the language of the address's realname :type language: string """ - with i18n.using_language(mlist.preferred_language.code): + with _.using(mlist.preferred_language.code): subject = _('$mlist.real_name subscription notification') full_name = full_name.encode(language.charset, 'replace') text = Utils.maketext( diff --git a/src/mailman/app/registrar.py b/src/mailman/app/registrar.py index 9fc9b8bac..c24376494 100644 --- a/src/mailman/app/registrar.py +++ b/src/mailman/app/registrar.py @@ -32,9 +32,9 @@ from zope.component import getUtility from zope.interface import implements from mailman.config import config +from mailman.core.i18n import _ from mailman.email.message import UserNotification from mailman.email.validate import validate -from mailman.i18n import _ from mailman.interfaces.domain import IDomain from mailman.interfaces.listmanager import IListManager from mailman.interfaces.member import MemberRole diff --git a/src/mailman/app/replybot.py b/src/mailman/app/replybot.py index 2233378da..4d6cb23a4 100644 --- a/src/mailman/app/replybot.py +++ b/src/mailman/app/replybot.py @@ -30,11 +30,10 @@ __all__ = [ import logging -from mailman import i18n +from mailman.core.i18n import _ log = logging.getLogger('mailman.vette') -_ = i18n._ diff --git a/src/mailman/bin/arch.py b/src/mailman/bin/arch.py index abf057c3f..d4231fa26 100644 --- a/src/mailman/bin/arch.py +++ b/src/mailman/bin/arch.py @@ -25,15 +25,13 @@ import optparse from locknix.lockfile import Lock -from mailman import i18n from mailman.Archiver.HyperArch import HyperArchive from mailman.Defaults import hours from mailman.configuration import config +from mailman.core.i18n import _ from mailman.initialize import initialize from mailman.version import MAILMAN_VERSION -_ = i18n._ - def parseargs(): @@ -93,8 +91,6 @@ def main(): parser, opts, args = parseargs() initialize(opts.config) - i18n.set_language(config.DEFAULT_SERVER_LANGUAGE) - listname = args[0].lower().strip() if len(args) < 2: mbox = None @@ -108,7 +104,8 @@ def main(): if mbox is None: mbox = mlist.ArchiveFileName() - i18n.set_language(mlist.preferred_language) + # Set the default language to the list's preferred language. + _.default = mlist.preferred_language # Lay claim to the archive's lock file. This is so no other post can # mess up the archive while we're processing it. Try to pick a # suitably long period of time for the lock lifetime even though we diff --git a/src/mailman/bin/bumpdigests.py b/src/mailman/bin/bumpdigests.py index b1ed37a21..5cce668cb 100644 --- a/src/mailman/bin/bumpdigests.py +++ b/src/mailman/bin/bumpdigests.py @@ -21,7 +21,7 @@ import optparse from mailman import errors from mailman import MailList from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.version import MAILMAN_VERSION # Work around known problems with some RedHat cron daemons diff --git a/src/mailman/bin/check_perms.py b/src/mailman/bin/check_perms.py index 4b75aa9f6..9937eb637 100644 --- a/src/mailman/bin/check_perms.py +++ b/src/mailman/bin/check_perms.py @@ -25,7 +25,7 @@ import optparse from stat import * from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/checkdbs.py b/src/mailman/bin/checkdbs.py index fd116522e..c8ab7b83b 100644 --- a/src/mailman/bin/checkdbs.py +++ b/src/mailman/bin/checkdbs.py @@ -24,15 +24,14 @@ from zope.component import getUtility from mailman import MailList from mailman import Utils -from mailman import i18n from mailman.app.requests import handle_request from mailman.configuration import config +from mailman.core.i18n import _ from mailman.email.message import UserNotification +from mailman.initialize import initialize from mailman.interfaces.requests import IRequests from mailman.version import MAILMAN_VERSION -_ = i18n._ - # Work around known problems with some RedHat cron daemons import signal signal.signal(signal.SIGCHLD, signal.SIG_DFL) @@ -153,9 +152,7 @@ def midnight(date=None): def main(): opts, args, parser = parseargs() - config.load(opts.config) - - i18n.set_language(config.DEFAULT_SERVER_LANGUAGE) + initialize(opts.config) for name in config.list_manager.names: # The list must be locked in order to open the requests database @@ -175,13 +172,14 @@ def main(): # This is the only place we've changed the list's database mlist.Save() if count: - i18n.set_language(mlist.preferred_language) + # Set the default language the the list's preferred language. + _.default = mlist.preferred_language realname = mlist.real_name discarded = auto_discard(mlist) if discarded: count = count - discarded - text = _( - 'Notice: $discarded old request(s) automatically expired.\n\n') + text = _('Notice: $discarded old request(s) ' + 'automatically expired.\n\n') else: text = '' if count: @@ -189,11 +187,13 @@ def main(): 'checkdbs.txt', {'count' : count, 'host_name': mlist.host_name, - 'adminDB' : mlist.GetScriptURL('admindb', absolute=1), + 'adminDB' : mlist.GetScriptURL('admindb', + absolute=1), 'real_name': realname, }, mlist=mlist) text += '\n' + pending_requests(mlist) - subject = _('$count $realname moderator request(s) waiting') + subject = _('$count $realname moderator ' + 'request(s) waiting') else: subject = _('$realname moderator request check result') msg = UserNotification(mlist.GetOwnerEmail(), diff --git a/src/mailman/bin/cleanarch.py b/src/mailman/bin/cleanarch.py index 325fad91a..d861b3bfc 100644 --- a/src/mailman/bin/cleanarch.py +++ b/src/mailman/bin/cleanarch.py @@ -22,7 +22,7 @@ import sys import mailbox import optparse -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/config_list.py b/src/mailman/bin/config_list.py index 89a9892cd..e2ed46ed3 100644 --- a/src/mailman/bin/config_list.py +++ b/src/mailman/bin/config_list.py @@ -22,12 +22,12 @@ import optparse from mailman import MailList from mailman import errors -from mailman import i18n from mailman.Utils import wrap from mailman.configuration import config +from mailman.core.i18n import _ +from mailman.initialize import initialize from mailman.version import MAILMAN_VERSION -_ = i18n._ NL = '\n' nonasciipat = re.compile(r'[\x80-\xff]') @@ -101,7 +101,8 @@ def do_output(listname, outfile, parser): parser.error(_('No such list: $listname')) # Preamble for the config info. PEP 263 charset and capture time. charset = mlist.preferred_language.charset - i18n.set_language(mlist.preferred_language.code) + # Set the system's default language. + _.default = mlist.preferred_language.code if not charset: charset = 'us-ascii' when = time.ctime(time.time()) @@ -310,7 +311,7 @@ def do_input(listname, infile, checkonly, verbose, parser): def main(): parser, opts, args = parseargs() - config.load(opts.config) + initialize(opts.config) listname = args[0] # Sanity check diff --git a/src/mailman/bin/disabled.py b/src/mailman/bin/disabled.py index cc8eb2c69..1ff59ac5e 100644 --- a/src/mailman/bin/disabled.py +++ b/src/mailman/bin/disabled.py @@ -26,7 +26,7 @@ from mailman import Pending from mailman import loginit from mailman.Bouncer import _BounceInfo from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/dumpdb.py b/src/mailman/bin/dumpdb.py index 6657602e4..6c3ac5414 100644 --- a/src/mailman/bin/dumpdb.py +++ b/src/mailman/bin/dumpdb.py @@ -19,7 +19,7 @@ import pprint import cPickle from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.interact import interact from mailman.options import Options diff --git a/src/mailman/bin/export.py b/src/mailman/bin/export.py index d1992b4b4..ecd8ff3a9 100644 --- a/src/mailman/bin/export.py +++ b/src/mailman/bin/export.py @@ -29,7 +29,7 @@ from mailman import errors from mailman import MemberAdaptor from mailman.MailList import MailList from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.initialize import initialize from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/find_member.py b/src/mailman/bin/find_member.py index 0982724a0..2788c5e8f 100644 --- a/src/mailman/bin/find_member.py +++ b/src/mailman/bin/find_member.py @@ -22,7 +22,7 @@ import optparse from mailman import errors from mailman import MailList from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/gate_news.py b/src/mailman/bin/gate_news.py index eac30422d..2ca70a341 100644 --- a/src/mailman/bin/gate_news.py +++ b/src/mailman/bin/gate_news.py @@ -32,7 +32,7 @@ from mailman import Message from mailman import Utils from mailman import loginit from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.queue import Switchboard from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/genaliases.py b/src/mailman/bin/genaliases.py index 8fe37f543..d09dc2a22 100644 --- a/src/mailman/bin/genaliases.py +++ b/src/mailman/bin/genaliases.py @@ -24,7 +24,7 @@ __all__ = [ import sys from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.options import Options from mailman.utilities.modules import call_name diff --git a/src/mailman/bin/import.py b/src/mailman/bin/import.py index bc26e441b..6270faa15 100644 --- a/src/mailman/bin/import.py +++ b/src/mailman/bin/import.py @@ -30,7 +30,7 @@ from mailman import MemberAdaptor from mailman import Utils from mailman import passwords from mailman.MailList import MailList -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.initialize import initialize from mailman.interfaces.domain import BadDomainSpecificationError from mailman.version import MAILMAN_VERSION @@ -230,7 +230,7 @@ def create(all_listdata): 'pass_filename_extensions'): value = value.splitlines() if option == 'available_languages': - mlist.set_languages(*value) + mlist.os(*value) else: setattr(mlist, option, value) for member in list_roster: diff --git a/src/mailman/bin/list_members.py b/src/mailman/bin/list_members.py index e715bfdcb..a94eda4a5 100644 --- a/src/mailman/bin/list_members.py +++ b/src/mailman/bin/list_members.py @@ -21,8 +21,8 @@ from email.Utils import formataddr from zope.component import getUtility from mailman.core import errors +from mailman.core.i18n import _ from mailman.email.validate import is_valid -from mailman.i18n import _ from mailman.interfaces.listmanager import IListManager from mailman.interfaces.members import DeliveryStatus from mailman.interfaces.usermanager import IUserManager diff --git a/src/mailman/bin/list_owners.py b/src/mailman/bin/list_owners.py index b683dcae6..fef6926c1 100644 --- a/src/mailman/bin/list_owners.py +++ b/src/mailman/bin/list_owners.py @@ -21,7 +21,7 @@ import optparse from zope.component import getUtility from mailman.MailList import MailList -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.initialize import initialize from mailman.interfaces.listmanager import IListManager from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/mailman.py b/src/mailman/bin/mailman.py index c1b2931a4..d25ba2649 100644 --- a/src/mailman/bin/mailman.py +++ b/src/mailman/bin/mailman.py @@ -31,8 +31,8 @@ import argparse from zope.interface.verify import verifyObject from mailman.app.finder import find_components +from mailman.core.i18n import _ from mailman.core.initialize import initialize -from mailman.i18n import _ from mailman.interfaces.command import ICLISubCommand from mailman.version import MAILMAN_VERSION_FULL diff --git a/src/mailman/bin/master.py b/src/mailman/bin/master.py index 910bad3e6..be1e24b2a 100644 --- a/src/mailman/bin/master.py +++ b/src/mailman/bin/master.py @@ -39,8 +39,8 @@ from locknix import lockfile from munepy import Enum from mailman.config import config +from mailman.core.i18n import _ from mailman.core.logging import reopen -from mailman.i18n import _ from mailman.options import Options diff --git a/src/mailman/bin/mmsitepass.py b/src/mailman/bin/mmsitepass.py index 132803fc9..3d1531196 100644 --- a/src/mailman/bin/mmsitepass.py +++ b/src/mailman/bin/mmsitepass.py @@ -22,7 +22,7 @@ import optparse from mailman import Utils from mailman import passwords from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.initialize import initialize from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/nightly_gzip.py b/src/mailman/bin/nightly_gzip.py index f886e5801..5fb04b0f7 100644 --- a/src/mailman/bin/nightly_gzip.py +++ b/src/mailman/bin/nightly_gzip.py @@ -26,7 +26,7 @@ except ImportError: from mailman import MailList from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.initialize import initialize from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/qrunner.py b/src/mailman/bin/qrunner.py index 73e701f16..3ecdeb441 100644 --- a/src/mailman/bin/qrunner.py +++ b/src/mailman/bin/qrunner.py @@ -30,8 +30,8 @@ import signal import logging from mailman.config import config +from mailman.core.i18n import _ from mailman.core.logging import reopen -from mailman.i18n import _ from mailman.options import Options from mailman.utilities.modules import find_name diff --git a/src/mailman/bin/senddigests.py b/src/mailman/bin/senddigests.py index fb057d6b9..31d91c1df 100644 --- a/src/mailman/bin/senddigests.py +++ b/src/mailman/bin/senddigests.py @@ -20,7 +20,7 @@ import sys import optparse from mailman import MailList -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.initialize import initialize from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/set_members.py b/src/mailman/bin/set_members.py index 001e5e1d3..c4a8060b4 100644 --- a/src/mailman/bin/set_members.py +++ b/src/mailman/bin/set_members.py @@ -22,20 +22,18 @@ from zope.component import getUtility from mailman import Message from mailman import Utils -from mailman import i18n from mailman import passwords from mailman.app.membership import add_member from mailman.app.notifications import ( send_admin_subscription_notice, send_welcome_message) from mailman.configuration import config +from mailman.core.i18n import _ from mailman.initialize import initialize from mailman.interfaces.members import DeliveryMode from mailman.interfaces.usermanager import IUserManager from mailman.version import MAILMAN_VERSION -_ = i18n._ - DELIVERY_MODES = { 'regular': DeliveryMode.regular, 'plain': DeliveryMode.plaintext_digests, @@ -155,7 +153,7 @@ def main(): delete_members = current_members - future_members change_members = current_members & future_members - with i18n.using_language(mlist.preferred_language): + with _.using(mlist.preferred_language): # Start by removing all the delete members. for address in delete_members: print _('deleting address: $address') diff --git a/src/mailman/bin/show_config.py b/src/mailman/bin/show_config.py index 8d26c5c97..61776ff68 100644 --- a/src/mailman/bin/show_config.py +++ b/src/mailman/bin/show_config.py @@ -21,7 +21,7 @@ import pprint import optparse from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/bin/show_qfiles.py b/src/mailman/bin/show_qfiles.py index e4b64e0cd..81d576e3d 100644 --- a/src/mailman/bin/show_qfiles.py +++ b/src/mailman/bin/show_qfiles.py @@ -21,7 +21,7 @@ import sys from cPickle import load from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.options import Options diff --git a/src/mailman/bin/unshunt.py b/src/mailman/bin/unshunt.py index fc889377c..2a4558fd4 100644 --- a/src/mailman/bin/unshunt.py +++ b/src/mailman/bin/unshunt.py @@ -24,7 +24,7 @@ __all__ = [ import sys from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.options import Options diff --git a/src/mailman/bin/update.py b/src/mailman/bin/update.py index 34ea6cda3..bb2cc294a 100644 --- a/src/mailman/bin/update.py +++ b/src/mailman/bin/update.py @@ -37,7 +37,7 @@ from mailman.MemberAdaptor import BYBOUNCE, ENABLED from mailman.OldStyleMemberships import OldStyleMemberships from mailman.Queue.Switchboard import Switchboard from mailman.configuration import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.initialize import initialize from mailman.utilities.filesystem import makedirs diff --git a/src/mailman/bin/withlist.py b/src/mailman/bin/withlist.py index 2b236eaec..3c89ffc40 100644 --- a/src/mailman/bin/withlist.py +++ b/src/mailman/bin/withlist.py @@ -23,8 +23,8 @@ from zope.component import getUtility from mailman import interact from mailman.config import config +from mailman.core.i18n import _ from mailman.core.initialize import initialize -from mailman.i18n import _ from mailman.interfaces.listmanager import IListManager from mailman.version import MAILMAN_VERSION diff --git a/src/mailman/chains/accept.py b/src/mailman/chains/accept.py index bd47f42c8..b9bba07f5 100644 --- a/src/mailman/chains/accept.py +++ b/src/mailman/chains/accept.py @@ -28,7 +28,7 @@ import logging from mailman.chains.base import TerminalChainBase from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ log = logging.getLogger('mailman.vette') diff --git a/src/mailman/chains/builtin.py b/src/mailman/chains/builtin.py index 05912a2f2..02ca6e0d8 100644 --- a/src/mailman/chains/builtin.py +++ b/src/mailman/chains/builtin.py @@ -31,7 +31,7 @@ from zope.interface import implements from mailman.chains.base import Link from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.interfaces.chain import IChain, LinkAction diff --git a/src/mailman/chains/discard.py b/src/mailman/chains/discard.py index 1899e0340..d6a381a9c 100644 --- a/src/mailman/chains/discard.py +++ b/src/mailman/chains/discard.py @@ -28,7 +28,7 @@ __all__ = [ import logging from mailman.chains.base import TerminalChainBase -from mailman.i18n import _ +from mailman.core.i18n import _ log = logging.getLogger('mailman.vette') diff --git a/src/mailman/chains/headers.py b/src/mailman/chains/headers.py index 2f85d78d0..31e982294 100644 --- a/src/mailman/chains/headers.py +++ b/src/mailman/chains/headers.py @@ -33,7 +33,7 @@ from zope.interface import implements from mailman.chains.base import Chain, Link from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.interfaces.chain import IChainIterator, LinkAction from mailman.interfaces.rules import IRule diff --git a/src/mailman/chains/hold.py b/src/mailman/chains/hold.py index b4b510d3b..32e2ce0b3 100644 --- a/src/mailman/chains/hold.py +++ b/src/mailman/chains/hold.py @@ -33,12 +33,12 @@ from email.utils import formatdate, make_msgid from zope.component import getUtility from zope.interface import implements -from mailman import i18n from mailman.Utils import maketext, oneline, wrap from mailman.app.moderator import hold_message from mailman.app.replybot import can_acknowledge from mailman.chains.base import TerminalChainBase from mailman.config import config +from mailman.core.i18n import _ from mailman.email.message import UserNotification from mailman.interfaces.autorespond import IAutoResponseSet, Response from mailman.interfaces.pending import IPendable, IPendings @@ -47,7 +47,6 @@ from mailman.interfaces.usermanager import IUserManager log = logging.getLogger('mailman.vette') SEMISPACE = '; ' -_ = i18n._ @@ -104,7 +103,7 @@ def autorespond_to_sender(mlist, sender, lang=None): 'owneremail': mlist.owner_address, }, lang=lang) - with i18n.using_language(lang.code): + with _.using(lang.code): msg = Message.UserNotification( sender, mlist.owner_address, _('Last autoresponse notification for today'), @@ -199,7 +198,7 @@ class HoldChain(TerminalChainBase): if mlist.admin_immed_notify: # Now let's temporarily set the language context to that which the # administrators are expecting. - with i18n.using_language(mlist.preferred_language.code): + with _.using(mlist.preferred_language.code): language = mlist.preferred_language charset = language.charset # We need to regenerate or re-translate a few values in the diff --git a/src/mailman/chains/reject.py b/src/mailman/chains/reject.py index 3faf563da..6467cf949 100644 --- a/src/mailman/chains/reject.py +++ b/src/mailman/chains/reject.py @@ -29,7 +29,7 @@ import logging from mailman.app.bounces import bounce_message from mailman.chains.base import TerminalChainBase -from mailman.i18n import _ +from mailman.core.i18n import _ log = logging.getLogger('mailman.vette') diff --git a/src/mailman/commands/cli_control.py b/src/mailman/commands/cli_control.py index cab3d0fd9..3b4bae9b9 100644 --- a/src/mailman/commands/cli_control.py +++ b/src/mailman/commands/cli_control.py @@ -36,7 +36,7 @@ import logging from zope.interface import implements from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.interfaces.command import ICLISubCommand diff --git a/src/mailman/commands/cli_info.py b/src/mailman/commands/cli_info.py index b5a0e8e5d..8d08e93b9 100644 --- a/src/mailman/commands/cli_info.py +++ b/src/mailman/commands/cli_info.py @@ -30,7 +30,7 @@ import sys from zope.interface import implements from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.interfaces.command import ICLISubCommand from mailman.version import MAILMAN_VERSION_FULL diff --git a/src/mailman/commands/cli_inject.py b/src/mailman/commands/cli_inject.py index d1b1a9795..025dcb036 100644 --- a/src/mailman/commands/cli_inject.py +++ b/src/mailman/commands/cli_inject.py @@ -31,7 +31,7 @@ from zope.component import getUtility from zope.interface import implements from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.inject import inject_text from mailman.interfaces.command import ICLISubCommand from mailman.interfaces.listmanager import IListManager diff --git a/src/mailman/commands/cli_lists.py b/src/mailman/commands/cli_lists.py index 212dba8af..d5686eca5 100644 --- a/src/mailman/commands/cli_lists.py +++ b/src/mailman/commands/cli_lists.py @@ -35,8 +35,8 @@ from mailman.app.lifecycle import create_list, remove_list from mailman.config import config from mailman.core.constants import system_preferences from mailman.core.errors import InvalidEmailAddress +from mailman.core.i18n import _ from mailman.email.message import UserNotification -from mailman.i18n import _, using_language from mailman.interfaces.command import ICLISubCommand from mailman.interfaces.domain import ( BadDomainSpecificationError, IDomainManager) @@ -210,7 +210,7 @@ class Create: # Set the I18N language to the list's preferred language so the # header will match the template language. Stashing and restoring # the old translation context is just (healthy? :) paranoia. - with using_language(mlist.preferred_language.code): + with _.using(mlist.preferred_language.code): msg = UserNotification( args.owners, mlist.no_reply_address, _('Your new mailing list: $fqdn_listname'), diff --git a/src/mailman/commands/cli_members.py b/src/mailman/commands/cli_members.py index d818d2853..b26216785 100644 --- a/src/mailman/commands/cli_members.py +++ b/src/mailman/commands/cli_members.py @@ -34,7 +34,7 @@ from zope.interface import implements from mailman.app.membership import add_member from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.interfaces.command import ICLISubCommand from mailman.interfaces.listmanager import IListManager from mailman.interfaces.member import DeliveryMode diff --git a/src/mailman/commands/eml_echo.py b/src/mailman/commands/eml_echo.py index 30590acf8..77c944cda 100644 --- a/src/mailman/commands/eml_echo.py +++ b/src/mailman/commands/eml_echo.py @@ -25,7 +25,7 @@ __all__ = [ from zope.interface import implements -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.interfaces.command import ContinueProcessing, IEmailCommand diff --git a/src/mailman/commands/eml_end.py b/src/mailman/commands/eml_end.py index a9298bc92..e47712030 100644 --- a/src/mailman/commands/eml_end.py +++ b/src/mailman/commands/eml_end.py @@ -26,7 +26,7 @@ __all__ = [ from zope.interface import implements -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.interfaces.command import ContinueProcessing, IEmailCommand diff --git a/src/mailman/commands/eml_join.py b/src/mailman/commands/eml_join.py index d1f9dd816..f29684b93 100644 --- a/src/mailman/commands/eml_join.py +++ b/src/mailman/commands/eml_join.py @@ -28,7 +28,7 @@ from email.utils import formataddr, parseaddr from zope.interface import implements from mailman.config import config -from mailman.i18n import _ +from mailman.core.i18n import _ from mailman.interfaces.command import ContinueProcessing, IEmailCommand from mailman.interfaces.domain import IDomainManager from mailman.interfaces.member import DeliveryMode diff --git a/src/mailman/config/config.py b/src/mailman/config/config.py index 736417b24..c64eb3ef5 100644 --- a/src/mailman/config/config.py +++ b/src/mailman/config/config.py @@ -152,6 +152,9 @@ class Configuration: assert self._config.mailman.default_language in self.languages self.ensure_directories_exist() self.style_manager.populate() + # Set the default system language. + from mailman.core.i18n import _ + _.default = self.mailman.default_language @property def logger_configs(self): diff --git a/src/mailman/core/i18n.py b/src/mailman/core/i18n.py new file mode 100644 index 000000000..8083fd987 --- /dev/null +++ b/src/mailman/core/i18n.py @@ -0,0 +1,111 @@ +# Copyright (C) 2009 by the Free Software Foundation, Inc. +# +# This file is part of GNU Mailman. +# +# GNU Mailman is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# GNU Mailman 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 +# GNU Mailman. If not, see