=== modified file 'Mailman/Handlers/CookHeaders.py' --- Mailman/Handlers/CookHeaders.py 2016-03-02 09:57:16 +0000 +++ Mailman/Handlers/CookHeaders.py 2016-11-20 06:09:11 +0000 @@ -154,11 +154,26 @@ 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) + sender = msgdata.get('original_sender', msg.get_sender()) + lang = msgdata.get('lang', mlist.getMemberLanguage(sender)) + cset = Utils.GetCharSet(lang) lrn = mlist.real_name + 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) + # it may be mcset != Utils.GetCharset(mlist.preferred_language) + # so we cannot use uheader() here.... + 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: @@ -401,7 +416,10 @@ # subject: [subject prefix] if subject.strip() == '': subject = _('(no subject)') - cset = Utils.GetCharSet(mlist.preferred_language) + # subject is now sender's preferred language, not list's. + sender = msgdata.get('original_sender', msg.get_sender()) + lang = msgdata.get('lang', mlist.getMemberLanguage(sender)) + cset = Utils.GetCharSet(lang) subject = unicode(subject, cset) # and substitute %d in prefix with post_id try: