b2evolution 0.9.2がリリースされました。
b2evolution の日本語対応に関するメモです。
以前のものから細かい変更を加えましたので、テストが不十分な部分があります。問題が起こるようでしたら報せてください。
b2evolution は適切な設定を選択すれば、そのままで使ってもそれなりに日本語が使えます。
しかし、ブックマークレット、文字セットの違うブログとのトラックバック送受信、コメント等があった際の通知メールの文字コード処理などで問題が発生する可能性があります。
さらに、メールでブログに記事を投稿する機能を使う際に、MIMEデコード・文字コード変換処理が行われないのでおそらく正常に書き込めないと思います。これは、私は今のところ使う予定の無い機能ですので、どなたかが調査してくださると嬉しいです。
バージョン0.9.2について、私が行った対処を書いておきます。
他の環境でも通用するかは不明です。
(XREA.COM で使用する場合は、XREA.COM 特有の b2evolution 設定 も参照してください)
(2006年5月20日追記:パッチファイルを作成しました)
(2006年5月20日21時58分追記:「トラックバック」のトラックバック送信部分を変更しました)
注意事項:この後記述する変更点で、追加の際に示す目印となる行は区別の付けやすさで選んでいますので、追加する位置の指定は目印の前と後とが混在しています。ご注意ください。
- デフォルトのメッセージを日本語にする
-
インストールの際に、インストールページで最初に「Japanese (JP)」(日本語 (JP))のリンクを使って言語を日本語に指定しておくと、ブログやユーザのデフォルトの言語が日本語になり、後の設定が楽になりますので、「Japanese (JP)」(日本語 (JP))の選択を行ってください。
もし、インストール時に日本語(Japanese)以外の言語を指定していた場合、ブログ設定とユーザ設定の言語・地域設定(Locale)が「日本語」(Japanese)になっていないと思われます。
その状態では、日本語の投稿の書き込みがうまくいきませんので、管理画面の「ブログ」と「ユーザ」の2ヶ所でそれぞれ設定してください。
(また、過去に管理画面の「設定 : 地域」で設定を変更していた場合、「設定 : 地域」ページの下のほうに「デフォルトにリセット (データベース テーブルを削除)」リンクが表示されています。この状態では /conf/_locales.php
の更新が反映されませんので、「デフォルトにリセット (データベース テーブルを削除)」でリセットを行ってください。なお、通常の使い方では「設定 : 地域」の設定を変更する必要はありませんので、リセット後はデフォルトそのままにしておいてください)
- HTMLチェッカーの文字コード変換の問題
-
記事やコメントなどを投稿する際に、エラーが表示され、そのエラーメッセージの内容が文字化けしている場合があります。これは、内部文字エンコーディングの設定がうまくいっていないことが原因です。
(注意:対症療法的なやり方をしていますので、この対策を行うと、逆にエラーが出る等の問題を起こす可能性もあります。問題が起こった際は、変更した部分を元に戻してください)
/b2evocore/_class_htmlchecker.php
の115行目の、
$xhtml = mb_convert_encoding( $xhtml, 'UTF-8' );
の前に
mb_internal_encoding( locale_charset(false) );
という1行を追加します。
- 週の初めの曜日
-
カレンダー表示等で週の初めが月曜日になっているのを変更するには、/conf/_locales.php
の359行目の
の数字を変更します。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
の1334行目の
$headers[] = 'Content-Type: text/plain; charset='.$locales[ $current_locale ]['charset'];
という部分を、コメントアウト(行の先頭に //
を付ける)して
// $headers[] = 'Content-Type: text/plain; charset='.$locales[ $current_locale ]['charset'];
と変更します。
それから、/b2evocore/_functions.php
の1354行目、
return @mail( $to, $subject, $message, $headerstring );
を
$message = str_replace("\r\n", "\n", $message);
mb_language('Japanese');
mb_detect_order( $locales[ $current_locale ]['charset'] );
return @mb_send_mail( $to, $subject, $message, $headerstring );
に変更します。
-
言語汎用の対処方法です。メールの受信環境によっては問題が出る可能性もあります。多言語でブログを運用している場合のみ、こちらを使うようにしてください。
/b2evocore/_functions.php
の1354行目の
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
の1340行目の
$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
を導入します。加えて、トラックバックの次期仕様(Trackback Working Group)にて議論されている、トラックバックの仕様 TrackBack Technical Specification Version 1.2 で導入された、POSTリクエスト・ヘッダへの 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";
に変更します。同じく、/b2evocore/_functions_trackback.php
の94行目(これは前述の変更を行う前の行数です。変更後なら95行目)の
$http_request .= 'Content-Type: application/x-www-form-urlencoded'."\r\n";
を
$http_request .= 'Content-Type: application/x-www-form-urlencoded; charset='.$charset."\r\n";
に変更します。
次に、トラックバック受信に関してですが、文字セットの自動判別を行うほうが安心ではあるものの、PHPのマルチバイト関数(mbstring)の自動判別機能は、日本語以外の判別に関しては実用的ではありません。そのため、日本語の場合のみ自動判別を用いるようにしておきます。
/htsrv/trackback.php
の49行目の
$title = strip_tags($title);
の前に、
param( 'charset', 'string', NULL );
if ( ($_SERVER['CONTENT_TYPE'] != '') && ($charset == '') )
{
$request_header_content_type = array();
preg_match( '/;[ \r\n\t]*charset="?([A-Za-z0-9_\-]+)/i', $_SERVER['CONTENT_TYPE'], $request_header_content_type );
if ( $request_header_content_type[1] != '' )
$charset = $request_header_content_type[1];
}
locale_temp_switch( get_bloginfo('locale', $blogparams) );
if ( ($charset != '') && 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') )
{
if ( ($charset == '') && ( locale_lang(false) == 'ja-JP') )
{
$charset = mb_detect_encoding( $title . $excerpt . $blog_name, 'ASCII,JIS,UTF-8,EUC-JP,SJIS');
}
if ( $charset != '' )
{
$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 ) )
に変更します。
- 年月などの表示
-
日毎表示のタイトル部分、アーカイブ一覧の年月表示、カレンダーの年月表示では、日本語で一般的な語順でなく、「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行目(これは前述の変更を行う前の行数です。変更後なら91行目)の、
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
の前、?>
の後)に余分な改行を入れないよう注意してください。
初めまして。
先日v.0.9.2にあげたのですが途中でおかしくなり、何度かバックアップを入れ直しましたが、今日本語では書けるのですが、テンプレートが化けてしまい元にもどりません。3日間、修復についやして今ここにたどり着きました。もう一度上から詳しく読んで明後日に試してみます。