« b2evolution 1.8.1 の日本語周りの改造エルリック・サーガ復刊と新作翻訳刊行 »

b2evolution 0.9.2 の日本語対応

2006/05/20 02:00 | 著者: Jun MUTO [mail] | カテゴリ: b2evolution

b2evolution 0.9.2がリリースされました

b2evolution の日本語対応に関するメモです。
以前のものから細かい変更を加えましたので、テストが不十分な部分があります。問題が起こるようでしたら報せてください。

b2evolution は適切な設定を選択すれば、そのままで使ってもそれなりに日本語が使えます。
しかし、ブックマークレット、文字セットの違うブログとのトラックバック送受信、コメント等があった際の通知メールの文字コード処理などで問題が発生する可能性があります。

さらに、メールでブログに記事を投稿する機能を使う際に、MIMEデコード・文字コード変換処理が行われないのでおそらく正常に書き込めないと思います。これは、私は今のところ使う予定の無い機能ですので、どなたかが調査してくださると嬉しいです。

バージョン0.9.2について、私が行った対処を書いておきます。
他の環境でも通用するかは不明です。
(XREA.COM で使用する場合は、XREA.COM 特有の b2evolution 設定 も参照してください)

(2006年5月20日追記:パッチファイルを作成しました)
(2006年5月20日21時58分追記:「トラックバック」のトラックバック送信部分を変更しました)

続き:

