« トラックバックが受け付けられない問題が発生していましたちびくろさんぼのおはなし »

b2evolution 0.9.0.11 の日本語対応(改訂)

2005/03/14 20:07 | 著者: Jun MUTO [mail] | カテゴリ: b2evolution

追記:最近、なぜか最新の記事(例えば、この追記時点で最新の正式版0.9.1について:「b2evolution 0.9.1 の日本語対応」)ではなく、この古い記事のみを紹介されているサイトが多いようで。そのようなサイトからおいでの方はお手数ですが、メニュー欄から最新の記事を探してみてください(カテゴリ欄で b2evolution を選択するか、最新の投稿欄で探すと見つけやすいと思います)。

b2evolution の日本語対応に関するメモ。

(以前の記事「b2evolution 0.9.0.11 の日本語対応」から変更を加えています。特に「通知メール - 言語汎用」(3月15日16時30分に再変更)、「トラックバック - 推奨(日本語限定)」、「経由検索エンジンのキーワード」は異なる内容になっています。これら三点について、すでに以前の「b2evolution 0.9.0.11 の日本語対応」で示した変更を行っている場合は、お手数ですが元に戻してから、当記事で示す変更を行ってください。)

(追記:「b2evolution 0.9.0.11以前にSQLインジェクションの脆弱性」に記載しました修正ファイルは忘れないように適用してください)

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

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

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

続き:

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

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

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

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


週の初めの曜日

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

$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 の1322行目の

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

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

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

    と変更します。

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

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

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

    に変更します。

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

    /b2evocore/_functions.php の1342行目の

    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 の1328行目の

    $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];
    }
    

    を追加します。


トラックバック

/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";

に変更します。

次に、/htsrv/trackback.php の45行目の

$title = strip_tags($title);

の前に、次のいずれかを追加します。

  • 推奨。自動判別を行うようにして日本語の処理が適切に行われるようにしたものです。日本語以外ではうまくいかない可能性のある対処ですが、多言語で運用していない限りはこちらをお薦めします。

    param( 'charset', 'string', NULL );
    if ( ($charset != '') && function_exists('iconv') )
    {
    locale_temp_switch( get_bloginfo('locale', $blogparams) );
    $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 );
    locale_restore_previous();
    } elseif ( function_exists('mb_convert_encoding') )
    {
    if ( $charset == '' )
    {
    mb_language('Japanese');
    $charset = mb_detect_encoding( $title . $excerpt . $blog_name, 'ASCII,JIS,UTF-8,EUC-JP,SJIS');
    }
    locale_temp_switch( get_bloginfo('locale', $blogparams) );
    $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();
    }
    
  • 多言語で使う場合を考慮し、自動判別を行わないようにしたものです。多言語でブログを運用している場合のみ、こちらを使うようにしてください。

    param( 'charset', 'string', NULL );
    if ( $charset != '' )
    {
    locale_temp_switch( get_bloginfo('locale', $blogparams) );
    if ( 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') )
    {
    $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') )
    {
    mb_language('Japanese');
    $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行目(これは前述の変更を行う前の行数です)の、

    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)の13行目(スキンによって若干の違いがあることがあります)、

    // $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 address for this post

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

5 コメント, 2 trackbacks

コメント from: ケン@心斎橋 [訪問者] · http://blog.station.co.jp
こちらの修正版に沿って、修正しましたら、私自身のテストの結果
検索キーワード部分に関してもバッチリでした。

(実施したテストは、YAHOO.CO.JPで検索を実施し、自サイトを
 ヒットさせ、そのリンクをたどった結果が、文字化けしないかを
 試す・・というテストです)

あいがとうございます。

2005/03/15 @ 17:06
コメント from: Jun MUTO [メンバー] メール
うまくいきましたか。良かったです。
私は環境や設定の違いを考慮しきれなくて試行錯誤を繰り返しているような状態ですが、一先ずお役に立てたようでほっとしました。
2005/03/15 @ 17:33
コメント from: ケン@心斎橋 [訪問者] · http://blog.station.co.jp/index.php?blog=1&cat=118
こんにちは。

ピングを12サイトに打つようにスクリプトを、いじってみました。
どうでしょうか?

あと、例えば、GOOなどに直接送る場合、なにかいい方法はないでしょうか?
例えば「http://blog.goo.ne.jp/XMLRPC」ここあてに送る場合とか。

ではでは

2005/03/22 @ 18:51
コメント from: Jun MUTO [メンバー] メール
かなり有効そうな改造ですね。当サイトで紹介させていただきました。知らせていただいてありがとうございます。
(あ、pingやpingbackの表記は「ピング」ではなく「ピン」が適切だと、O泉大学光画部(驚愕新聞社) 編集長さんから指摘をいただきました。次のバージョンで直す予定なので、念頭に置いておいていただけると幸いです)

で、goo などのpingの件ですが、すみません、私にはちょっとわかりません。
_functions_pings.php に定義されているファンクションのうち、利用頻度の低いものを書き換えてしまうしかないかもしれません。

余談かもしれませんけど、ちょうど一ヶ月くらい前に、b2evoの開発者用メーリングリストで、ping送信をプラグインにしてしまおう(PHPがわかる人なら簡単に送信先を追加できるように)、という提案が出ていました。特に反対は出なかったようですが、今のところ作業を始めた方がいるわけでもないようで、次バージョンに入るかどうかは、難しいかなと思います。
2005/03/23 @ 20:59
コメント from: ケン@心斎橋 [訪問者] · http://blog.station.co.jp/index.php?blog=1&cat=118
コメント、記事、ありがとうございます。
アメリカの友人(一応、専門がコンピュータで大学院まで言った人)は、
ピングのグを弱~く発音してると思います。リナックスをライナックスと
言いますし、まぁ、日本でピンが常識なら、それに合わせましょうか。

本家フォーラムには「威勢のいい」発言あって、そのようなモジュールを
「アップするぞ」って書いてあるんですけど、そこで途切れています ^^;

いいスクリプトハッキングの情報があったら、是非、教えてください。

あまり実用的な話でないので・・・そのうち私のBLOGに書込みしますが・・
favicon.icoの件も、本家フォーラムにあったので、実施してみました。

IEのキャッシュが原因でスムースに作動しないので自分自身や自サイトの
常連さんに頼んでもうまく確認できないのがが面倒ですが、初めてのPCで
改めて訪ねてお気に入りに登録でIEでも有効です。(IEで始まった?はず
なのにMozilla系では何の問題もでないのが、なんか、若干滑稽な話です)

いつもありがとうございます。
ではでは
2005/03/24 @ 12:45
Trackback from: koノタワゴト [訪問者]
メンテ
改訂から1ヶ月も経ってしまったがcha-ki-shoさんのb2evolution 0.9.0.11 の日本語対応(改訂)を元に当方の環境も手直し。
ついでに年月などの表示もいじりました。

そういや久々にb2evolution...
2005/04/13 @ 23:08
Trackback from: Soft Blog @ Wolfy [訪問者]
被TBに成功。
やっとこっさとこ、被TBに成功しました。
わけのわからないsite5.comのサポートはさておき(現地深夜でしたので…)、結局Cha-Ki-Sho b2evolution 0.9.0.11 の日本語対応を参照して、そのままtr...
2005/08/02 @ 09:06

この投稿へのコメントは締め切られています。

2009年1月
 << <   > >>
        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 31

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

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

検索

最近の投稿

XMLフィード

powered by b2evolution

XREA.COM
ナップスター