« 「著作権等管理事業法の施行状況等に関する意見募集」締切間近b2evoでの「Trackback の脆弱性」対策案 »

b2evolution 0.9.0.11 の日本語対応

2004/09/26 01:42 | 著者: Jun MUTO [mail] | カテゴリ: b2evolution

2005年3月14日追記:この記事の内容に改訂を行い、新たに記事「b2evolution 0.9.0.11 の日本語対応(改訂)」を書きました。今後は、改訂記事のほうをご覧ください。

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

ほぼ 0.9.0.10 の日本語対応 と同じです。行数が若干異なるところがあるだけで、わざわざ書くまでもないかと思いましたが、一応書いておきます。Webmaster日記 のNishizaka様からいただいたご指摘などから、「トラックバック」と「経由検索エンジンのキーワード」を変更しました。変更内容は私のコメントを参照してください。
10月20日追記:「トラックバック」部分を再度変更しました。

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

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

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

続き:

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

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

インストール・アップグレード処理や、ログイン画面・管理画面でのデフォルトの言語を日本語にするには、/conf/_locales.php の33行目、

$default_locale = 'en-EU';

$default_locale = 'ja-JP';

に変更します。 このデフォルト設定は、ウェブブラウザの設定のほうが優先されるので、うまく行かない時はウェブブラウザの言語設定(エンコード設定ではないので混同しないよう注意)と、b2evolution の管理画面の「設定」タブの地域設定での優先度を確認・調整してください。

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


週の初めの曜日

カレンダー表示等で週の初めが月曜日になっているのを変更するには、/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_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 == '' ) $charset = mb_detect_encoding( $title . $excerpt . $blog_name, 'auto');
    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行は外していただいても大丈夫だと思います)

追記:Nishizaka様にコメントでご指摘いただいた、日本語限定になりますが文字コードの自動判別も行う対策です。 前述の変更に加えて、この変更も行うことで、日本語に関しては検索キーワード表示の文字化けがほぼ無くなります。

/b2evocore/_functions_hitlogs.php の480行目、

$q = urldecode($param_parts[1]);

の後に、

if( locale_lang(false) == 'ja-JP' )
{
if ( function_exists('mb_convert_encoding') ) $q = mb_convert_encoding($q, 'UTF-8', 'auto');
}
else
{

を追加して、また、/b2evocore/_functions_hitlogs.php の486行目(この行数は前述の480行目の変更を加える前)、

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

の前に、

}

を追加してください。


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

海外のレンタルサーバなどでは、マルチバイト関数(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)

12 コメント, 4 trackbacks

コメント from: Nishizaka [訪問者]
改造情報ありがとうございます。しっかり参考にさせて頂きました。

こちらは「経由検索エンジンのキーワード」が、この改造でも日本語がきちんと出ないものがありまして

/b2evocore/_functions_hitlogs.php の460行目の

if( strpos( $q, 'テ' ) !== false )
を全てコメントアウトして

$q = mb_convert_encoding($q, "UTF-8", "auto");

を追加したら、殆どの日本語がきちんと表示されるようです。
2004/10/18 @ 19:26
Trackback from: Webmaster日記 [訪問者]
cha-ki-sho - b2evolution 0.9.0.11 の日本語対応
b2evolution の日本語対応に関するメモが結構詳しく書かれています。感謝!

----
追加改造情報:

/b2evocore/_functions_hitlogs.php の460行目の

if( strpos( $q, 'テ' ) !== false )
を全てコメントアウトし...
2004/10/18 @ 22:18
コメント from: Nishizaka [訪問者]
すみません。trackback の改造前に送信してしまいました。
削除してもらって構いませんので宜しくお願い致します。
2004/10/18 @ 22:21
コメント from: Jun MUTO [メンバー] メール
ありがとうございます。

検索キーワード部分は手を抜いてしまっていました。ご指摘ありがとうございました。
日本語限定(マルチバイト関数の 'auto' による自動判別の対象が日本語関連文字コードのみのため)ということで、追記しておきました。
日本語以外のブログでの問題回避のため、Nishizakaさんのコードよりちょっと複雑になってしまいましたが、やっていることは同じになります(と思います)。

また、ご要望通り、文字化けしたTrackbackは削除しておきました。

