=== modified file 'Mailman/Handlers/CookHeaders.py' --- Mailman/Handlers/CookHeaders.py 2016-03-02 09:57:16 +0000 +++ Mailman/Handlers/CookHeaders.py 2016-11-19 16:33:40 +0000 @@ -31,7 +31,7 @@ from Mailman import mm_cfg from Mailman import Utils -from Mailman.i18n import _ +from Mailman.i18n import get_translation, set_translation, set_language, _ from Mailman.Logging.Syslog import syslog CONTINUATION = ',\n ' @@ -91,6 +91,7 @@ def process(mlist, msg, msgdata): + cset = Utils.GetCharSet(mlist.preferred_language) # Set the "X-Ack: no" header if noack flag is set. if msgdata.get('noack'): change_header('X-Ack', 'no', mlist, msg, msgdata) @@ -154,11 +155,28 @@ realname = email # Remove domain from realname if it looks like an email address realname = re.sub(r'@([^ .]+\.)+[^ .]+$', '---', realname) - # RFC 2047 encode realname if necessary. - realname = str(uheader(mlist, realname)) + realname, mcset = ch_oneline(realname) lrn = mlist.real_name + # Now let's temporarily set the language context to that which the + # list admin is expecting. + otranslation = get_translation() + set_language(mlist.preferred_language) + try: + if mcset != cset: + realname = realname.decode(mcset).encode(cset) + mcset = cset + lrn = mlist.real_name + repl_realname = _('%(realname)s via %(lrn)s') + except UnicodeError: + syslog('error', 'list: %s: fail to convert "%s" as %s', + mlist.internal_name(), realname, cset) + repl_realname = '%s via %s' % (realname, lrn) + finally: + set_translation(otranslation) + # RFC 2047 encode repl_realname if necessary. + repl_realname = str(Header(repl_realname, mcset, None, None, ' ')) change_header('From', - formataddr((_('%(realname)s via %(lrn)s'), + formataddr((repl_realname, mlist.GetListEmail())), mlist, msg, msgdata) else: @@ -296,7 +314,6 @@ return # This will act like an email address for purposes of formataddr() listid = '%s.%s' % (mlist.internal_name(), 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 # 2047 encoded. @@ -400,7 +417,10 @@ # At this point, subject may become null if someone post mail with # subject: [subject prefix] if subject.strip() == '': + otranslation = get_translation() + set_language(mlist.preferred_language) subject = _('(no subject)') + set_translation(otranslation) cset = Utils.GetCharSet(mlist.preferred_language) subject = unicode(subject, cset) # and substitute %d in prefix with post_id