| « 「著作権等管理事業法の施行状況等に関する意見募集」締切間近 | b2evoでの「Trackback の脆弱性」対策案 » |
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を、後から変更(escape を encodeURIComponent に置き換え)したほうが簡単かもしれません。楽だと思うほうでやってみてください)
通知メールについて、日本語限定の対処と、言語に限定されない対処を紹介します。(日本語しか使わないのであれば、「日本語限定の対処」を推奨します)
日本語限定でメール出力を奇麗にする対処方法です。携帯電話等で通知メールを受け取る場合はこちらでないと差し障りがあると思います。
/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 URL (right click and copy shortcut/link location)
/htsrv/trackback.php の修正部分の中で、if (!isset($charset)) $charset = mb_detect_encoding( $title . $excerpt . $blog_name, 'auto');
if (!isset($charset)) $charset = 'auto';
/htsrv/trackback.php の問題は、 !isset($charset) でした。私が isset() の動作を勘違いしていたのが原因です。