ここでは human-test と言う bbPress プラグインの日本語用ファイルを作ってみます。
はじめは単なる翻訳ファイルを作るだけ。と思っていたら、ちょっとしたプラグインの改造も必要でした。
ここではPoEdit を導入している前提で、PoEdit を使って言語ファイルを作成します。
翻訳ファイルを作成する
1) PoEdit を起動して「ファイル」→「新規カタログ」を選びます。
「情報」タブは以下のような感じで設定します。
※ human-test プラグインのソースコードは、UTF-8化しておきます。
私は秀丸ユーザーなので、秀丸で開いてUTF-8で保存しました。
2) 「パス」のタブを設定
「ベースのパス」の所は環境に依存したパスを設定します。
「パス」の部分は環境に依存しないパスを設定します。
この作法は必ずという訳ではありませんが、そういった管理ができるようにこのGUIが作られているようです。
このGUIは癖があって、「Enter」を押さないと入力項目が反映されません。
ですのでたまにOKボタンだけ押して、”入力したのに後で設定が反映されていない”という事がなれるまでよく起きるかもしれません。
3)「キーワード」の設定
WordPress や bbPress で使われているキーワードは、「_」か「__」だと思います。
これはたとえば以下のような部分の事を指しています。( )までは指定する必要はありません。
echo '<noscript><i>'.__("registration requires JavaScript").'</i></noscript>';
PoEdit は、(2)で指定したパスにあるソースファイルを検索して、自動でこのキーワードに指定した部分の文字列を拾ってきてくれます。
登録したキーワードは、以下のようなものです。
ここまでできたら後は「OK」を押して「プロジェクトの設定」画面を閉じます。
4)「カタログ」→「ソースから更新」を選択します。
※もし「ソースから更新」がグレイアウトしている場合は、2)のパスの設定がおかしい可能性が高いです。
「ソースから更新をすると」指定したパスのソースファイルから、キーワードで指定した語句と一致する翻訳対象を一覧してくれます。
後は右側の「対訳」の部分に日本語を入力して行きます。
TIPS1 - エラー
「ソースから更新」をした時に以下のエラーがでる事があります。
この「invalid multibyte sequense」のエラーは、既にファイルの中に直接日本語を打ち込んでしまっている場合に発生します。
たとえば、以下のような感じです。
$question=human_test_question();
echo '<p><script language="JavaScript" type="text/javascript">document.write("'.$question.'");</script>'; // write question with javascript
echo '<noscript><i>'.__("登録にはJavaScriptが必要です。").'</i></noscript>'; // warn no-script users既に手動でこうやって日本語に直してしまっているファイルが含まれている場合は、また英語に戻す必要があります。
TIPS2 - 便利な機能
リストされている語句がどういう文脈で使われているのか知りたい場合は、右クリックで該当のソースを表示させる事ができます。
5)作成したファイルを保存します。
「名前を付けて保存」で保存します。
名前の付け方もこのファイルがロードされるかどうかに関わってくるので、<プラグイン名>-ja のようにします。
bbPress (WordPress)は、言語ファイル名を内部的に <ドメイン名>-ja.mo という形で生成しています。<ドメイン名>は任意の名前を入れられますが、管理面を考えるとプラグイン名にするのが通常です。
保存すると、拡張子「.po」と「.mo」という2つのファイルができます。
ユーザーが編集するのが、.po ファイル。bbPress本体が読み込むのは .mo というファイルです。
保存場所は、後で指定すればよいだけなのでどこでもよいのですが、ここではプラグインファイルと同じ場所に保存しておきます。
プラグインを改造する
6)プラグイン側の国際化対応を行う
6-1) プラグインから .mo ファイルを読み込むようにする。
この作業は、plugin ファイルの中から load_plugin_textdomain( <ドメイン名>, <パス> ) という関数を呼び出す事で行われます。
human-test プラグインの場合は、human-test.php しかファイルが無いのでこれを開きます。
そうすると中に
add_action('bb_init', 'human_test_check',99);
という関数があるのでこれを利用します。これは、human_test_check という関数を ”bb_init” という初期化メッセージ?が飛んできた時に実行する命令です。(調べ物をしている途中でどこかで見たのですが、init 時に読み込まないといけないような事を書いてあったページがありました)
このbb_init 時に呼び出される human_test_check という関数の中に load_plugin_textdomain を仕込みます。
function human_test_check($override=false) {
global $bb_current_user, $bb_roles, $human_test; // グローバル変数
load_plugin_textdomain('human-test', dirname(plugin_basename(__FILE__))); // ・・・・(A)
・・・・・
bbPress の場合は bb_plugin_texdomain と言う関数もありますが、 load_plugin_textdomain を呼ぶとbb_plugin_texdomain が呼ばれるようにかかれているのでどちらでも大丈夫です。
load_plugin_textdomain(<ドメイン名>, <パス名> );
と第一引数に<ドメイン名>を引数に取りますが、<ドメイン名> には、プラグイン名を指定しておくのが無難というかお作法のようです。今回の場合 “human-test” がドメイン名です。
この<ドメイン名>が、言語ファイル(.mo ) のファイル名の先頭として使われます。<ドメイン名>-ja.mo と言うファイルを探しに行きます。<ドメイン名> とは、翻訳ファイルの”種別”みたいなイメージで考えればわかりやすいと思います。
また、(A) で load_plugin_textdomain の第二引数として渡している
dirname(plugin_basename(__FILE__))
の部分ですが、このプラグインの導入ディレクトリ名に展開されます。このディレクトリに。<ドメイン名>-ja.mo と言うファイルを探しに行きます。
なお、Web上には load_plugin_textdomain に引数を3つ渡す
load_plugin_textdomain('human-test',false, dirname(plugin_basename(__FILE__)));
がありますが、それは bbPress (最終リリース版)では使えませんでした。
ソースをのぞいてみると 引数3つ版が定義されておらず、引数3つ版を使い、2番目の引数を false にすると、パスが false (空) だと認識され .mo ファイルをデフォルトのパス (<導入ディレクトリ>\bb-plugins )に探しに行きます。
TIPS
いままで PHPのデバッグをしっかりやった事がなかったので、ログをどうやって吐かせる事ができるかすら、わかっていなかったが、以下のようにやると簡単にログを出せる。
やはりログを出すとデバッグ速度が違う。error_log($filename, 3, 'c:\temp\from_plugin.log');
6-2) 翻訳の対象ストリングの<ドメイン> を追記する。
多国語化対応していない場合、以下のような記述になっている事が多いと思います。
echo '<fieldset><legend>'.__("Please calculate to identify that you are human").'</legend><table width="100%"><tr class="required"><th scope="row" nowrap>';
これを以下のように何の翻訳ファイルを使うのかわかるように<ドメイン名>を付加します。
__( ) と言うのは何か特殊な記述だと思っていたのですが、これは function __( <引数1> , < 引数2> ) のように bbPress 内で定義されており、単なる関数でした。
私の環境の場合は、 bb-includes\functions.bb-l10n.php に以下の定義がありました。
function __( $text, $domain = 'default' ) {
return translate( $text, $domain ); // 結局 translate という別の関数を呼んでいる。記述に手間がかからないように __( ) でエイリアスしているみたいだ。
}
この第二引数として翻訳に使用する<ドメイン名>を渡してあげます。この作業を以下のようにすべての __( ) 関数に対して行います。
echo '<fieldset><legend>'.__("Please calculate to identify that you are human","human-test").'</legend><table width="100%"><tr class="required"><th scope="row" nowrap>';
ここまで作業するとプラグインが日本語化されているはずです。
できた・・・
今回は bbPress でしたが、基本的に WordPress でも同じ作業になるそうです(参考1) 。
感想
はじめてのプラグイン改造(とはいえないレベルですが・・)に挑んで、半日+翌日早朝起きの1時間で完了しました。PHPも経験が少なかったのでいろいろ勉強になりました。
human-test というプラグインがたった1個のファイルで構成されているのでわかりやすく助かった感じです。
bbPress のスタンドアローン版は、既にWordPress に統合されてしまったので、スタンドアローン版のbbPressは開発がストップしてしまっています。
でも個人的には、スタンドアローン版のbbPress 自体は基本的な機能が揃っていて十分だったのと、WordPress に統合をしない方が好みなので、これまで開発されてきたプラグインなどを有効に活用したいと思っています。
あと、bbPress がマイナーになっていけばスパムも減るだろう・・・という読みもあります。その分、新規機能は自分で開発する必要はありますけど・・・
以下のサイトを参考にさせて頂きました
参考1) bbPress translation, internationalization into local languages « bbPress Showcase
参考2) 翻訳ファイルを用意してプラグインを日本語化する | WordPressで企業ウェブサイト作成・商用ホームページ制作 WordPress Go Go