WordPress

WordPress プラグイン開発における多言語対応(gettextを利用する場合)

投稿日:2018年1月15日 更新日:

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 として、以下のようなファイルが生成されます(一例です)。

{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 をセットしています。
  • 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. 参考

関連

WordPress

WordPress に関する srcset と sizes 属性値の簡単な説明

2017.12.28
WordPress

WSL + Homestead で WordPress のプラグイン開発環境を作る

2017.12.26
WordPress

WordPress:本文に<p>や<br>が自動で追加されないようにする方法(wpautop を無効にする)

2018.01.30

スポンサードリンク



📂-WordPress
-

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

WordPress

【WordPress】Gutenberg をカスタマイズするための情報

WordPress の Gutenberg をカスタマイズするための情報を紹介します。

WordPress

WordPress の機能を使って独自のPHPファイルにヘッダーとフッターを追加するサンプルページを作成しました

WordPress の持つ get_header(), get_footer() 関数を利用して、独自のPHPファイルにヘッダとフッターを表示するサンプルページを作成しました。 サンプルページのURL …

WordPress

JP Markdown と Classic Editor をやめ、Gutenberg を利用することにしました

JP Markdown と Classic Editor をやめ、Gutenberg を利用することにしました。かなり便利そうです。

WordPress

WordPress の管理バー(admin bar) が表示されない場合の対処法

WordPress サイトの管理バー(admin bar) が表示されない場合の対応方法について説明しています。

WordPress

WordPress 5.4 以降で記事にリンクを貼る際のオプション

WordPress 5.4 以降で、記事にリンクを貼る際のオプションについて説明します。