英語版の WordPress プラグインを日本語化する際のちょっとした小話(?)、小技エントリです。
日本語化には2つあって、ひとつはマルチバイト文字で動作させると不具合が出る場合のプログラムの修正。 もうひとつは、管理画面等のメッセージの日本語化です。 ここでは、後者のメッセージの日本語化について書きます。
WordPress では、gettext による言語カタログがサポートされており、メッセージの国際化が簡単にできるようになっています。
このようなソフトウェアの国際化のことを、
I18n
I18nはinternationalizationを省略した記述法。ジャーゴン。
あいいちはちえぬ、インターナショナリゼーション、国際化と読む。
internationalizationの意味は国際化。転じてオープンソースのプログラムでは多言語・多国語対応の意味。
例: 今回のバージョンからi18nに対応しました。
i18nの18は、internationalizationの先頭のiと語尾のnの間に”nternationalizatio”の18文字があることに帰因する。18ヶ国語に対応しているわけではない。
といいます。
・・・そうなんです、昨日リリースした、WP-Cache 日本語パッチの
wp-cache_l18n-1.0.zip
ファイル名をよーくみると・・・。 i (アイ)じゃなくて、、l (エル)にしちゃいました。 わはは、間違えました。 という懺悔のエントリ・・・。 実は、l10n (地域化 – localization)という別な言葉もあってそれとまぜこぜになった次第です。 ごめんなさい。。(ちなみに、ファイル名だけなので動作には問題はないです)
たぶん、言語ファイル取り替えれば 他言語にも対応できるので、i18n でいいと思うのですが、もしかしたら、l10n なのかな・・・。 詳しい方教えてください。 🙂
懺悔としまして(?) WP プラグインの i18n 化の方法を紹介します。
詳しいやり方は、
WordPress Japan – プラグインを日本語で
イキナリでは少し難しいとは思いますが、ここでは日本の WordPress ユーザーも多く利用されている wp-amazon を例にとって簡単に解説させていただきます。
に otsukare さんが書かれています。 非常に分かりやすく、ぼくもこちらを参考にやっています。
このエントリには、ちょっとした小技を書きたいと思います。
■ load_plugin_textdomain($domain) の小技
WP のプラグインは wp-content/plugin/ ディレクトリの下に格納することになっています。 前にも書きましたが、実はこのディレクトリの直下に .php を配置せずにさらにディレクトリ内に .php をいれても WP はちゃんとプラグインを認識してくれます。
特に言語ファイルで多国語化すると多くのファイルが出来ため、ディレクトリにプラグインファイルを格納できると便利なのですが、言語ファイルを読み込ませる load_plugin_textdomain 関数に不具合があって、ディレクトリにプラグインを格納すると言語ファイルをうまく読んでくれません。(wp-content/plugins/ 直下しか検索にいってくれない)
この問題は、
load_plugin_textdomain() should accept variable paths
Currently, the load_plugin_textdomain() function is hardcoded to look under [ABSPATH . “wp-content/plugins/”] for a plugin’s translation file. It should take an optional argument specifying the location of this file, such as wp-content/plugins/plugin-name/translations/ and so on.
ということで、WP 1.6 系では修正されるようです。 で、今のことろ回避策として load_plugin_textdomain することろを次のように書くと回避できます。
- $domain_name = 'ドメイン名';
- $locale_name = get_locale();
- $mofile_name = dirname(__FILE__);
- $mofile_name .= "/$domain_name-$locale_name.mo";
- load_textdomain("$domain_name", $mofile_name);
■メッセージの __ 関数 _e 関数 でのくくりだし Tips
プラグインの日本語化の基本は、元プラグインのハードコードされているメッセージを見つけて、__ 関数や _e 関数でくくり、その ID を言語ファイルに対応させ日本語に変換して出力します。
たとえば、
- echo "Hello,I'm hiromasa.How are you."
であれば、
- echo __("Hello,I'm hiromasa.How are you." ,"ドメイン");
として、.po 言語ファイルで
- msgid "Hello,I'm hiromasa.How are you."
- msgstr "こんにちは。 ぼくはひろまさだよ。元気?"
とかって指定するわけです。 で、ちょっと困るのが次のようになっている場合。
- $name = "hiromasa";
- echo "Hello, I'm $name. How are you.";
変数がメッセージに入っているときです。 これを単純に、
- echo __("Hello, I'm $name. How are you.", "ドメイン名");
としてしまうと、先に $name が PHP によって “hiromasa” に展開されてしまうため言語ファイル側で
- msgid "Hello, I'm $name. How are you. "
- msgstr "こんにちは。私は $name です。ご機嫌いかがですか。"
としても、うまく検索にあたってくれず日本語が出力されません。(”Hello, I’m hiromasa. How are you” という ID で言語ファイルを検索してしまう)
- echo __("Hello, I'm") . $name . __(". How are you.");
なんてしても良いですが、メッセージファイルとしていまいちですし、ちょっと面倒なので次のようにするといいでしょう。
PHP の sprintf という関数を使って変数を 固定文字の %s としてくくり出し、msgid も %s を使って登録します。
- $name = "hiromasa";
- echo
- sprintf(
- __("Hello, I'm %s. How are you. ", "ドメイン"),
- $name
- );
- msgid "Hello, I'm %s. How are you."
- msgstr "こんにちは。私は %s です。ご機嫌いかがですか。"
なにか数学やっているみたいですね。 🙂
このようにすると、メッセージID を固定の %s という文字で登録できるので不具合が出ませんし、メッセージも分かりやすくプログラムの書き換えが簡単です。
—
以上、簡単ながら小技紹介でした。 ご参考になれば幸いです。 😛