X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FI18N.pm;h=affff981bdb59d46a1b6e56bc048ea01ac1adeff;hb=d4d0590bef31071e8809ec046717444b95b3f30a;hp=c013c219e65d30100d6f523f734a31a4dd34cfe3;hpb=945721f48f74d5cfffef7c7cf3a3d6bc2521f5dd;p=freeside.git diff --git a/rt/lib/RT/I18N.pm b/rt/lib/RT/I18N.pm index c013c219e..affff981b 100644 --- a/rt/lib/RT/I18N.pm +++ b/rt/lib/RT/I18N.pm @@ -1,8 +1,14 @@ -# BEGIN LICENSE BLOCK +# BEGIN BPS TAGGED BLOCK {{{ # -# Copyright (c) 1996-2003 Jesse Vincent +# COPYRIGHT: +# +# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC +# # -# (Except where explictly superceded by other copyright notices) +# (Except where explicitly superseded by other copyright notices) +# +# +# LICENSE: # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -14,13 +20,30 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# Unless otherwise specified, all modifications, corrections or -# extensions to this work which alter its source code become the -# property of Best Practical Solutions, LLC when submitted for -# inclusion in the work. +# 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., 675 Mass Ave, Cambridge, MA 02139, USA. +# # +# CONTRIBUTION SUBMISSION POLICY: # -# END LICENSE BLOCK +# (The following paragraph is not intended to limit the rights granted +# to you to modify and distribute this software under the terms of +# the GNU General Public License and is only of importance to you if +# you choose to contribute your changes and enhancements to the +# community by submitting them to Best Practical Solutions, LLC.) +# +# By intentionally submitting any modifications, corrections or +# derivatives to this work, or any other work intended for use with +# Request Tracker, to Best Practical Solutions, LLC, you confirm that +# you are the copyright holder for those contributions and you grant +# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +# royalty-free, perpetual, license to use, copy, create derivative +# works based on those contributions, and sublicense and distribute +# those contributions and any derivatives thereof. +# +# END BPS TAGGED BLOCK }}} + =head1 NAME RT::I18N - a base class for localization of RT @@ -76,9 +99,11 @@ ok(RT::I18N->Init); =cut sub Init { + require File::Glob; + # Load language-specific functions - foreach my $language ( glob(substr(__FILE__, 0, -3) . "/*.pm")) { - if ($language =~ /^([-\w.\/\\~:]+)$/) { + foreach my $language ( File::Glob::bsd_glob(substr(__FILE__, 0, -3) . "/*.pm")) { + if ($language =~ /^([-\w\s.\/\\~:]+)$/) { require $1; } else { @@ -95,6 +120,7 @@ sub Init { $_ => [ Gettext => (substr(__FILE__, 0, -3) . "/$_.po"), Gettext => "$RT::LocalLexiconPath/*/$_.po", + Gettext => "$RT::LocalLexiconPath/$_.po", ], } @lang }); @@ -164,10 +190,14 @@ sub SetMIMEEntityToEncoding { my $charset = _FindOrGuessCharset($entity) or return; # one and only normalization - $charset = 'utf-8' if $charset eq 'utf8'; - $enc = 'utf-8' if $enc eq 'utf8'; + $charset = 'utf-8' if $charset =~ /^utf-?8$/i; + $enc = 'utf-8' if $enc =~ /^utf-?8$/i; - SetMIMEHeadToEncoding($entity->head, $charset => $enc, $preserve_words); + SetMIMEHeadToEncoding( + $entity->head, + _FindOrGuessCharset($entity, 1) => $enc, + $preserve_words + ); my $head = $entity->head; @@ -292,6 +322,20 @@ sub DecodeMIMEWordsToEncoding { } } + # XXX TODO: RT doesn't currently do the right thing with mime-encoded headers + # We _should_ be preserving them encoded until after parsing is completed and + # THEN undo the mime-encoding. + # + # This routine should be translating the existing mimeencoding to utf8 but leaving + # things encoded. + # + # It's legal for headers to contain mime-encoded commas and semicolons which + # should not be treated as address separators. (Encoding == quoting here) + # + # until this is fixed, we must escape any string containing a comma or semicolon + # this is only a bandaid + + $enc_str = qq{"$enc_str"} if ($enc_str =~ /[,;]/); $str .= $prefix . $enc_str . $trailing; } @@ -302,24 +346,26 @@ sub DecodeMIMEWordsToEncoding { # {{{ _FindOrGuessCharset -=head2 _FindOrGuessCharset MIME::Entity +=head2 _FindOrGuessCharset MIME::Entity, $head_only -When handed a MIME::Entity will first attempt to read what charset the message is encoded in. Failing that, -will use Encode::Guess to try to figure it out +When handed a MIME::Entity will first attempt to read what charset the message is encoded in. Failing that, will use Encode::Guess to try to figure it out + +If $head_only is true, only guesses charset for head parts. This is because header's encoding (e.g. filename="...") may be different from that of body's. =cut sub _FindOrGuessCharset { my $entity = shift; + my $head_only = shift; my $head = $entity->head; if ($head->mime_attr("content-type.charset")) { return $head->mime_attr("content-type.charset"); } - if ( $head->mime_type =~ m{^text/}) { + if ( !$head_only and $head->mime_type =~ m{^text/}) { my $body = $entity->bodyhandle or return; - return _GuessCharset( $head->as_string . $body->as_string ); + return _GuessCharset( $body->as_string ); } else { # potentially binary data -- don't guess the body @@ -329,7 +375,6 @@ sub _FindOrGuessCharset { # }}} - # {{{ _GuessCharset =head2 _GuessCharset STRING @@ -395,6 +440,7 @@ sub SetMIMEHeadToEncoding { return if $charset eq $enc and $preserve_words; foreach my $tag ( $head->tags ) { + next unless $tag; # seen in wild: headers with no name my @values = $head->get_all($tag); $head->delete($tag); foreach my $value (@values) {