root/trunk/lib/MT/I18N/default.pm @ 2967

Revision 2967, 12.6 kB (checked in by fumiakiy, 15 months ago)

Removed unnecessary build-time variables.

Added PORTAL_URL as a build-time variable so MTOS and MT will have different value.

  • Property svn:keywords set to Id Revision
Line 
1# Movable Type (r) Open Source (C) 2001-2008 Six Apart, Ltd.
2# This program is distributed under the terms of the
3# GNU General Public License, version 2.
4#
5# $Id$
6
7package MT::I18N::default;
8
9use strict;
10use base qw( MT::ErrorHandler );
11our $PKG;
12
13sub DEFAULT_LENGTH_ENTRY_EXCERPT ()                    { 40 }
14sub LENGTH_ENTRY_TITLE_FROM_TEXT ()                    { 5 }
15sub LENGTH_ENTRY_PING_EXCERPT ()                       { 255 }
16sub LENGTH_ENTRY_PING_TITLE_FROM_TEXT ()               { 5 }
17sub DISPLAY_LENGTH_MENU_TITLE ()                       { 22 }
18sub DISPLAY_LENGTH_EDIT_COMMENT_TITLE ()               { 25 }
19sub DISPLAY_LENGTH_EDIT_COMMENT_AUTHOR ()              { 25 }
20sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_SHORT ()          { 45 }
21sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_LONG ()           { 90 }
22sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_BREAK_UP_SHORT () { 30 }
23sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_BREAK_UP_LONG ()  { 80 }
24sub DISPLAY_LENGTH_EDIT_PING_TITLE_FROM_EXCERPT ()     { 12 }
25sub DISPLAY_LENGTH_EDIT_PING_BREAK_UP ()               { 30 }
26sub DISPLAY_LENGTH_EDIT_ENTRY_TITLE ()                 { 25 }
27sub DISPLAY_LENGTH_EDIT_ENTRY_TEXT_FROM_EXCERPT ()     { 50 }
28sub DISPLAY_LENGTH_EDIT_ENTRY_TEXT_BREAK_UP ()         { 30 }
29
30sub PORTAL_URL()            { '' } # default PORTAL_URL is determined in building packages
31sub SUPPORT_URL()           { 'http://www.sixapart.com/movabletype/support/' }
32sub NEWS_URL()              { 'http://www.sixapart.com/movabletype/news/' }
33sub NEWSBOX_URL()           { 'http://www.sixapart.com/movabletype/news/mt4_news_widget.html' }
34sub LEARNINGNEWS_URL()      { 'http://learning.movabletype.org/newsbox.html' }
35sub CATEGORY_NAME_NODASH()  { 0 }
36sub DEFAULT_TIMEZONE()      { 0 }
37sub MAIL_ENCODING()         { 'ISO-8859-1' }
38sub LOG_EXPORT_ENCODING()   { '' }
39sub EXPORT_ENCODING()       { '' }
40sub PUBLISH_CHARSET()       { 'UTF-8' }
41
42my $ENCODING_NAMES = [
43    { 'name' => 'guess', 'display_name' => 'AUTO DETECT' },
44    { 'name' => 'utf8', 'display_name' => 'UTF-8' },
45    { 'name' => 'ascii', 'display_name' => 'ISO-8859-1' },
46    { 'name' => 'WinLatin1', 'display_name' => 'Windows Latin1' },
47];
48sub ENCODING_NAMES () {
49    return $ENCODING_NAMES;
50}
51
52my @ENCODINGS_ENCODE =
53    qw( cp1252 utf-8 euc-jp shiftjis 7bit-jis iso-2022-jp
54        iso-2022-jp-1 jis0201-raw jis0208-raw
55        jis0212-raw cp932 Macjapanese iso-8859-1 );
56
57sub decode {
58    my $class = shift;
59    my $meth = 'decode_' . ($PKG || $class->_load_module);
60    $class->$meth(@_);
61}
62sub guess_encoding {
63    my $class = shift;
64    my $meth = 'guess_encoding_' . ($PKG || $class->_load_module);
65    $class->$meth(@_);
66}
67sub encode_text {
68    my $class = shift;
69    my $meth = "encode_text_" . ($PKG || $class->_load_module);
70    $class->$meth(@_);
71}
72sub substr_text {
73    my $class = shift;
74    my $meth = "substr_text_" . ($PKG || $class->_load_module);
75    $class->$meth(@_);
76}
77sub wrap_text {
78    my $class = shift;
79    my $meth = "wrap_text_" . ($PKG || $class->_load_module);
80    $class->$meth(@_);
81}
82sub length_text {
83    my $class = shift;
84    my $meth = "length_text_" . ($PKG || $class->_load_module);
85    $class->$meth(@_);
86}
87sub first_n {
88    my $class = shift;
89    my $meth = "first_n_" . ($PKG || $class->_load_module);
90    $class->$meth(@_);
91}
92sub first_n_text {
93    my $class = shift;
94    my $meth = "first_n_" . ($PKG || $class->_load_module);
95    $class->$meth(@_);
96}
97sub break_up_text {
98    my $class = shift;
99    my $meth = "break_up_text_" . ($PKG || $class->_load_module);
100    $class->$meth(@_);
101}
102sub convert_high_ascii {
103    my $class = shift;
104    my $meth = "convert_high_ascii_" . ($PKG || $class->_load_module);
105    $class->$meth(@_);
106}
107sub decode_utf8 {
108    my $class = shift;
109    my $meth = "decode_utf8_" . ($PKG || $class->_load_module);
110    $class->$meth(@_);
111}
112
113sub utf8_off {
114    my $class = shift;
115    my $meth = "utf8_off_" . ($PKG || $class->_load_module);
116    $class->$meth(@_);
117}
118
119sub lowercase {
120    my $class = shift;
121    my $meth = 'lowercase_' . ($PKG || $class->_load_module);
122    $class->$meth(@_);
123}
124
125sub uppercase {
126    my $class = shift;
127    my $meth = 'uppercase_' . ($PKG || $class->_load_module);
128    $class->$meth(@_);
129}
130
131# Dumb default methods (charset ignorant)
132
133sub decode_perl {
134    my $class = shift;
135    my ($enc, $text) = @_;
136    $text;
137}
138
139sub encode_text_perl {
140    my $class = shift;
141    my ($str) = @_;
142    $str;
143}
144
145sub substr_text_perl {
146    my $class = shift;
147    my ($str, $start, $end) = @_;
148    substr($str, $start, $end);
149}
150
151sub lowercase_perl {
152    my $class = shift;
153    my ($str) = @_;
154    return lc $str;
155}
156
157sub uppercase_perl {
158    my $class = shift;
159    my ($str) = @_;
160    return uc $str;
161}
162
163sub length_text_perl {
164    my $class = shift;
165    my ($str) = @_;
166    length($str);
167}
168
169sub guess_encoding_perl {
170    MT->config('PublishCharset');
171}
172
173sub wrap_text_perl {
174    my $class = shift;
175    my ($text, $col, $tab_init, $tab_sub) = @_;
176    $tab_init = '' unless defined $tab_init;
177    $tab_sub = '' unless defined $tab_sub;
178    require Text::Wrap;
179    $Text::Wrap::columns = $col;
180    $text = Text::Wrap::wrap($tab_init, $tab_sub, $text);
181    return $text;
182}
183
184sub first_n_perl {
185    my $class = shift;
186    my ($text, $length) = @_;
187    require MT::Util;
188    $text = MT::Util::first_n_words($text, $length);
189    return $text;
190}
191
192sub break_up_text_perl {
193    my $class = shift;
194    my ($text, $length) = @_;
195    return '' unless defined $text;
196    $text =~ s/(\S{$length})/$1 /g;
197    return $text;
198}
199
200# Encode package methods
201
202sub convert_high_ascii_encode {
203    &convert_high_ascii_perl;
204}
205
206sub wrap_text_encode {
207    my $class = shift;
208    my ($text, $col, $tab_init, $tab_sub) = @_;
209    $tab_init = '' unless defined $tab_init;
210    $tab_sub = '' unless defined $tab_sub;
211    require Text::Wrap;
212    $Text::Wrap::columns = $col;
213    $text = Text::Wrap::wrap($tab_init, $tab_sub, $text);
214    return $text;
215}
216
217sub first_n_encode {
218    # passthru first_n_words
219    my $class = shift;
220    my ($text, $length) = @_;
221    require MT::Util;
222    $text = MT::Util::first_n_words($text, $length);
223    return $text;
224}
225
226sub break_up_text_encode {
227    my $class = shift;
228    my ($text, $length) = @_;
229    return '' unless defined $text;
230    $text =~ s/(\S{$length})/$1 /g;
231    return $text;
232}
233
234my %HighASCII = (
235    "\xc0" => 'A',    # A`
236    "\xe0" => 'a',    # a`
237    "\xc1" => 'A',    # A'
238    "\xe1" => 'a',    # a'
239    "\xc2" => 'A',    # A^
240    "\xe2" => 'a',    # a^
241    "\xc4" => 'A',    # A:
242    "\xe4" => 'a',    # a:
243    "\xc5" => 'A',    # Aring
244    "\xe5" => 'a',    # aring
245    "\xc6" => 'AE',   # AE
246    "\xe6" => 'ae',   # ae
247    "\xc3" => 'A',    # A~
248    "\xe3" => 'a',    # a~
249    "\xc8" => 'E',    # E`
250    "\xe8" => 'e',    # e`
251    "\xc9" => 'E',    # E'
252    "\xe9" => 'e',    # e'
253    "\xca" => 'E',    # E^
254    "\xea" => 'e',    # e^
255    "\xcb" => 'E',    # E:
256    "\xeb" => 'e',    # e:
257    "\xcc" => 'I',    # I`
258    "\xec" => 'i',    # i`
259    "\xcd" => 'I',    # I'
260    "\xed" => 'i',    # i'
261    "\xce" => 'I',    # I^
262    "\xee" => 'i',    # i^
263    "\xcf" => 'I',    # I:
264    "\xef" => 'i',    # i:
265    "\xd2" => 'O',    # O`
266    "\xf2" => 'o',    # o`
267    "\xd3" => 'O',    # O'
268    "\xf3" => 'o',    # o'
269    "\xd4" => 'O',    # O^
270    "\xf4" => 'o',    # o^
271    "\xd6" => 'O',    # O:
272    "\xf6" => 'o',    # o:
273    "\xd5" => 'O',    # O~
274    "\xf5" => 'o',    # o~
275    "\xd8" => 'O',    # O/
276    "\xf8" => 'o',    # o/
277    "\xd9" => 'U',    # U`
278    "\xf9" => 'u',    # u`
279    "\xda" => 'U',    # U'
280    "\xfa" => 'u',    # u'
281    "\xdb" => 'U',    # U^
282    "\xfb" => 'u',    # u^
283    "\xdc" => 'U',    # U:
284    "\xfc" => 'u',    # u:
285    "\xc7" => 'C',    # ,C
286    "\xe7" => 'c',    # ,c
287    "\xd1" => 'N',    # N~
288    "\xf1" => 'n',    # n~
289    "\xdd" => 'Y',    # Yacute
290    "\xfd" => 'y',    # yacute
291    "\xdf" => 'ss',   # szlig
292    "\xff" => 'y'     # yuml
293);
294my $HighASCIIRE = join '|', keys %HighASCII;
295
296sub convert_high_ascii_perl {
297    my $class = shift;
298    my ($s) = @_;
299    $s =~ s/($HighASCIIRE)/$HighASCII{$1}/g;
300    $s;
301}
302
303sub _set_encode {
304    my $class = shift;
305    my ($text, $enc) = @_;
306
307    if (defined($enc)) {
308        unless ($enc) {
309            my $meth = 'guess_encoding_' . lc $PKG;
310            $enc = $class->$meth($text);
311        }
312    } else {
313        $enc = MT->config('PublishCharset') || 'utf-8';
314    }
315    return $enc;
316}
317
318sub guess_encoding_encode {
319    my $class = shift;
320    my ($text) = @_;
321    require Encode::Guess;
322    Encode::Guess->set_suspects(MT->config('PublishCharset'), @ENCODINGS_ENCODE);
323    my $dec = Encode::Guess->guess($text);
324    if (ref($dec)) {
325        return $dec->name;
326    } else {
327        # if Encode was failed to guess, re-try for each encodings.
328        for my $encode_name ( MT->config('PublishCharset'), @ENCODINGS_ENCODE ) {
329            Encode::Guess->set_suspects($encode_name);
330            $dec = Encode::Guess->guess($text);
331            if (ref($dec)) {
332                return $dec->name;
333            }
334        }
335        return MT->config('PublishCharset') || 'utf-8';
336    }
337}
338
339sub substr_text_encode {
340    my $class = shift;
341    my ($text, $startpos, $length, $enc) = @_;
342    $enc = $class->_set_encode($text, $enc);
343    $text = $class->_conv_to_utf8($text, $enc) if $enc ne 'utf-8';
344    Encode::_utf8_on($text);
345    $text = substr($text, $startpos, $length);
346    Encode::_utf8_off($text);
347    $text = $class->_conv_from_utf8($text, $enc) if $enc ne 'utf-8';
348    $text;
349}
350
351sub length_text_encode {
352    my $class = shift;
353    my ($text, $enc) = @_;
354    $enc = $class->_set_encode($text, $enc);
355    my $enc_text = $class->_conv_to_utf8($text, $enc);
356    Encode::_utf8_on($enc_text);
357    return length($enc_text);
358}
359
360sub lowercase_encode {
361    my $class = shift;
362    my ($str, $enc) = @_;
363    $enc = $class->_set_encode($str, $enc);
364    $str = $class->_conv_to_utf8($str, $enc) if $enc ne 'utf-8';
365    Encode::_utf8_on($str);
366    $str = lc $str;
367    Encode::_utf8_off($str);
368    $str = $class->_conv_from_utf8($str, $enc) if $enc ne 'utf-8';
369    return $str;
370}
371
372sub uppercase_encode {
373    my $class = shift;
374    my ($str, $enc) = @_;
375    $enc = $class->_set_encode($str, $enc);
376    $str = $class->_conv_to_utf8($str, $enc) if $enc ne 'utf-8';
377    Encode::_utf8_on($str);
378    $str = uc $str;
379    Encode::_utf8_off($str);
380    $str = $class->_conv_from_utf8($str, $enc) if $enc ne 'utf-8';
381    return $str;
382}
383
384sub encode_text_encode {
385    my $class = shift;
386    my($text, $from, $to) = @_;
387    $from ||= $class->guess_encoding($text);
388    $from = 'euc-jp' if $from eq 'euc';
389    $to ||= MT->config('PublishCharset') || 'utf-8';
390    $to = 'euc-jp' if $to eq 'euc';
391
392    if ($from ne $to) {
393        #Encode::_utf8_off($text);
394        eval {
395            if ( ( ( 'iso-2022-jp' eq lc($to) ) || ( 'shift_jis' eq lc($to) ) )
396                && ( 'utf-8' eq lc($from)) )
397            {
398                $text = Encode::decode($from, $text);
399                #FULLWIDTH TILDE to WAVE DASH
400                $text =~ s/\x{ff5e}/\x{301c}/g; 
401                #PARALLEL TO to DOUBLE VERTICAL LINE
402                $text =~ s/\x{2225}/\x{2016}/g; 
403                #FULLWIDTH HYPHEN-MINUS to MINUS SIGN
404                $text =~ s/\x{ff0d}/\x{2212}/g; 
405                #FULLWIDTH CENT SIGN to CENT SIGN
406                $text =~ s/\x{ffe0}/\x{00a2}/g; 
407                #FULLWIDTH POUND SIGN to POUND SIGN
408                $text =~ s/\x{ffe1}/\x{00a3}/g; 
409                #FULLWIDTH NOT SIGN to NOT SIGN
410                $text =~ s/\x{ffe2}/\x{00ac}/g; 
411                $text = Encode::encode($to, $text);
412            } else {
413                Encode::from_to($text, $from, $to);
414            }
415        };
416        if (my $err = $@) {
417            warn $err;
418        }
419    }
420
421    Encode::_utf8_off($text) if $to eq 'utf-8';
422    $text;
423}
424
425sub _conv_to_utf8 {
426    my $class = shift;
427    my ($text, $enc) = @_;
428    return $text if lc($enc) eq 'utf-8';
429    $class->encode_text($text, $enc, 'utf-8');
430}
431
432sub _conv_from_utf8 {
433    my $class = shift;
434    my ($text, $enc) = @_;
435    return $text if lc($enc) eq 'utf-8';
436    $class->encode_text($text, 'utf-8', $enc);
437}
438
439sub decode_utf8_encode {
440    my $class = shift;
441    my ($text, $enc) = @_;
442    $text = $class->encode_text($text, $enc, 'utf-8');
443    return Encode::decode_utf8($text);
444}
445
446sub decode_utf8_perl {
447    my $class = shift;
448    my ($text, $enc) = @_;
449    $text = $class->encode_text($text, $enc, 'utf-8');
450    return pack('U*', unpack('U0U*', $text));
451}
452
453sub utf8_off_encode {
454    my $class = shift;
455    my ($text) = @_;
456    Encode::_utf8_off($text);
457    $text;
458}
459
460sub utf8_off_perl {
461    my $class = shift;
462    my ($text) = @_;
463    return pack('C*', unpack('C*', $text));
464}
465
466sub _load_module {
467    return $PKG if $PKG;
468    my $class = shift;
469    if ($] > 5.008) {
470        eval "require Encode";
471        unless ($@) {
472            $PKG = 'encode';
473            return $PKG;
474        }
475    }
476    $PKG = 'perl';
477    return $PKG;
478}
479
4801;
Note: See TracBrowser for help on using the browser.