b2evolution 0.9.1 の日本語対応
b2evolution 0.9.1がリリースされました。最初のものにはバグがありましたので、2005年9月16日以降のものを使うようにしてください。(ファイル名が b2evolution-0.9.1b-2005-09-16.zip
であれば、9月16日に再リリースされた修正版です。すでに修正前の版をインストールしてしまっている場合は、/b2evocore/_blog_main.php
を新しいものに差し替えることで修正できます)
以前のバージョンからのアップグレード時には、/install/
フォルダ下の index.php
からデータベースのアップグレードを行う必要がありますので、忘れないようにしてください。
さて、それでは本題に行きます。
b2evolution の日本語対応に関するメモです。
(内容は「b2evolution 0.9.0.12 の日本語対応」とほぼ同じです)
b2evolution は適切な設定を選択すれば、そのままで使ってもそれなりに日本語が使えます。
しかし、ブックマークレット、文字セットの違うブログとのトラックバックやピンバック、コメント等があった際の通知メールの文字コード処理などで問題が発生する可能性があります。
さらに、こちらでは検証しておらず予想でしかありませんが、メールでブログに記事を投稿する機能を使う際に、MIMEデコード・文字コード変換処理が行われないのでおそらく正常に書き込めないと思います。これは、私は今のところ使う予定の無い機能ですので、どなたかが調査してくださると嬉しいです。
バージョン0.9.1について、私が行った対処を書いておきます。
他の環境でも通用するかは不明です。
(XREA.COM で使用する場合は、XREA.COM 特有の b2evolution 設定 も参照してください)
追記:コメント欄で知らせていただきましたが、Yasuo Ohgaki様が 日本語環境向けのパッチファイル を作ってくださいました。この記事を見ながら手作業で変更するのが面倒という方は多いと思いますので、どうぞ利用してみてください。http://wiki.ohgaki.net/index.php?b2evolution
注意事項:この後記述する変更点で、追加の際に示す目印となる行は区別の付けやすさで選んでいますので、追加する位置の指定は目印の前と後とが混在しています。ご注意ください。
- デフォルトのメッセージを日本語にする
-
インストールの際に、インストールページで最初に「Japanese (JP)」(日本語 (JP))のリンクを使って言語を日本語に指定しておくと、ブログやユーザのデフォルトの言語が日本語になり、後の設定が楽になりますので、「Japanese (JP)」(日本語 (JP))の選択を行ってください。
もし、インストール時に日本語(Japanese)以外の言語を指定していた場合、ブログ設定とユーザ設定の言語・地域設定(Locale)が「日本語」(Japanese)になっていないと思われます。
その状態では、日本語の投稿の書き込みがうまくいきませんので、管理画面の「ブログ」と「ユーザ」と「設定 : 地域」の3ヶ所でそれぞれ設定してください。 - 週の初めの曜日
-
カレンダー表示等で週の初めが月曜日になっているのを変更するには、
/conf/_locales.php
の324行目の$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
の1325行目の$headers[] = 'Content-Type: text/plain; charset='.$locales[ $current_locale ]['charset'];
という部分を、コメントアウト(行の先頭に
//
を付ける)して// $headers[] = 'Content-Type: text/plain; charset='.$locales[ $current_locale ]['charset'];
と変更します。
それから、
/b2evocore/_functions.php
の1345行目、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
の1345行目の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
の1331行目の$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
を導入します。/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";
に変更します。
次に、トラックバック受信に関してですが、文字セットの自動判別を行うほうが安心ではあるものの、PHPのマルチバイト関数(mbstring)の自動判別機能は、日本語以外の判別に関しては実用的ではありません。そのため、日本語限定で自動判別を用いる確実な対処と、自動判別は用いずに日本の一部で独自に導入されている追加パラメータにだけ対応して多言語での使用を考慮した対処の、二種類の対策を記載しておきます。
/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.'年'.$my_month; if( !empty( $my_day ) ) { // We also want to display a day $title .= $my_day.'日'; } if( !empty($w) && ($w>=0) ) // Note: week # can be 0 { // We also want to display a week number $title .= ', 第'.$w.'週'; } } 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,'年',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年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
の前、?>
の後)に余分な改行を入れないよう注意してください。
5 コメント, 2 トラックバック
トラックバック from: yohgaki's blog 訪問者
困ったなぁ b2evo Ver 0.9.1 "Dawn"
9月15日にバージョンアップした、be2evolution、早速、例のごとく、Jun MOTOさんのこのエントリーを参考にして、インストールして使っています。作者が言うとおり、動作も速くなって...
日本語環境専用の変更をパッチにしました。
http://wiki.ohgaki.net/index.php?b2evolution
コメント from: Jun MUTO メンバー
yohgaki様
ありがとうございました。記事のほうに追記という形で紹介させていただきました。
みんなが利用しやすいようにパッチを作る必要はあると思ってはいたのですが、Windowsユーザ向けにpatchの入手法や使い方を説明するのが面倒だとか、だからといってWindows用パッチファイルを別に作るのはもっと面倒だとか、横着なことを考えて何もしておりませんでした。
本当に助かりました。
コメント from: maverick 訪問者
b2evolutionをmysql 4.1.xで使いたいのですがmysql 4.1.xはマルチバイト文字を特殊な方法でいじるのでどうしても文字化けします。mysql 4.0.xなら問題なくインストールできるのです。どうすればいいかヒントはありませんでしょうか。
コメント from: Jun MUTO メンバー
maverick様
返事が遅くなりまして申し訳ありません。現在テストできる環境が無いので、曖昧な情報になってしまうのですが。
b2evolutionの公式サイトでの動作環境のページに、MySQL 4.1以降にはb2evolutionバージョン1.6以降で対応しているとの記述がありました。
http://b2evolution.net/man/2004/06/04/system_requirements
ただ、日本語で問題無いかどうかわかりませんし、b2evolution 1.6はアルファ版(動作テスト版)ですので、実際に使うサイトにいきなり使うのはお薦めしません。
遅くなった上に、役に立たない話で済みません。
コメント from: masken 訪問者
b2evolution 0.9.xをMySQL 4.1.xで使用するためには、MySQLクライアントのデフォルトの文字コードを、iso-8859-1にして使用する必要があります。
conf/locales.php
に、$dbcharset
という変数が記述されていますが、他では使用されていないものなので、変更しても意味はありません。
b2evolutionをアップグレード
このブログで使っているブログソフトのb2evolutionが9/16にアップデートされていました。基本的に早くなった、SPAM対策を向上したリリースのようです。
さっきアップグレードしました。�...