[PR] 本ブログの商品紹介リンクには広告が含まれています
このサイトで使用している
NucleusというBlogシステムを日本語対応させる備忘録です。
このシステム、そのまま使っても基本的な機能は日本語OKなのですが、細かい不具合がないわけではありませんので、それにどう対処するかなどのメモです。これからNucleusをお使いになる方の参考になれば。
[追記:現在では、このメモの内容など、ボランティアのみなさんが行った日本語化対応を施してある日本語版パッケージが配布されています(
Nucleus日本語公式サイト)ので、それを使えばこの作業は必要ありませんが、日本語パッケージの中身はどういうことをやっているのかにご興味がある方は参考にしてください。]
なお、
・PHPが使える環境がある(できればPHPはマルチバイト対応)
・MySQLサーバが使える環境がある
・PHPプログラムのテキストファイルを編集できる
という方を対象にしています。あしからず。
このメモで使用しているNucleusのバージョンは2.0、Webサイトの表示文字コードとPHPの内部文字コードは、いずれもEUC-JPを使っていることを前提にしています。
このメモは随時追記、更新していきます。また、みなさんからの「わからんぞ」「うまくいかない」といったコメントも歓迎です。ある程度まとまったところで、オリジナルのコードを修正してもらえる部分は修正を依頼しようと思います
■Nucleusをインストールする
まず、Nucleusをダウンロードして、マニュアルにしたがってインストールします。
手順をかいつまんで説明すると
・ファイルを展開し、ディレクトリ構造を保ったままWebサーバーのドキュメントルート以下のどこかのディレクトリにアップロードする
・ディレクトリやファイルのパーミッションを設定する
・インストールスクリプトのURLをブラウザから開き、データベースにアクセスするための情報やファイルパスなどを設定する
という順序です。
マニュアルを
xx.nakahara21.netのまみおさんが日本語に翻訳してくださったものが日本語公式サイトにあります。
http://japan.nucleuscms.org/documentation/
■日本語ランゲージファイルをインストールする
メニューなどの文字を日本語にするためのファイルをダウンロードして、展開し、nucleus/languagesディレクトリに置きます。Shift JIS、EUC、UTF-8用にそれぞれ別のファイルが用意されていますので、自分のサイトで使っている表示用文字コードと同じものを使います。インストール後、管理画面でDefault Languageをjapanese-なんとか(なんとかの部分は文字コード名)に変更すれば、管理画面などが日本語で表示されるようになります。
chrome さん作の日本語ランゲージファイルをベースに未翻訳の部分を追加で翻訳し、Version 2.5で追加された用語を足したものが
本家nucleus.orgサイトからダウンロードできます。
同じものが
ここからもダウンロードできます。
■表示されるページの文字コードやlocale(言語環境・地域情報)を設定し、固定の文字列を翻訳する
Nucleusでは、ページのデザインをテンプレートとスキンを使って組み立てます。
テンプレートはページを構成する部品です。例えば、記事一覧のリスト、記事本文、コメント文といった部品のひとつひとつになにをどういう順番で表示するかがテンプレートとして定義されています。
スキンはページ全体のデザインで、スキンの中にテンプレートで定義した部品を組み込んでページを完成させます。
このテンプレートとスキンを編集してページの中の文字やページ全体のデザインをカスタマイズします。
Admin Area(管理画面)から[Nucleusの管理...]をクリックするとテンプレートとスキンを編集する画面へのリンクが表示されます。
・スキンの編集
ナビゲーションのメニューなど、画面上の固定の文字がbaseのスキンの中に書かれていますので、これを日本語に翻訳します。
また、RSSフィードの文字コードを設定するために、xmlrssとxmlrss2の中のMain Indexの[編集]を選んで、最初の行を
<?xml version="1.0" encoding="ISO-8859-1"?>
から
<?xml version="1.0" encoding="euc-jp"?>
に変更します。また、
<language>en-us</language>
を
<language>ja-jp</language>
に変更します。
・テンプレートの編集
まず、defaultとdetailedの各テンプレートのLocaleをenからja_JP.EUCに変更します。
この変更を行うと、今までたとえば“14 July”と表示されていたところが突然“14 7月”などとおかしな表示になります。これを修正するには、テンプレートの中の語順などを書き換える必要があります。上の例の“14 July”と表示されていたところは、テンプレート上では“%d %B”となっていた部分。%dが日付の数字だけを表示する記号で、%Bが月の名前を表示する記号です。これを、例えば“%m/%d”と書き換えると“07/14”となるし、“%B%d日”とすれば“7月14日”と表示されます。この「%なんとか」の記号はstrftime関数で使われているものそのものです。くわしくは
PHPのマニュアルや
opengroup.orgのマニュアルを参照してください。
そのほか、固定文字の翻訳や語順の変更を行います。
上記の変更を施したスキンとテンプレートのファイルをWebで公開しています。まだ自分でスキンやテンプレートをいじっていなくて、これから新しくインストールするという方はこれをそのままImportすれば、上記の変更作業はいりません。
Importするには、スキンの編集画面の下のほうにある[スキンのImport/Export...]機能を使います。
Importする際にローカルファイルではなくURLを指定するようにし、
http://www.higuchi.com/downloads/skindata-eucjp.xml (内部コードがEUC-JP)
http://www.higuchi.com/downloads/skindata-sjis.xml (内部コードがShift JIS)
http://www.higuchi.com/downloads/skindata-utf8.xml (内部コードがUTF-8)
のいずれかを入力します。スキンとテンプレートの名前がぶつかるという意味のエラーが出ます。上書きしてもかまわないときは上書きするチェックボックスにチェックをつけて、今使っているスキンやテンプレートの設定を残したいときはチェックをつけずにImportします。
システムによってはLocale名が通用しない場合があるかもしれません。その場合はテンプレートの編集画面を一つ一つ開いて、各テンプレートのLocaleをお使いのシステムに合ったものに書き換えてください。
表示用文字コードと内部文字コードが違う設定になっているシステムをお使いの場合は、内部文字コードに合ったファイルをインポートして、それぞれのテンプレートの中にあるHTTPヘッダー部分のcharsetを表示文字コードに合わせて書き直してください。
※注意※ 上書きでImportすると、それまでご自分で行った変更もすべて元に戻ってしまいますので、くれぐれもご注意ください。また、このスキンとテンプレートはまだ十分テストされていません。いろいろ不具合があるかもしれません。ご了承ください。
■globalfunctions.php のパッチ
・カテゴリ名に日本語が使えるようにする
カテゴリ名にアルファベット、半角スペース、数字しか使えないようになっているので、日本語の文字コードも通るようにするためのパッチを当てます。
チェックを甘くして、文字数が1文字以上ならいつもTrueを返すというのでもOKかもしれません。
512行目:isValidCategoryName関数全体を差し替え
function isValidCategoryName($name) {
return eregi('^[a-z0-9]+[a-z0-9 ]*[a-z0-9]+$', $name);
}
を次のように変更します(ただし、これは内部文字コードがEUCの場合しか動きません)。
function isValidCategoryName($name) {
$ascii = '[\x00-\x7F]'; # 1バイト EUC-JP文字
$twoBytes = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2バイト EUC-JP文字
$threeBytes = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト EUC-JP文字
$character = "(?:$ascii|$twoBytes|$threeBytes)"; # EUC-JP文字
return preg_match("/^$character+$/", $name);
}
なお、同じことを実現するのに、カテゴリ名はASCII文字だけで指定して、カテゴリの内容(Description)を表示するプラグインを使う、という方法もあります。このほうがエレガントかもしれません。くわしくは
まみおさんのご説明を。
・文字列の後ろをちょん切る関数の修正
長い文字列を指定の長さで切る関数がありますが、これがシングルバイト文字前提で作られているので、日本語などダブルバイト文字列では文字化けします。これを修正するパッチ。
550行目:shorten関数の中 //2. Actual Shortening の下
if (strlen($text) > $maxlength)
$text = substr($text,0,$maxlength-strlen($toadd)) . $toadd;
を次のように変更します。
$text = mb_strimwidth($text, 0, $maxlength, $toadd);
マルチバイト対応でないPHPの場合は次のような感じでもたぶんOK(ただし、EUCの場合のみ)。
if (strlen($text) > $maxlength) {
$text = substr($text,0,$maxlength-strlen($toadd));
while (ord($text[-1]) == 0x8F || preg_match_all("/[\x8E\xA1-\xFE]/", $text, $tmp) % 2) {
$text = substr($text,0,strlen($text)-1);
}
$text .= $toadd;
}
・<%archivetype%>変数の表示翻訳
スキンやテンプレートの中で使う<%archivetype%>という変数があります。これは、例えばアーカイブ一覧のページのメニューのスキンで“次の<%archivetype%>”と書いておくと、表示しているアーカイブ一覧の種類によって“次の日”とか“次の月”というように表示を変えるために使うのですが、この“日”と“月”に相当する文字がプログラムの中に埋め込まれているため、ランゲージファイルを翻訳してもここだけ“day”、“month”と英語で表示されてしまいます。これを修正します。なお、将来はこの文字をランゲージファイルに収めるようにする予定のようです(TODOと書いてある)。
400行目付近:
$archivetype = 'day'; と $archivetype = 'month'; という部分を探して、それぞれ $archivetype = '日'; と $archivetype = '月'; に修正する。
■BLOG.phpのパッチ
・イメージポップアップウィンドウの文字化け修正
この修正は
開発者に報告済み、すでにCVSには反映されていますので、次のリリースでは治っているはずです。
1170行目:
$vars['rawpopuplink'] = $CONF['Self'] . "?imagepopup=" . htmlspecialchars($filename) . "&width=$width&height=$height&imagetext=" . htmlspecialchars($text);
を次のように変更します。
$vars['rawpopuplink'] = $CONF['Self'] . "?imagepopup=" . htmlspecialchars($filename) . "&width=$width&height=$height&imagetext=" . urlencode(htmlspecialchars($text));
■NOTIFICATION.phpのパッチ
・コメントが投稿された際などの通知メールの文字コード修正
49行目:
@mail($address, $title, $message , "From: ". $from . "\nContent-Type: text/plain; charset=iso-8859-1");
を次のように変更
@mb_send_mail($address, $title, $message , "From: ". $from . "\nContent-Type: text/plain; charset=ISO-2022-JP");
php.iniの中に
mbstring.func_overload = 1
などと奇数の数字が指定してあれば、@mb_send_mailの部分は@mailのままでもOK。
Coming soon: プラグインの日本語化
catさんのコメント:
うちでは(おそらく)mb_strimwidthが変な動作を起こしたようで画面中央にセレクトボックスが現れる怪奇現象が起こったこと以外はスムーズにいけました^^;
(内部処理エンコードの設定を入れればうまくいくかも。)