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

Revision 3531, 12.8 kB (checked in by fumiakiy, 9 months ago)

Merged sockfish to trunk. "svn merge -r3114:3527 http://code.sixapart.com/svn/movabletype/branches/sockfish/ ."

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