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

Revision 3531, 10.6 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::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
[1524]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 }
[1098]31
[2929]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
[1524]44my $ENCODING_NAMES = [
[1098]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];
[1524]52sub ENCODING_NAMES () {
53    return $ENCODING_NAMES;
54}
[1098]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
[3531]88sub encode_jcode {
89    my $class = shift;
90    my ($enc, $text) = @_;
91    return $class->encode_text_jcode($text, 'utf-8', $enc);
92}
93
[1098]94sub decode_jcode {
95    my $class = shift;
96    my ($enc, $text) = @_;
97    my $u8 = $class->encode_text_jcode($text, $enc, 'utf-8');
98    my $u8d = $class->decode_utf8_jcode($u8);
99    $u8d;
100}
101
102sub encode_text_jcode {
103    my $class = shift;
104    my ($text, $from, $to) = @_;
105    if (!$from) {
106        $from = $class->guess_encoding_jcode($text);
107    }
108    if (!$to) {
109       $to = MT->config('PublishCharset') || 'utf-8';
110    }
111    $from = $class->_conv_enc_label($from);
112    $to = $class->_conv_enc_label($to);
113    return $text if ($from eq $to || $to eq 'ascii');
114    return Jcode->new($text,$from)->$to();
115}
116
117sub substr_text_jcode {
118    my $class = shift;
119    my ($text, $startpos, $length, $enc) = @_;
120    if ($length == 0) {
121        $length = -1;
122    }
123    $enc = $class->_set_encode($text, $enc);
124    my $euc_text = $class->encode_text($text,$enc,'euc-jp');
125    my $out = '';
126    my $c = 0;
127    for (my $i=0;$i<length($euc_text);$i++) {
128        last if ($length == 0);
129        if ( substr($euc_text,$i,2) =~ /[\xA1-\xFE][\xA1-\xFE]/ ||
130             substr($euc_text,$i,2) =~ /[\x8E][\xA1-\xDF]/) {
131            if ($c >= $startpos && ($length-->0 || $length < 0)) {
132                $out .= substr($euc_text,$i,2);
133            }
134            $c++;$i++;
135            next;
136        }
137        if ( substr($euc_text,$i,3) =~ /[\x8F][\xA1-\xFE][\xA1-\xFE]/) {
138            if ($c >= $startpos && ($length-->0 || $length < 0)) {
139                $out .= substr($euc_text,$i,3);
140            }
141            $c++;$i+=2;
142            next;
143        }
144        if ( ord(substr($euc_text,$i,1)) < 0x80 ) {
145            if ($c >= $startpos && ($length-->0 || $length < 0)) {
146                $out .= substr($euc_text,$i,1);
147            }
148            $c++;
149            next;
150        }
151    }
152    return $class->encode_text($out, 'euc-jp', $enc);
153}
154
155sub lowercase_jcode {
156    my $class = shift;
157    my ($str, $enc) = @_;
158    $enc = $class->_set_encode($str, $enc);
159    $str = $class->encode_text_jcode($str, $enc, 'utf-8') if lc $enc ne 'utf-8';
160    $class->utf8_on_jcode($str);
161    $str = lc $str;
162    $class->utf8_off_jcode($str);
163    $str = $class->encode_text_jcode($str, 'utf-8', $enc) if lc $enc ne 'utf-8';
164    return $str;
165}
166
167sub uppercase_jcode {
168    my $class = shift;
169    my ($str, $enc) = @_;
170    $enc = $class->_set_encode($str, $enc);
171    $str = $class->encode_text_jcode($str, $enc, 'utf-8') if lc $enc ne 'utf-8';
172    $class->utf8_on_jcode($str);
173    $str = uc $str;
174    $class->utf8_off_jcode($str);
175    $str = $class->encode_text_jcode($str, 'utf-8', $enc) if lc $enc ne 'utf-8';
176    return $str;
177}
178
179
180sub wrap_text_jcode {
181    my $class = shift;
182    my ($text, $cols, $tab_init, $tab_sub, $enc) = @_;
183    $enc = $class->_set_encode($text, $enc);
184    if (!$cols) {
185        $cols = 72;
186    }
187    my $euc_text = $class->encode_text($text,$enc,'euc-jp');
188    my $out = '';
189    my $str = '';
190    my $b = 0;
191    for (my $i=0;$i<length($euc_text);$i++) {
192        if ( substr($euc_text,$i,2) =~ /[\xA1-\xFE][\xA1-\xFE]/ ||
193             substr($euc_text,$i,2) =~ /[\x8E][\xA1-\xDF]/) {
194            $str = substr($euc_text,$i,2);
195            $i++;
196            $b+=2;
197        }
198        elsif ( substr($euc_text,$i,3) =~ /[\x8F][\xA1-\xFE][\xA1-\xFE]/) {
199            $str = substr($euc_text,$i,3);
200            $i+=2;
201            $b+=2;
202        }
203        elsif ( substr($euc_text,$i,1) =~ /[\n\r]/ ) {
204            $str = substr($euc_text,$i,1);
205            $b = 0;
206        }
207        elsif ( ord(substr($euc_text,$i,1)) < 0x80 ) {
208            $str = substr($euc_text,$i,1);
209            $b+=1;
210        }
211
212        if ($b > $cols) {
213            $out .= "\n";
214            $b = 0;
215        }
216        $out .= $str;
217    }
218    return $class->encode_text($out,'euc-jp', $enc);
219}
220
221sub length_text_jcode {
222    my $class = shift;
223    my ($text, $enc) = @_;
224    $enc = $class->_set_encode($text, $enc);
225
226    my $euc_text= $class->encode_text($text, $enc, 'euc-jp');
227    my $len = Jcode->new($euc_text, 'euc')->jlength();
228    return $len;
229}
230
231sub first_n_jcode {
232    my $class = shift;
233    my ($text, $length, $enc) = @_;
234    $enc = $class->_set_encode($text, $enc);
235
236    my $euc_text = $class->encode_text($text, $enc, 'euc-jp');
237    $euc_text = MT::Util::remove_html($euc_text);
238    $euc_text =~ s/(\r?\n)+/ /g;
239    my $out = $class->substr_text_jcode($euc_text, 0, $length, 'euc-jp');
240    return $class->encode_text($out,'euc-jp', $enc);
241}
242
243sub break_up_text_jcode {
244    my $class = shift;
245    my ($text, $cols, $enc) = @_;
246    return $text;
247}
248
249sub wrap_text_encode {
250    my $class = shift;
251    my ($text, $cols, $tab_init, $tab_sub, $enc) = @_;
252    if (($enc && ('utf-8' eq lc $enc)) ||
253        (MT->config->PublishCharset =~ /utf-?8/i)) {
254        eval {
255            $text = Encode::decode_utf8($text);
256            #FULLWIDTH TILDE to WAVE DASH
257            $text =~ s/\x{ff5e}/\x{301c}/g; 
258            #PARALLEL TO to DOUBLE VERTICAL LINE
259            $text =~ s/\x{2225}/\x{2016}/g; 
260            #FULLWIDTH HYPHEN-MINUS to MINUS SIGN
261            $text =~ s/\x{ff0d}/\x{2212}/g; 
262            #FULLWIDTH CENT SIGN to CENT SIGN
263            $text =~ s/\x{ffe0}/\x{00a2}/g; 
264            #FULLWIDTH POUND SIGN to POUND SIGN
265            $text =~ s/\x{ffe1}/\x{00a3}/g; 
266            #FULLWIDTH NOT SIGN to NOT SIGN
267            $text =~ s/\x{ffe2}/\x{00ac}/g; 
268            $text = Encode::encode_utf8($text);
269        };
270    }
271    $text = $class->wrap_text_jcode($text, $cols, $tab_init, $tab_sub, $enc);
272    $text;
273}
274
275sub first_n_encode {
276    my $class = shift;
277    my ($text, $length, $enc) = @_;
278    $enc = $class->_set_encode($text, $enc);
279    $text = $class->_conv_to_utf8($text, $enc);
280    $text = MT::Util::remove_html($text);
281    $text =~ s/(\r?\n)+/ /g;
282    $text = $class->substr_text_encode($text, 0, $length, 'utf-8');
283    $text = $class->_conv_from_utf8($text, $enc);
284    return $text;
285}
286
287sub break_up_text_encode {
288    my $class = shift;
289    my ($text, $cols, $enc) = @_;
290    return $text;
291}
292
293sub _conv_enc_label {
294    my $class = shift;
295    my $enc = shift;
296    $enc = lc $enc;
297    $enc = $ENCODINGS_LABEL->{$enc} ? $ENCODINGS_LABEL->{$enc} : $enc;
298    return $enc;
299}
300
301sub convert_high_ascii_jcode {
302    my $class = shift;
303    my ($s) = @_;
304    $s = $class->encode_text_jcode($s, undef, 'utf-8');
305    $s;
306}
307
308sub convert_high_ascii_encode {
309    my $class = shift;
310    my ($s) = @_;
311    $s = $class->encode_text_encode($s, undef, 'utf-8');
312    $s;
313}
314
315sub decode_utf8_encode {
316    my $class = shift;
317    my ($text, $enc) = @_;
318    $text = $class->encode_text($text, $enc, 'utf-8');
319    return Encode::decode_utf8($text);
320}
321
322sub decode_utf8_jcode {
323    my $class = shift;
324    my ($text, $enc) = @_;
325    $text = $class->encode_text($text, $enc, 'utf-8');
326    return pack('U*', unpack('U0U*', $text));
327}
328
329sub utf8_off_encode {
330    my $class = shift;
331    my ($text) = @_;
332    Encode::_utf8_off($text);
333    $text;
334}
335
336## These are from Encode::Compat
337sub utf8_on_jcode {
338    my $class = shift;
339    my ($text) = @_;
340    return pack('U*', unpack('U0U*', $text));
341}
342
343sub utf8_off_jcode {
344    my $class = shift;
345    my ($text) = @_;
346    return pack('C*', unpack('C*', $text));
347}
348
349sub _load_module {
350    return $PKG if $PKG;
351    my $class = shift;
352    my $use_jcode = MT->config('UseJcodeModule') ? 1 : 0;
353    if ($] > 5.008 && !$use_jcode) {
354        eval "require Encode";
355        unless ($@) {
356            $PKG = 'encode';
357            return $PKG;
358        }
359    } else {
360        eval "require Jcode";
361        unless ($@) {
362            $PKG = 'jcode';
363            return $PKG;
364        }
365    }
366    $PKG = 'perl';
367    return $PKG;
368}
369
3701;
Note: See TracBrowser for help on using the browser.