2006年5月20日追記:patchコマンドを使用して簡単に変更が行えるパッチを用意しました。なお、「マルチバイト関数が使えない環境での対策」は含めておらず、「通知メール」の変更点は日本語限定の対処のほうを使用しています。
b2evolution-0.9.2-japanese.patch
これをファイルに保存して、b2evolutionの /blogs/ フォルダに移動し、
patch -p2 < b2evolution-0.9.2-japanese.patch
とコマンドプロンプトで実行してください。
(参考:http://wiki.ohgaki.net/index.php?b2evolution

注意事項:この後記述する変更点で、追加の際に示す目印となる行は区別の付けやすさで選んでいますので、追加する位置の指定は目印のとが混在しています。ご注意ください。

デフォルトのメッセージを日本語にする

インストールの際に、インストールページで最初に「Japanese (JP)」(日本語 (JP))のリンクを使って言語を日本語に指定しておくと、ブログやユーザのデフォルトの言語が日本語になり、後の設定が楽になりますので、「Japanese (JP)」(日本語 (JP))の選択を行ってください。

もし、インストール時に日本語(Japanese)以外の言語を指定していた場合、ブログ設定とユーザ設定の言語・地域設定(Locale)が「日本語」(Japanese)になっていないと思われます。 その状態では、日本語の投稿の書き込みがうまくいきませんので、管理画面の「ブログ」と「ユーザ」の2ヶ所でそれぞれ設定してください。

(また、過去に管理画面の「設定 : 地域」で設定を変更していた場合、「設定 : 地域」ページの下のほうに「デフォルトにリセット (データベース テーブルを削除)」リンクが表示されています。この状態では /conf/_locales.php の更新が反映されませんので、「デフォルトにリセット (データベース テーブルを削除)」でリセットを行ってください。なお、通常の使い方では「設定 : 地域」の設定を変更する必要はありませんので、リセット後はデフォルトそのままにしておいてください)


HTMLチェッカーの文字コード変換の問題

記事やコメントなどを投稿する際に、エラーが表示され、そのエラーメッセージの内容が文字化けしている場合があります。これは、内部文字エンコーディングの設定がうまくいっていないことが原因です。 (注意:対症療法的なやり方をしていますので、この対策を行うと、逆にエラーが出る等の問題を起こす可能性もあります。問題が起こった際は、変更した部分を元に戻してください)

/b2evocore/_class_htmlchecker.php の115行目の、

$xhtml = mb_convert_encoding( $xhtml, 'UTF-8' );

の前に

mb_internal_encoding( locale_charset(false) );

という1行を追加します。


週の初めの曜日

カレンダー表示等で週の初めが月曜日になっているのを変更するには、/conf/_locales.php の359行目の

$start_of_week = 1;

の数字を変更します。0 で日曜、1 で月曜、2 で火曜が週の初めと見なされます。


ブックマークレット

ブックマークレットの問題は、ブックマークレットのJavaScriptで escape() が用いられていることが原因です。encodeURIComponent() を使用するように変更します。(欧文のみの環境ですと、escape() のほうが問題が少ないようです。しかし日本語等、UTF-8を使用する場合では encodeURIComponent() のほうが無難です)

/admin/tools.php の31行目、38行目、46行目、53行目、87行目の各行に、3個もしくは2個ずつある

escape(

encodeURIComponent(

に置き換えます。

この変更を行った後に、ブックマークレットの登録をやり直してください。

/admin/tools.php を書き換えるより、ブラウザのお気に入り/ブックマークに登録したブックマークレットURIを、後から変更(escapeencodeURIComponent に置き換え)したほうが簡単かもしれません。楽だと思うほうでやってみてください)


通知メール

通知メールについて、日本語限定の対処と、言語に限定されない対処を紹介します。(日本語しか使わないのであれば、「日本語限定の対処」を推奨します)

  • 日本語限定でメール出力を奇麗にする対処方法です。携帯電話等で通知メールを受け取る場合はこちらでないと差し障りがあると思います。

    /b2evocore/_functions.php の1334行目の

    $headers[] = 'Content-Type: text/plain; charset='.$locales[ $current_locale ]['charset'];
    

    という部分を、コメントアウト(行の先頭に // を付ける)して

    // $headers[] = 'Content-Type: text/plain; charset='.$locales[ $current_locale ]['charset'];
    

    と変更します。

    それから、/b2evocore/_functions.php の1354行目、

    return @mail( $to, $subject, $message, $headerstring );
    

    $message = str_replace("\r\n", "\n", $message);
    mb_language('Japanese');
    mb_detect_order( $locales[ $current_locale ]['charset'] );
    return @mb_send_mail( $to, $subject, $message, $headerstring );
    

    に変更します。

  • 言語汎用の対処方法です。メールの受信環境によっては問題が出る可能性もあります。多言語でブログを運用している場合のみ、こちらを使うようにしてください。

    /b2evocore/_functions.php の1354行目の

    return @mail( $to, $subject, $message, $headerstring );
    

    の前に

    $message = str_replace("\r\n", "\n", $message);
    $subject = '=?' . $locales[ $current_locale ]['charset'] . '?B?' . base64_encode($subject) . '?=';
    

    という2行を追加します。

    同じく /b2evocore/_functions.php の1340行目の

    $headerstring = "From: $from\n";
    

    の前に

    if ( preg_match('/^(.+)( <[a-z0-9_@\-\.]+>)$/i', $from, $fromarray) )
    {
    $from = '=?' . $locales[ $current_locale ]['charset'] . '?B?' . base64_encode($fromarray[1]) . '?=' . $fromarray[2];
    }
    

    を追加します。


トラックバック

b2evolutionのトラックバック機能は、相手が同じ文字セットを使用していることを前提に作られていますので、文字セットの違うブログとのトラックバックのやり取りで文字化けを起こす可能性があります。文字セットUTF-8、EUC-JP、Shift_JISが混在する日本語のブログ間では起こりやすい問題ですので、それを防ぐための対策を施します。

送信に関しては、確実な対処とは言えませんが、日本の一部で独自に使用されている追加トラックバック・パラメータ charset を導入します。加えて、トラックバックの次期仕様(Trackback Working Group)にて議論されている、トラックバックの仕様 TrackBack Technical Specification Version 1.2 で導入された、POSTリクエスト・ヘッダへの charset 記載も行うようにします。

/b2evocore/_functions_trackback.php の67行目の

$query_string = "title=$title&url=$url&blog_name=$blog_name&excerpt=$excerpt";

$charset = urlencode( locale_charset(false) );
$query_string = "title=$title&url=$url&blog_name=$blog_name&excerpt=$excerpt&charset=$charset";

に変更します。同じく、/b2evocore/_functions_trackback.php の94行目(これは前述の変更を行う前の行数です。変更後なら95行目)の

$http_request .= 'Content-Type: application/x-www-form-urlencoded'."\r\n";

$http_request .= 'Content-Type: application/x-www-form-urlencoded; charset='.$charset."\r\n";

に変更します。

次に、トラックバック受信に関してですが、文字セットの自動判別を行うほうが安心ではあるものの、PHPのマルチバイト関数(mbstring)の自動判別機能は、日本語以外の判別に関しては実用的ではありません。そのため、日本語の場合のみ自動判別を用いるようにしておきます。

/htsrv/trackback.php の49行目の

$title = strip_tags($title);

の前に、

param( 'charset', 'string', NULL );
if ( ($_SERVER['CONTENT_TYPE'] != '') && ($charset == '') )
{
$request_header_content_type = array();
preg_match( '/;[ \r\n\t]*charset="?([A-Za-z0-9_\-]+)/i', $_SERVER['CONTENT_TYPE'], $request_header_content_type );
if ( $request_header_content_type[1] != '' )
$charset = $request_header_content_type[1];
}
locale_temp_switch( get_bloginfo('locale', $blogparams) );
if ( ($charset != '') && function_exists('iconv') )
{
$to_charset = locale_charset(false);
$title = iconv( $charset, $to_charset, $title );
$excerpt = iconv( $charset, $to_charset, $excerpt );
$blog_name = iconv( $charset, $to_charset, $blog_name );
}
elseif ( function_exists('mb_convert_encoding') )
{
if ( ($charset == '') && ( locale_lang(false) == 'ja-JP') )
{
$charset = mb_detect_encoding( $title . $excerpt . $blog_name, 'ASCII,JIS,UTF-8,EUC-JP,SJIS');
}
if ( $charset != '' )
{
$to_charset = locale_charset(false);
$title = mb_convert_encoding( $title, $to_charset, $charset );
$excerpt = mb_convert_encoding( $excerpt, $to_charset, $charset );
$blog_name = mb_convert_encoding( $blog_name, $to_charset, $charset );
}
}
locale_restore_previous();

を追加します。


経由検索エンジンのキーワード

統計の検索エンジン経由アクセスの使用キーワード表示が日本語に対応していませんので、その文字化け対策です。

/b2evocore/_functions_hitlogs.php の492行目、

echo htmlentities($kwout);

$kwout = str_replace("\x00", '', $kwout);
echo htmlspecialchars($kwout);

に変更します。 (変更点の $kwout = str_replace("\x00", '', $kwout); の1行は、XREA.COM無料サービスの自動広告挿入機能が NULL を適切に処理できないので加えています。他の環境、特に自動広告挿入がない環境では必要ないはずですので、この1行は外していただいても大丈夫だと思います)

同じ /b2evocore/_functions_hitlogs.php の481行目、

if( strpos( $q, 'テ' ) !== false )

(環境・設定によっては 'テ' でなく、'Ã' と表示される場合もあります) の部分を、

if ( ( locale_charset(false) == 'iso-8859-1' ) && ( strpos( $q, "\xC3" ) !== false ) )

に変更します。

  • 以下は、日本語限定になりますが文字コードの自動判別も行う対策です。前述の変更に加えて、この変更も追加することで、日本語に関しては検索キーワード表示の文字化けがほぼ無くなります。

    /b2evocore/_functions_hitlogs.php の486行目、

    $qwords = explode( ' ', $q );
    

    の前に、

    else if( ( locale_lang(false) == 'ja-JP' ) && function_exists('mb_convert_encoding') )
    {
    $q = mb_convert_encoding($q, locale_charset(false), 'ASCII,JIS,UTF-8,EUC-JP,SJIS');
    }
    

    を追加します。


年月などの表示

日毎表示のタイトル部分、アーカイブ一覧の年月表示、カレンダーの年月表示では、日本語で一般的な語順でなく、「1月 2005, 24」や「1月 2005」のような表示になってしまいます。これを日本語らしい形式にする変更です。

(少々手間がかかるわりに、ありがたみの薄い改造ですので、面倒であればしなくていいと思います)

  • 日毎表示・月毎表示などのタイトル部分。

    /b2evocore/_functions_template.php の68行目、

    $title = $prefix.$my_month.' '.$my_year;
    

    の前に、

    if (locale_lang(false) == 'ja-JP') {
    $title = $prefix.$my_year.'&#24180;'.$my_month;
    if( !empty( $my_day ) )
    { // We also want to display a day
    $title .= $my_day.'&#26085;';
    }
    if( !empty($w) && ($w>=0) ) // Note: week # can be 0
    { // We also want to display a week number
    $title .= ', &#31532;'.$w.'&#36913;';
    }
    } else {
    

    を追加します。
    また、80行目(これは前述の変更を行う前の行数です。変更後なら91行目)の、

    echo format_to_output( $title, $display );
    

    の前に、

    }
    

    を追加します。

  • アーカイブ一覧の部分。

    /skins/_archives.php の56行目、

    echo T_($month[zeroise($arc_month,2)]),' ',$arc_year;
    

    if (locale_lang(false) == 'ja-JP') {
    echo $arc_year,'&#24180;',T_($month[zeroise($arc_month,2)]);
    } else {
    echo T_($month[zeroise($arc_month,2)]),' ',$arc_year;
    }
    

    に変更します。

  • カレンダーの部分。

    各スキンのフォルダ内にある _calendar.php (例:/skins/custom/_calendar.php)の25行目(スキンによって若干の違いがあることがあります)、

    // $Calendar->set( 'monthformat', 'F Y' );
    

    の前に、

    if (locale_lang(false) == 'ja-JP') {
    $Calendar->set( 'monthformat', 'Y&#24180;F' );
    }
    

    を追加します。


マルチバイト関数が使えない環境での対策

海外のレンタルサーバなどでは、マルチバイト関数(mbstring)mb_ で始まる関数)が用意されていない場合が多くあります。 Andy氏が作られた mbstringエミュレータ を使うことで、マルチバイト関数が使えない環境でも、主要な mb_* 関数が使えるようになります。 (マルチバイト関数(mbstring) が使える環境では、この変更を行う必要はありません)

まず、ダウンロードしたmbstringエミュレータのアーカイブファイルを展開して、出てきたファイル全てを /conf/ ディレクトリに置きます。

次に、/conf/ ディレクトリに hacks.php という名前のファイルを作ります。内容は次の通りです。(すでに /conf/hacks.php がある場合は、適切に内容を追加してください。)

<?php
if (!extension_loaded('mbstring')) {
include dirname(__FILE__).'mb-emulator.php';
}
?>

内容の前後(<?php の前、?> の後)に余分な改行を入れないよう注意してください。

この記事へのトラックバック アドレス

Trackback URL (right click and copy shortcut/link location)

6 コメント, 1 トラックバック

コメント from: chosei [訪問者] · http://funahara.com/blog/
初めまして。

先日v.0.9.2にあげたのですが途中でおかしくなり、何度かバックアップを入れ直しましたが、今日本語では書けるのですが、テンプレートが化けてしまい元にもどりません。3日間、修復についやして今ここにたどり着きました。もう一度上から詳しく読んで明後日に試してみます。
2006/05/22 @ 12:25
コメント from: Jun MUTO [メンバー] メール
chosei様

はじめまして。よろしくお願いします。

URLで示されているサイトを拝見しましたところ、言語ファイルがおかしくなっている可能性が高そうです。
/locales/ja_JP/_global.php ファイルを一旦削除して、b2evolution配布アーカイブのオリジナルのファイルをアップロードしなおしたら直るかもしれません。

特に、文字コード自動変換機能付きのFTPクライアント・ソフトウェアでアップロードする場合に、誤った判定が行われてファイルが破損することが多いようですので、文字コード自動判別・変換機能が付いているFTPクライアントを使用しているのであれば、機能を無効にしたほうが無難だと思います。(b2evolutionに限った話ではなく)
2006/05/22 @ 19:52
コメント from: chosei [訪問者] · http://funahara.com/blog/
MUTO様

ありがとうございます。
一発でなおりました。30秒もかかりませんでした。
これからも宜しくお願いします。
2006/05/22 @ 22:06
b2evolution 0.9.2 に UPしました。
5/17に本blogで使用しているツールb2evolutionのVer 0.9.2が公開されました。で、今日気付いたのでいきなりアップデート。

今回はすんなり更新。
19:20~19:40頃繋がりにくくてごめんなさい。
...
2006/05/23 @ 22:02
コメント from: Amit [訪問者]
Muto様

ちょっとお聞きしたいことがありますが、宜しくお願いいたします。

基本的な質問で本当にすみませんが、ウェブサーバの設定やブログの
世界が初めてです...

これからb2evolutionをXREAにインストールしたいのですが、
その前にいくつか分からないことがあります...

1.b2evolution をインストールする時にDBの文字コードをShift_JIS
に設定できますでしょうか。日本語のページを利用してインストールした
場合に多分UTF-8になっているような気がします。

2.どこかのConfigファイルの設定を変更して...HTMLページの
EncodingをUTF-8からShift_JISに変更できますか。

外国人の人で日本語でうまく説明できなかったかもしれませんが、ご指摘
いただければと思います。
2006/06/15 @ 23:32
コメント from: Jun MUTO [メンバー] メール
Amit様

残念ながら、現時点では 1 と 2 の両方とも、設定の変更だけで行うことはできません。
b2evolutionのソースコードの書き換えが必要になります。

基本的な考え方だけ提案しておきます。実際に試してはおらず、ここに書いた通りのことをやっても問題が起こる可能性も高いので、注意してください。

1 の、インストール時にデータベースに保存される文字列をShift_JISにする方法は、知識さえあれば手間は少ないと思います。
conf/_locales.php の218行目、
'charset' => 'utf-8',

'charset' => 'shift_jis',
に変更します。
次に locales/ja_JP/_global.php のファイルを UTF-8 から Shift_JIS へ文字コード変換します。さらに Shift_JIS へ変換後に、2バイト目に 0x5C が含まれる文字(「表」「予」「申」「能」「十」「ソ」など)の対策を行う必要があります。具体的には、「表\」「予\」「申\」「能\」「十\」「ソ\」などと \ (0x5C)を後に付けます(註:\ (0x5C) は一般的なShift_JIS環境では ¥ (円マーク)と表示されます)。

Shift_JISで2バイト目に 0x5C が含まれる文字(他にもあるかも):

―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭


ただし、PHPアプリケーションの内部コードをShift_JISにするのは、2バイト目に 0x5C が含まれることが原因のトラブル(場合によってはセキュリティに関わる問題)が起こりやすいのでお薦めしません。

2 の方法は、もっと変更する必要のある場所が多くなります。また、マルチバイト文字列関数(mbstring)が使えることが必要です。

前述の conf/_locales.php の218行目の変更のほか、入出力文字のコード変換のために mb_http_output(), mb_internal_encoding(), mb_http_input(), mb_convert_encoding() などを適切な場所に入れていくといいはずです。

しかし、大掛かりな変更になりそうで、私から具体的に変更箇所を示せるほど調べる余裕がありませんでしたので、この程度の内容で御容赦ください。
2006/06/17 @ 16:46
コメント from: Amit [訪問者]
Muto様

返事をいただき本当にありがとうございました。

もう一度Shift_JISにする必要があるかどうか考えてみます。必要で
あれば1の方法でやってみます。
実は、今作っているウェブサイトの他のすべてのページがShift_JISコードで
作っているので、Blogのページもそれにあわせようと思っていました。

しかし、b2evolutionが標準であるutf-8を使っているのはいいことだと思います。
他のページもそれに合わせるかBlogだけ今のところutf-8にするかちょっと
考えてみます。

お忙しいところ本当にありがとうございました。
またよろしくお願いいたします。
2006/06/17 @ 22:39

コメントを残す


Your email address will not be revealed on this site.

頂いたURLは表示されます。
(改行が自動で <br /> になります)
(Name, email & website)
(ユーザに、メッセージ・フォームを通じた連絡を許可します (あなたのメール・アドレスは表示されません))
2009年11月
 << <   > >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

茶気抄:
このサイトは、私(Jun MUTO)が気になったことをメモしておくために設置しています。
気の向くままに運用しているため、予告なく停止したり、表示がおかしくなったりすることがあります。

当サイトではログの採取を行っています。ご承知おきください。

検索

最近の投稿

XMLフィード

open source blog tool

九十九電機