X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FI18N.pm;h=448f4a28ef8d712b6f0a904c1c6765ba5117b1be;hb=9c68254528b6f2c7d8c1921b452fa56064783782;hp=af5ece01293c3ca99860841ee169fd0b59a02016;hpb=d39d52aac8f38ea9115628039f0df5aa3ac826de;p=freeside.git diff --git a/rt/lib/RT/I18N.pm b/rt/lib/RT/I18N.pm index af5ece012..448f4a28e 100644 --- a/rt/lib/RT/I18N.pm +++ b/rt/lib/RT/I18N.pm @@ -1,8 +1,8 @@ -# {{{ BEGIN BPS TAGGED BLOCK +# BEGIN BPS TAGGED BLOCK {{{ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) @@ -42,7 +42,8 @@ # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. # -# }}} END BPS TAGGED BLOCK +# END BPS TAGGED BLOCK }}} + =head1 NAME RT::I18N - a base class for localization of RT @@ -98,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 { @@ -117,6 +120,7 @@ sub Init { $_ => [ Gettext => (substr(__FILE__, 0, -3) . "/$_.po"), Gettext => "$RT::LocalLexiconPath/*/$_.po", + Gettext => "$RT::LocalLexiconPath/$_.po", ], } @lang }); @@ -219,7 +223,7 @@ sub SetMIMEEntityToEncoding { # {{{ Convert the body eval { - $RT::Logger->debug("Converting '$charset' to '$enc' for ". $head->mime_type . " - ". $head->get('subject')); + $RT::Logger->debug("Converting '$charset' to '$enc' for ". $head->mime_type . " - ". ($head->get('subject') || 'Subjectless message')); # NOTE:: see the comments at the end of the sub. Encode::_utf8_off( $lines[$_] ) foreach ( 0 .. $#lines ); @@ -285,11 +289,13 @@ sub DecodeMIMEWordsToEncoding { my $str = shift; my $enc = shift; - - @_ = $str =~ m/([^=]*)=\?([^?]+)\?([QqBb])\?([^?]+)\?=([^=]*)/g; - + @_ = $str =~ m/(.*?)=\?([^?]+)\?([QqBb])\?([^?]+)\?=([^=]*)/gc; return ($str) unless (@_); + # add everything that hasn't matched to the end of the latest + # string in array this happen when we have 'key="=?encoded?="; key="plain"' + $_[-1] .= substr($str, pos $str); + $str = ""; while (@_) { my ($prefix, $charset, $encoding, $enc_str, $trailing) = @@ -318,6 +324,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; } @@ -357,7 +377,6 @@ sub _FindOrGuessCharset { # }}} - # {{{ _GuessCharset =head2 _GuessCharset STRING @@ -423,6 +442,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) {