WordPressの便利なところはプラグインによる拡張性だが、多くのプラグインが英語で提供されている。英語のままでも別に問題はないのだが、企業サイト、商用ホームページを作成するにあたって、クライアントが直接触れるようなところはなるべく日本語化しておきたいところだ。また、顧客の要望に応じたプラグインを作成する必要性が生じた際に初めから国際化できるように対応しておくと有益なプラグインができた時に公開することもできるだろう。
プラグインの国際化(ローカライズ)、翻訳はどのようにして行えばいいのだろうか。WordPressの翻訳については、本家サイトのTranslating WordPress « WordPress Codexに詳しく書かれているので一度見ていただきたいが、翻訳に際して、大きく2つのステップがあることがわかる。
- プログラムの開発者が国際化対応のコードを書く
- 翻訳リソースファイルを編集して翻訳する
WordPressの翻訳の仕組み
WordPressの国際化は、gettextを用いている。gettextについては、PHPでメッセージカタログはgettextしかありえないでしょ(何故gettextか?編)あたりを読んでいただけるといいと思うが、要は多言語化するためのライブラリとコマンドのことである。仕組みとしてはこうである。プログラムのコードから、メッセージカタログである翻訳リソースファイル(.poファイル)を作成し、それを各言語用に翻訳し、バイナリファイル(.moファイル)を生成し読み込むのである。
国際化対応のコードとは?
実際にインストールしてあるプラグインのソースコードを見てみてほしい。国際化に対応してあるプラグインはたいていソースのはじめに下記のようなコードがあるはずだ。
load_plugin_textdomain('cforms');
これは複雑なお問い合わせフォームを作成するプラグイン cforms II
で紹介したcforms IIのコードである。この関数を読み込むと、__()と_e()で囲まれた部分が自動的に翻訳対象となる仕組みである。ちなみにこの関数は第一引数に任意のドメイン(通常はプラグイン名か)を、第二引数に翻訳ファイル(.moファイル)を読み込むディレクトリを指定できる。デフォルトではプラグインディレクトリのwp-content/pluginsとなっているので、このcforms IIの翻訳ファイルはwp-content/pluginsにアップロードしなくてはいけない。
load_plugin_textdomain('cforms','wp-content/plugins/contactforms');
このようにディレクトリを指定すると、翻訳ファイルの位置が変わる。余談だが、多くのプラグインはディレクトリ構造を持っており、wp-content/pluginsにディレクトリごとアップロードする仕組みだ。このcformsのように翻訳ファイルの位置がプラグインディレクトリの直下にある(つまりcforms II本体はwp-content/plugins/contactformsなのにcforms-ja.moはwp-content/pluginsにあるということ)となんだか気持ち悪い気がするのだが、まぁ、好みの違いか。
翻訳対象となる関数 __()と_e()
さて、翻訳対象となる関数が2つ用意されている。__()と_e()である。どちらも翻訳するメッセージを引数にとるが、違いは翻訳されたメッセージをreturnで返すか、echoで返すかの違いである。第1引数に翻訳するメッセージを、第2引数にload_plugin_textdomain()で指定したドメインを代入する。ドメインを指定しない場合はWordPress本体の翻訳ファイルを参照するようになるので忘れずに指定したい。
- __($message, $domain)
- 翻訳された$messageをreturnで返す
- _e($message, $domain)
- 翻訳された$messageをechoで返す
例文を見てみよう。
$message = __('This is an example.', 'wordpressgogo'); _e('This is an example.', 'wordpressgogo');
上の__()は$messageに値を代入するのに対し、_e()はメッセージを出力するコードである。そのため、以下のコードは同じことだ(冗長的だけど)。
_e('This is an example.', 'wordpressgogo'); echo __('This is an example.', 'wordpressgogo');
ちなみに動的な値を翻訳する場合はどうすればよいのだろうか。sprintf()を利用すると変数を$message内に含ませることができる。下記のような感じだ。
$name1 = 'WordPress'; $name2 = 'Go Go'; echo sprintf(__('I am %s.','wordpressgogo'), $name); // 1つの時 echo sprintf(__('I am %1$s %2$s.', 'wordpressgogo'), $name1, $name2); // 2つ以上の時
gettextの翻訳関連ファイル
gettextの翻訳関連ファイルは3つある。プラグインを翻訳するには、.potファイルが用意されている場合は、各言語用に.poファイルを編集し、.moファイルを作成する。.potファイルがない場合はソースコードから.potファイルを生成することになる。
- POT (Portable Object Template)
- ソースコードの中から先ほどの__()と_e()のメッセージをすべて抽出した翻訳リソースのもとになるファイルだ。実質的には.poファイルと同じだと思うが、元の翻訳リソースファイルとして.potファイルといわれる。ちなみに.potはPowerPointのテンプレートファイルと同じ拡張子である。
- PO (Portable Object)
- 上の.potファイルをもとに各言語に翻訳したものが.poファイルである。
- MO (Machine Object)
- その名の通り、.poファイルを機械が効率よく読み込めるようにしたバイナリファイルが.moファイルである。
実際に翻訳するには?
さて、実際に翻訳するには翻訳ファイルを編集できるツールを使う必要がある。広く紹介されているのがpoEditというエディタでWindows、Mac OS X、Linuxに対応している。現在の最新バージョンは1.3.9のようだ。インストールの仕方や使い方は、お問い合わせフォームを簡単に作成するプラグイン Contact Form 7で取り上げたプラグインの開発者のmiyoshiさんが、poEdit で翻訳ファイルを作る « iDeasiloで詳しく解説してくださっているのでそちらを参照してほしい。ここでは簡単に流れだけを追っておく。
- poEditをダウンロードし、インストールする
- .potファイルもしくは.poファイルをpoEditで開く
- 翻訳する
- 保存する(自動的に.moファイルが生成されるはず)
- できた.moファイルをload_plugin_textdomain()で指定されたディレクトリにアップロードする
以上の流れで、プラグインの翻訳が完成するはずである。poEditは使い方に少し癖がある気がするのでmiyoshiさんの解説をしっかり読んだ方がいいかもしれない。
翻訳ファイル.moファイルのファイル名
さて、最後に注意しておかなければならないのが、翻訳ファイル.moのファイル名についてだ。このファイル名がきちんと設定されていないと翻訳がうまくいかない。ファイル名の規則としては、load_plugin_textdomain()で指定した{ドメイン}-{ロケール}.moとなる。ロケールの確認方法は、wp-config.phpの下記の部分。
define ('WPLANG', 'ja');
おそらく’ja’となっているはずだ。そのため、上記のcforms IIの場合だと、ドメインがcforms、ロケールがjaなので、cforms-ja.moとなる。間違えないようにしたい。
テーマファイルの翻訳
上記まではプラグインの翻訳を中心に見てきたが、テーマファイルの翻訳も可能である。しかしながら、国際化対応されたテーマファイルは多くないかもしれない。テーマファイルの翻訳にはまず、load_theme_textdomain()を読み込んでおく必要がある。通常はfunctions.phpで呼び出される。引数は1つだけで、ドメインを指定するのみである。翻訳ファイルの位置は自動的にテーマディレクトリの中(wp-content/themes/theme-name)となる。また、翻訳ファイル.moファイルの名前は、{ロケール}.moと決まっており、上記の例だと、ja.moとなる。テーマファイルも翻訳できるということを知っておくといいだろう。
最後に
さて、長々とプラグインの日本語化について述べてきたが、複雑そうに見えても一度仕組みさえ知ってしまえば簡単だと思う。早い話、プラグインの翻訳はpoEditで.poファイルを編集し、生成した.moファイルをアップロードするだけである。WordPressは海外のプラグインが多くまだまだ日本語化されていないプラグインも多いのでぜひ日本語化に挑戦してもらいたい。そして、翻訳ができたら積極的に公開するのがいいだろう。また、新たにプラグインを作成する場合もはじめからローカライズ対応しておくとよいだろう。
参考にしたページ
Pingback: Wordpressプラグインの翻訳ファイルの作り方 | Open Laboratory
Pingback: WordPressのテンプレートを一からつくってみる。 - エゾスタイル
Pingback: 一部、日本語化しました @ Kentuck Blog
Pingback: 翻訳ファイルを用意してプラグインを日本語化する | WordPressで企業ウェブサイト作成・商用ホームページ制作 WordPress Go Go
Pingback: 間に合うのだろうか・・・^^; | Stepcy.comブログ
Pingback: WordPressのプラグインを翻訳 | ドラ焼きのメモ帳
Pingback: WordBench神戸で作ったプラグインのソースコード公開します! « カクニンプラスのweb日誌
Pingback: WordPressのfunctions.phpを書きまくってる人はプラグインにして公開すると幸せかもしれません。 : Toro_Unit
Pingback: WordBench神戸で作ったプラグインのソースコード公開します! | カクニンプラスのweb日誌
Pingback: テーマをTwenty Elevenにしてみました。 | 5丁目通信(仮称)
Pingback: WordPressプラグインを多言語化に対応する | モンキーレンチ