b2evolution 0.9.0.12 の日本語対応
b2evolution の日本語対応に関するメモ。
(内容は「b2evolution 0.9.0.11 の日本語対応(改訂)」とほぼ同じです)
b2evolution は適切な設定を選択すれば、そのままで使ってもそれなりに日本語が使えます。
しかし、ブックマークレット、文字セットの違うブログとのトラックバックやピンバック、コメント等があった際の通知メールの文字コード処理などで問題が発生する可能性があります。
さらに、こちらでは検証しておらず予想でしかありませんが、メールでブログに記事を投稿する機能を使う際に、MIMEデコード・文字コード変換処理が行われないのでおそらく正常に書き込めないと思います。これは、私は今のところ使う予定の無い機能ですので、どなたかが調査してくださると嬉しいです。
バージョン0.9.0.12について、私が行った対処を書いておきます。
他の環境でも通用するかは不明です。
(XREA.COM で使用する場合は、XREA.COM 特有の 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
の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.'年'.$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
の前、?>
の後)に余分な改行を入れないよう注意してください。
2 コメント, 1 トラックバック
こんにちは、
日本語の文字化けがなおりませんので、どこでヘルプをいただけるでしょうか。
よろしくお願いいたします。
Localeの設定したはずですが、こんな問題はじめてです。
なおりました。なぜか、localeの日本語ファイル自体が文字化けしていました。再度アップロードしました。:)
b2evolution 0.9.0.12 "Amsterdam" リリース!
久しぶりであります。ほんとに久しぶりに、ココで使っている、b2evolutionがバージョンアップしました。昨日まで使ってた「0.9.0.10 "Copenhagen"」と、今回の「0.9.0.12 "Amsterdam"」との間に「0....