こちらで、改造前のb2evolutionから送られたTrackbackでも文字化けしないようにしていたつもりでしたが、生半可な知識でやっているため、うまく行かなかったようです。
ひとまず、他の日本語対応blogツール(WordPress MENucleus CMSの日本語版Trackbackプラグイン)のTrackback受信部分を参考にして、変更内容を変えてみました。
/htsrv/trackback.php の修正部分の中で、

if (!isset($charset)) $charset = mb_detect_encoding( $title . $excerpt . $blog_name, 'auto');

としていた部分を、

if (!isset($charset)) $charset = 'auto';

にしてみました。
多分これでいいと思うのですが…。
2004/10/19 @ 22:41
コメント from: Jun MUTO [メンバー] メール
昨日の今日で申し訳ありませんが、再度変更します。
/htsrv/trackback.php の問題は、 !isset($charset) でした。私が isset() の動作を勘違いしていたのが原因です。
記事の「トラックバック」部分を修正しておきました。
2004/10/20 @ 10:45
コメント from: Nishizaka [訪問者]
ども、ご返答有難う御座います。

どうも biosの再立ち上げの設定をしくじっているみたいでして。今、私の自宅サーバは台風の影響の停電で止まってしまっているみたいです。(笑)

早く帰って復旧させないと・・・。

その後に試してみますね。
国際化も考えて汎用的なパッチは嬉しいです。:)

そういえば、この修正情報って本家にも伝えてあるんでしょうか?

---
b2evolution を使っている所って少ないですねぇ~
インストールは簡単だしバージョンアップも凄く楽なんですけどね。もっと流行らせましょう。:)
2004/10/20 @ 20:16
コメント from: Jun MUTO [メンバー] メール
台風、Nishizakaさんのサイトを拝見しましたら、被害もあったそうで、大変でしたね。
(私の周囲は運良く被害はありませんでした。)


今のこの変更点は本家のほうには提案しにくいです。
ほとんどが日本語限定の対応で、日本語以外の場合に動作に支障が出ないように「おまじない」をかけている程度のものですので。

文字コード変換に使っている iconv か mb_convert_encoding がレンタルサーバでもっと一般的に使われていれば、また、mb_convert_encoding の自動判別が日本語以外にも対応していれば、他の言語に対応させるのも楽になりますから気楽に提案できるのですけど。
本家は本家で、西欧言語以外のことが考慮から抜けている場合も多々見られるので、日本語と西欧系しか考慮していない私のこの変更でも採用してくれるかもしれませんが、それでは後ろめたいというか自分の気持ちがすっきりしないところがあります。


広く普及させるには、Movable Type、Nucleus CMS、WordPress などの例に倣って、有志で「日本語版」を作って配布するのがいいのかな、と思います。
私は今のところ自分が使う機能しか触ってないので、今のこの変更だけで「日本語版」というのには不足があると思いますが、自分が使いたい機能を日本語対応してくれるパワーユーザが増えてくれば、「日本語版」作成も可能でしょう。
ユーザーが増えるのが先か、日本語版が出来るのが先か、鶏と卵みたいな話ですけど。
すごくやる気のある方が現われて、「日本語版」を作ってくれないかと、他力本願なことを願っています。

ここで、自分がやる、と手を挙げれないところが我ながら情けない…。

(長いコメントですみません)
2004/10/21 @ 23:25
コメント from: Nishizaka [訪問者]
最近、めちゃめちゃ忙しくてサイト改造で遊んでいる暇が無くて・・・、まだ試せてません。m(__)m

本家のサイトを眺めていたら、日本語版の協力者にお名前を発見。:)

ほんとお世話になってます。

今のままでも、日本語でインストール出来るし、国際化対応版として全然差し支えの無い出来だと思いますけどねぇ~。:)

此処に書いてある部分だけをパッチ的に当てれば完全対応と言っても良い状態と思いますよ。

