root/trunk/lib/MT/I18N/ja.pm @ 2929

Revision 2929, 10.4 kB (checked in by fumiakiy, 16 months ago)

Merging feature-no-make-me branch to trunk.

  • 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::ja;
8
9use strict;
10use MT::Util qw(remove_html);
11use vars qw( @ISA $PKG );
12@ISA = qw( MT::I18N::default );
13*PKG = *MT::I18N::default::PKG;
14
15sub DEFAULT_LENGTH_ENTRY_EXCERPT ()                    { 40 }
16sub LENGTH_ENTRY_TITLE_FROM_TEXT ()                    { 10 }
17sub LENGTH_ENTRY_PING_EXCERPT ()                       { 80 }
18sub LENGTH_ENTRY_PING_TITLE_FROM_TEXT ()               { 10 }
19sub DISPLAY_LENGTH_MENU_TITLE ()                       { 11 }
20sub DISPLAY_LENGTH_EDIT_COMMENT_TITLE ()               { 12 }
21sub DISPLAY_LENGTH_EDIT_COMMENT_AUTHOR ()              { 12 }
22sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_SHORT ()          { 23 }
23sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_LONG ()           { 45 }
24sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_BREAK_UP_SHORT () { 30 }
25sub DISPLAY_LENGTH_EDIT_COMMENT_TEXT_BREAK_UP_LONG ()  { 80 }
26sub DISPLAY_LENGTH_EDIT_PING_TITLE_FROM_EXCERPT ()     { 25 }
27sub DISPLAY_LENGTH_EDIT_PING_BREAK_UP ()               { 30 }
28sub DISPLAY_LENGTH_EDIT_ENTRY_TITLE ()                 { 11 }
29sub DISPLAY_LENGTH_EDIT_ENTRY_TEXT_FROM_EXCERPT ()     { 25 }
30sub DISPLAY_LENGTH_EDIT_ENTRY_TEXT_BREAK_UP ()         { 30 }
31
32sub PORTAL_URL()            { 'http://www.sixapart.jp/movabletype/' }
33sub SUPPORT_URL()           { 'http://www.sixapart.jp/movabletype/support/' }
34sub NEWS_URL()              { 'http://www.sixapart.jp/movabletype/' }
35sub NEWSBOX_URL()           { 'http://www.sixapart.jp/movabletype/news/newsbox.html' }
36sub LEARNINGNEWS_URL()      { 'http://www.movabletype.jp/newsbox.html' }
37sub CATEGORY_NAME_NODASH()  { 1 }
38sub DEFAULT_TIMEZONE()      { 9 }
39sub MAIL_ENCODING()         { 'ISO-2022-JP' }
40sub LOG_EXPORT_ENCODING()   { 'Shift_JIS' }
41sub EXPORT_ENCODING()       { 'Shift_JIS' }
42sub PUBLISH_CHARSET()       { 'UTF-8' }
43
44my $ENCODING_NAMES = [
45    { 'name' => 'guess', 'display_name' => 'AUTO DETECT' },
46    { 'name' => 'sjis', 'display_name' => 'SHIFT_JIS' },
47    { 'name' => 'euc', 'display_name' => 'EUC-JP' },
48    { 'name' => 'utf8', 'display_name' => 'UTF-8' },
49    { 'name' => 'ascii', 'display_name' => 'ISO-8859-1' },
50    { 'name' => 'WinLatin1', 'display_name' => 'Windows Latin1' },
51];
52sub ENCODING_NAMES () {
53    return $ENCODING_NAMES;
54}
55
56my $ENCODINGS_LABEL = {
57    'shift_jis' => 'sjis',
58    'iso-2022-jp' => 'jis',
59    'euc-jp' => 'euc',
60    'utf-8' => 'utf8',
61    'ascii' => 'utf8',
62    'iso-8859-1' => 'ascii',
63};
64
65my @ENCODINGS_ENCODE =
66    qw( euc-jp shiftjis 7bit-jis iso-2022-jp
67        iso-2022-jp-1 jis0201-raw jis0208-raw
68        jis0212-raw cp932 Macjapanese );
69
70sub guess_encoding_jcode {
71    my $class = shift;
72    my ($text) = @_;
73    my $enc = Jcode::getcode($text);
74    my $def_enc = MT->config('PublishCharset') || 'utf-8';
75    if (!$enc) {
76        $enc = $def_enc;
77    }
78    if ($enc eq 'ascii') {
79        $enc = 'utf-8';
80    }
81    if ($enc eq 'binary') {
82        $enc = $def_enc;
83    }
84    $enc = $class->_conv_enc_label($enc);
85    return $enc;
86}
87
88sub decode_jcode {
89    my $class = shift;
90    my ($enc, $text) = @_;
91    my $u8 = $class->encode_text_jcode($text, $enc, 'utf-8');
92    my $u8d = $class->decode_utf8_jcode($u8);
93    $u8d;
94}
95
96sub encode_text_jcode {
97    my $class = shift;
98    my ($text, $from, $to) = @_;
99    if (!$from) {
100        $from = $class->guess_encoding_jcode($text);
101    }
102    if (!$to) {
103       $to = MT->config('PublishCharset') || 'utf-8';
104    }
105    $from = $class->_conv_enc_label($from);
106    $to = $class->_conv_enc_label($to);
107    return $text if ($from eq $to || $to eq 'ascii');
108    return Jcode->new($text,$from)->$to();
109}
110
111sub substr_text_jcode {
112    my $class = shift;
113    my ($text, $startpos, $length, $enc) = @_;
114    if ($length == 0) {
115        $length = -1;
116    }
117    $enc = $class->_set_encode($text, $enc);
118    my $euc_text = $class->encode_text($text,$enc,'euc-jp');
119    my $out = '';
120    my $c = 0;
121    for (my $i=0;$i<length($euc_text);$i++) {
122        last if ($length == 0);
123        if ( substr($euc_text,$i,2) =~ /[\xA1-\xFE][\xA1-\xFE]/ ||
124             substr($euc_text,$i,2) =~ /[\x8E][\xA1-\xDF]/) {
125            if ($c >= $startpos && ($length-->0 || $length < 0)) {
126                $out .= substr($euc_text,$i,2);
127            }
128            $c++;$i++;
129            next;
130        }
131        if ( substr($euc_text,$i,3) =~ /[\x8F][\xA1-\xFE][\xA1-\xFE]/) {
132            if ($c >= $startpos && ($length-->0 || $length < 0)) {
133                $out .= substr($euc_text,$i,3);
134            }
135            $c++;$i+=2;
136            next;
137        }
138        if ( ord(substr($euc_text,$i,1)) < 0x80 ) {
139            if ($c >= $startpos && ($length-->0 || $length < 0)) {
140                $out .= substr($euc_text,$i,1);
141            }
142            $c++;
143            next;
144        }
145    }
146    return $class->encode_text($out, 'euc-jp', $enc);
147}
148
149sub lowercase_jcode {
150    my $class = shift;
151    my ($str, $enc) = @_;
152    $enc = $class->_set_encode($str, $enc);
153    $str = $class->encode_text_jcode($str, $enc, 'utf-8') if lc $enc ne 'utf-8';
154    $class->utf8_on_jcode($str);
155    $str = lc $str;
156    $class->utf8_off_jcode($str);
157    $str = $class->encode_text_jcode($str, 'utf-8', $enc) if lc $enc ne 'utf-8';
158    return $str;
159}
160
161sub uppercase_jcode {
162    my $class = shift;
163    my ($str, $enc) = @_;
164    $enc = $class->_set_encode($str, $enc);
165    $str = $class->encode_text_jcode($str, $enc, 'utf-8') if lc $enc ne 'utf-8';
166    $class->utf8_on_jcode($str);
167    $str = uc $str;
168    $class->utf8_off_jcode($str);
169    $str = $class->encode_text_jcode($str, 'utf-8', $enc) if lc $enc ne 'utf-8';
170    return $str;
171}
172
173
174sub wrap_text_jcode {
175    my $class = shift;
176    my ($text, $cols, $tab_init, $tab_sub, $enc) = @_;
177    $enc = $class->_set_encode($text, $enc);
178    if (!$cols) {
179        $cols = 72;
180    }
181    my $euc_text = $class->encode_text($text,$enc,'euc-jp');
182    my $out = '';
183    my $str = '';
184    my $b = 0;
185    for (my $i=0;$i<length($euc_text);$i++) {
186        if ( substr($euc_text,$i,2) =~ /[\xA1-\xFE][\xA1-\xFE]/ ||
187             substr($euc_text,$i,2) =~ /[\x8E][\xA1-\xDF]/) {
188            $str = substr($euc_text,$i,2);
189            $i++;
190            $b+=2;
191        }
192        elsif ( substr($euc_text,$i,3) =~ /[\x8F][\xA1-\xFE][\xA1-\xFE]/) {
193            $str = substr($euc_text,$i,3);
194            $i+=2;
195            $b+=2;
196        }
197        elsif ( substr($euc_text,$i,1) =~ /[\n\r]/ ) {
198            $str = substr($euc_text,$i,1);
199            $b = 0;
200        }
201        elsif ( ord(substr($euc_text,$i,1)) < 0x80 ) {
202            $str = substr($euc_text,$i,1);
203            $b+=1;
204        }
205
206        if ($b > $cols) {
207            $out .= "\n";
208            $b = 0;
209        }
210        $out .= $str;
211    }
212    return $class->encode_text($out,'euc-jp', $enc);
213}
214
215sub length_text_jcode {
216    my $class = shift;
217    my ($text, $enc) = @_;
218    $enc = $class->_set_encode($text, $enc);
219
220    my $euc_text= $class->encode_text($text, $enc, 'euc-jp');
221    my $len = Jcode->new($euc_text, 'euc')->jlength();
222    return $len;
223}
224
225sub first_n_jcode {
226    my $class = shift;
227    my ($text, $length, $enc) = @_;
228    $enc = $class->_set_encode($text, $enc);
229
230    my $euc_text = $class->encode_text($text, $enc, 'euc-jp');
231    $euc_text = MT::Util::remove_html($euc_text);
232    $euc_text =~ s/(\r?\n)+/ /g;
233    my $out = $class->substr_text_jcode($euc_text, 0, $length, 'euc-jp');
234    return $class->encode_text($out,'euc-jp', $enc);
235}
236
237sub break_up_text_jcode {
238    my $class = shift;
239    my ($text, $cols, $enc) = @_;
240    return $text;
241}
242
243sub wrap_text_encode {
244    my $class = shift;
245    my ($text, $cols, $tab_init, $tab_sub, $enc) = @_;
246    if (($enc && ('utf-8' eq lc $enc)) ||
247        (MT->config->PublishCharset =~ /utf-?8/i)) {
248        eval {
249            $text = Encode::decode_utf8($text);
250            #FULLWIDTH TILDE to WAVE DASH
251            $text =~ s/\x{ff5e}/\x{301c}/g; 
252            #PARALLEL TO to DOUBLE VERTICAL LINE
253            $text =~ s/\x{2225}/\x{2016}/g; 
254            #FULLWIDTH HYPHEN-MINUS to MINUS SIGN
255            $text =~ s/\x{ff0d}/\x{2212}/g; 
256            #FULLWIDTH CENT SIGN to CENT SIGN
257            $text =~ s/\x{ffe0}/\x{00a2}/g; 
258            #FULLWIDTH POUND SIGN to POUND SIGN
259            $text =~ s/\x{ffe1}/\x{00a3}/g; 
260            #FULLWIDTH NOT SIGN to NOT SIGN
261            $text =~ s/\x{ffe2}/\x{00ac}/g; 
262            $text = Encode::encode_utf8($text);
263        };
264    }
265    $text = $class->wrap_text_jcode($text, $cols, $tab_init, $tab_sub, $enc);
266    $text;
267}
268
269sub first_n_encode {
270    my $class = shift;
271    my ($text, $length, $enc) = @_;
272    $enc = $class->_set_encode($text, $enc);
273    $text = $class->_conv_to_utf8($text, $enc);
274    $text = MT::Util::remove_html($text);
275    $text =~ s/(\r?\n)+/ /g;
276    $text = $class->substr_text_encode($text, 0, $length, 'utf-8');
277    $text = $class->_conv_from_utf8($text, $enc);
278    return $text;
279}
280
281sub break_up_text_encode {
282    my $class = shift;
283    my ($text, $cols, $enc) = @_;
284    return $text;
285}
286
287sub _conv_enc_label {
288    my $class = shift;
289    my $enc = shift;
290    $enc = lc $enc;
291    $enc = $ENCODINGS_LABEL->{$enc} ? $ENCODINGS_LABEL->{$enc} : $enc;
292    return $enc;
293}
294
295sub convert_high_ascii_jcode {
296    my $class = shift;
297    my ($s) = @_;
298    $s = $class->encode_text_jcode($s, undef, 'utf-8');
299    $s;
300}
301
302sub convert_high_ascii_encode {
303    my $class = shift;
304    my ($s) = @_;
305    $s = $class->encode_text_encode($s, undef, 'utf-8');
306    $s;
307}
308
309sub decode_utf8_encode {
310    my $class = shift;
311    my ($text, $enc) = @_;
312    $text = $class->encode_text($text, $enc, 'utf-8');
313    return Encode::decode_utf8($text);
314}
315
316sub decode_utf8_jcode {
317    my $class = shift;
318    my ($text, $enc) = @_;
319    $text = $class->encode_text($text, $enc, 'utf-8');
320    return pack('U*', unpack('U0U*', $text));
321}
322
323sub utf8_off_encode {
324    my $class = shift;
325    my ($text) = @_;
326    Encode::_utf8_off($text);
327    $text;
328}
329
330## These are from Encode::Compat
331sub utf8_on_jcode {
332    my $class = shift;
333    my ($text) = @_;
334    return pack('U*', unpack('U0U*', $text));
335}
336
337sub utf8_off_jcode {
338    my $class = shift;
339    my ($text) = @_;
340    return pack('C*', unpack('C*', $text));
341}
342
343sub _load_module {
344    return $PKG if $PKG;
345    my $class = shift;
346    my $use_jcode = MT->config('UseJcodeModule') ? 1 : 0;
347    if ($] > 5.008 && !$use_jcode) {
348        eval "require Encode";
349        unless ($@) {
350            $PKG = 'encode';
351            return $PKG;
352        }
353    } else {
354        eval "require Jcode";
355        unless ($@) {
356            $PKG = 'jcode';
357            return $PKG;
358        }
359    }
360    $PKG = 'perl';
361    return $PKG;
362}
363
3641;
Note: See TracBrowser for help on using the browser.