目次
1. はじめに
WordPress のプラグイン開発において、多言語対応する手順について説明します。
いろいろなやり方があると思いますが、ここでは gettext という「国際化と地域化に対応するため」のライブラリを使用します。
2. 想定している開発環境
- Windows (WSL (Ubuntu))
- Mac
- Linux (Debian系、RedHat系)
3. gettext のインストール
まずは、gettext
をインストールします。
gettext
をインストールすることによって、いろいろなコマンドが使えるようになります。
Linux (Debian系、Ubuntuなど), WSL (Ubuntu) の場合
$ sudo apt install gettext
Linux (RedHat系, CentOSなど) の場合
$ sudo yum install gettext
Mac の場合
$ sudo brew install gettext
または、
$ sudo port install gettext
gettext – GNU Project – Free Software Foundation (FSF) からソースコードをダウンロードし、自分でコンパイルすることもできます。
4. 多言語対応の作業
以下を前提とします。
- プラグインの名前を
{plugin-name}
とします。 - 翻訳する部分の文字列は、最初に英語のものを用意しておき、後から日本語用翻訳ファイルを追加するという手順をとります。
1. プログラム中の翻訳文字列を使用する箇所で、専用の関数を使うようにします。
翻訳文字列を返す箇所では、以下の関数を使用します。
__( '英語での文字列', '{plugin-name}' )`
文字列を「返す」のではなく「出力」する(echoのように)部分では、以下の関数を使用します。
_e( '英語での文字列', '{plugin-name}' )`
文字列に数値が含まれており、単数と複数とで文字列が異なる場合は、以下の関数を使用します。
_n( '英語での文字列(単数用)', '英語での文字列(複数用)', 数, '{plugin-name}' )`
※ _n()
関数では、%d
といった部分の置換まではやってくれませんので、printf()
や sprintf()
関数で別途置換する必要があります。
※ _x()
, _ex()
, _nx()
という関数もありますが、分かりやすさのため今回は説明を省きます。
※ 上記の引数に指定している {plugin-name}
の部分は、実際には「ドメイン」を指定します。今回は、プラグイン名をドメインとして使用しますので、このような指定になっています。
2. 翻訳ファイルを配置するディレクトリを作成します。
今回は、プラグインのディレクトリ直下に languages
という名前のディレクトリを作成します。
このディレクトリ名は任意です。例えば、lang
でも構いません。
3. 翻訳用ファイルのテンプレートとなるファイルを生成します。
1 で記述した箇所を収集して、翻訳のためのテンプレートとなるファイルを生成します。このテンプレートファイルを元にして、日本語用の翻訳ファイルを生成することになります。
以下のコマンドを実行します。
$ cd path/to/your-plugin
$ xgettext -k"__" -k"_e" -k"_n" -o languages/{plugin-name}.pot *.php
-k
オプションで、翻訳文字列を変換する関数名を指定しています。-o
オプションで、生成するファイルパスを指定しています。- 最後の引数にある
*.php
のところは、翻訳する文字列を含むファイルを指定します。
languages/{plugin-name}.pot
として、以下のようなファイルが生成されます(一例です)。
4. 日本語用の翻訳リソースファイルを生成します。
3 で生成したテンプレートファイルを元にして、日本語用の翻訳リソースファイル(.po
ファイル)を生成します。
$ cd languages
$ msginit --locale=ja_JP.UTF-8 --input={plugin-name}.pot --output={plugin-name}-ja.po
生成されたファイルには、以下の行が生成されていると思います。
"Plural-Forms: nplurals=1; plural=0;\n"
nplurals
は「単数・複数の種類はいくつあるか?」を、plural
は「msgstr
配列内の実際に使用するインデックス番号」を指定しています。日本語の場合、単数も複数も区別しないのが普通ですので、nplurals
は 1 でよいですし、1つしかないので配列内で使用するインデックス番号は 0しかありえません。msgstr
配列は次で記述します。
5. 翻訳リソースファイルに日本語を埋め込んでいきます。
.po
ファイル内に翻訳文字列(今回の場合、日本語)を入力していきます。
通常は、msgid
で表された英語に対し、msgstr
に対応する日本語を入力していきます。
単数・複数で使用する文字列が異なる(英語の場合)項目については、以下のように、msgid_plural
に複数の場合の英語を入力し、対応する日本語を msgstr[0]
に入力します(日本語では単数・複数を区別せず、1つの文字列を使用することを前提としています)。
6. .mo
ファイルを生成します。
実際に __()
関数などから使用されるのは、.po
ファイルではなく .mo
ファイルになります。.po
ファイルはただのテキストファイルですが、.mo
ファイルはバイナリファイルです。
以下のコマンドにより、.po
ファイルを元にして .mo
ファイルを生成します。
$ msgfmt -o {pluin-name}-ja.mo {plugin-name}-ja.po
※「不正な複数バイトのシーケンス」といったエラーがでる場合、.po
ファイル内のContent-Type
の行で、charset=UTF-8
がセットされているか確認してください。UTF-8
以外がセットされているのであれば、UTF-8
に変更します。
7. 翻訳リソースファイルをWordPressに登録します。
今回生成した翻訳リソースファイルを使用するため、functions.php
に、load_plugin_textdomain()
関数を記述します。
$ load_plugin_textdomain('{plugin-name}', false, basename(dirname(__FILE__)).'/languages' );
第一引数名は、__()
関数などの引数で指定した {plugin-name}
と一致させる必要があります。第二引数には false
を、第三引数には翻訳ファイルを配置したディレクトリパスを指定します。
6. 補足1
日本語でも単数・複数によって文字列を別にしたい場合は、
{plugin-name}-ja.po
ファイル内の Plural-Forms
の部分を、以下のように修正します。
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
nplurals=2
について- 翻訳の種類が2つなので、
nplurals
に 2 をセットしています。
- 翻訳の種類が2つなので、
plural=(n != 1)
について- 数(n)が1の場合は、(n != 1) が false(0) となり、使用されるインデックス番号は 0となります。また、例えば数(n)が2の場合は、(n != 1) が true(1) となり、使用されるインデックス番号は 1となります。つまり、数が 1ならインデックス番号0、それ以外ならインデックス番号1 となります。
翻訳する項目のところでは、msgstr[0]
に単数用、msgstr[1]
に複数用の日本語をセットします。
msgid "One file removed"
msgid_plural "%d files removed"
msgstr[0] "1個のファイルを削除しました"
msgstr[1] "%d個のファイルを削除しました"
あとは、先ほどのやり方で .mo
ファイルを生成するだけです。
7. 補足2
_x()
, _ex()
, _nx()
を使用する場合は、xgettext
コマンドの -k
オプションでこれらも指定する必要があるでしょう。また、.po
ファイル内で コンテキスト(msgctxt
)を指定する必要もあります。
8. 参考
- gettext – GNU Project – Free Software Foundation (FSF)
- gettext – Wikipedia
- GetTextを用いたローカライズ方法 – Conyac
- I18n for WordPress Developers – WordPress Codex 日本語版
- WordPress プラグイン開発者用メモ 多言語対応 – 翻訳リソースファイルの作成手順 | hijiriworld Web
- L10n « WordPress Codex
- 関数リファレンス/ 2 – WordPress Codex 日本語版
- 関数リファレンス/ e – WordPress Codex 日本語版
- load_plugin_textdomain() | Function | WordPress Developer Resources