私こそ英語が苦手なので、ちょっとした指摘しか出来なくて逆に申し訳ないです。
2004/10/27 @ 01:13
コメント from: Jun MUTO [メンバー] メール
試すのは、お時間のある時で構いませんよ。
私は気の向いた時にのんびりやってますので。
気がついたことがございましたら、どんどんご指摘ください。
英語で本家に報告する必要があるようなことは、私も英語が苦手ですので、もたついたり、ヘルプを求めたりするかもしれません。
2004/10/29 @ 23:49
Trackback from: O泉学園7年B組 [訪問者]
更なる日本語環境化
b2evolution はデフォルトでかなり日本語使えるんで問題は少ないけれど、bookmarklet で文字化けるし、どうやら検索ワードのところでも化けるらしいということで、cha-ki-sho さんの「投稿の詳...
2004/12/29 @ 20:32
Trackback from: cha-ki-sho [訪問者]
b2evolution 0.9.0.11以前にSQLインジェクションの脆弱性
b2evolution 0.9.0.11およびそれ以前のバージョンに、SQLインジェクション(不正なSQLクエリを外部から送り込まれることにより、データベース上に保管している設定を書き換えられたり、ユー...
2005/01/08 @ 22:06
Trackback from: koの戯言 [訪問者]
b2evolutionインストール
b2evolutionというblogツールをインストールしてみた。
あまり馴染みのないツールなのでとりあえずこちらのサイト参考にさせて頂き日本語環境を整理した。
私にとって未知の世界なので...
2005/01/21 @ 08:03
コメント from: ケン@心斎橋 [訪問者] · http://blog.station.co.jp
親切、丁寧な解説で、日本語化の参考にさせて戴きました。
貴重な情報をありがとうございます。

ただ、私の環境では、UTF-8グーグルはうまくいったのですが
YAHOO.co.jpとMSN.jpからのアクセスが、mbstring失敗の
エラーになります。(具体的には:mb_convert_encoding():
Unable to detect character encoding )Warningの
レベルなので、良いようなものですが、何とかならないものかと
Scriptを見ていますが、格納時が問題なのか??取り出し時か?
この記事にコメントを書き込めば、何か情報が得られるかと思い
記入したしだいです。

よろしく、お願いします。
2005/03/14 @ 10:16
コメント from: Jun MUTO [メンバー] メール
コメントいただきありがとうございます。お役に立つようなら、大変嬉しいです。

mb_convert_encoding(): Unable to detect character encoding エラーですが、サーバの設定に依存するエラーだと思われます。PHP-users MLの過去ログ「[PHP-users 21812]Re: mb_convert_encodingについて」によれば、php.ini で mbstring.language の設定が行われていない環境で、マルチバイト関数の文字セット自動判別機能を使用すると発生するようです。
エラーが発生する部分の前に mb_language('Japanese'); を指定することで、回避できるということです。

他にも気になっている部分がありましたので、改訂をして、新しく記事を作りました。「b2evolution 0.9.0.11 の日本語対応(改訂)」のほうをご覧ください。

すでに変更を行われたにも関わらず、再度の変更作業でお手数をおかけしますが、よろしくお願いします。
2005/03/14 @ 20:09
コメント from: ケン@心斎橋 [訪問者] · http://blog.station.co.jp
さっそくの書込み、ありがとう存じます。

ちょっと、ウチの環境を調べています。たぶん、サーバでのmbstringそのものは
アクティヴェイト済みですが、共有サーバなので他(複数言語で)のmbstringを
使用する可能性があって php.iniで日本語のみを固定的・明示的に宣言する事は
難しいかもしれません。この件は、これ以上投稿しても、当方の固有の設定の話で
皆さんに共通の話題ではないので・・・参考までに。

新しい改訂版を熟読してみます。改訂版による動作確認はレポート書込みします。

昨日の今日ですから、重ね重ね、ネットでの情報共有のありがたさを感じ、さらに
本サイトの執筆者に深い感謝をしています。私もしっかり努力して、できる範囲で
自然な形の貢献をしていきたいと改めて思った次第です。ありがとうございます。
2005/03/15 @ 15:01
コメント from: ケン@心斎橋 [訪問者] · http://blog.station.co.jp
こんにちは。

早速ですが、報告書込みします。

修正版(下記リンク)での
http://cha.s57.xrea.com/blogs/index.php/2005/03/14/p61
日本語対応方法に沿って、修正を実施しましたら、検索エンジンKeywordsの
文字化けが、解消されました。

ありがとうございました。
2005/03/15 @ 17:02

コメントを残す


あなたのメールアドレスはこのサイト上には公開されません

頂いたURLは表示されます。
(改行が自動で <br /> になります)
(Name, email & website)
(利用者がメッセージ・フォームを用いてあなたにメール送信することを許可します (あなたのメールアドレスは公開されません)。)
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フィード

free blog

XREA.COM
ナップスター