この記事は最後に更新してから1年以上経過しています。

MOファイルを作ってみた

説明

テーマやプラグインで使用するMOファイルはWindows環境では「Poedit」アプリを使うことが多かったが、最近では「GlotPress」のようなプラグインも増えてきており、選択肢は広がっている。定期的に開発環境を見直す過程で「Poedit」から「GlotPress」に切り替えようと思ったのだが、微妙にしっくりこなかった。

MOファイルに関連する日本語の情報が少ない

そんなわけで自分好みのツール(プラグイン)を作ってみようと思ったのだが、MOファイルの作成に関する情報を検索すると、日本語の場合は「Poedit」や「gettext」関連の情報が多く、PHPでゴニョゴニョする感じの内容をすぐに見つけることはできなかった。検索ワードを変えながら検索していくと、WordPressのソースコードの一部がヒット。「灯台下暗し」とはことのことかと思いつつ、/wp-includes/pomo/mo.php(以降mo.php)を眺めてみた。

mo.phpでは MOクラスを定義しており、WordPressではこのMOクラスを使って本体はもちろんプラグインやテーマのMOファイルを読み込み、各言語向けの表示を行っている。MOクラスにはMOファイルの読み込みだけでなく、書き込みを行うメソッドも用意されているが、標準のWordPressでは書き込みは行っていないようだ。

POファイルの内容を見ながらMOファイルを書き出してみる

MOファイルの書き出しはおおむね次のような感じになる。

$mo = new MO();
$mo->set_headers( $headers );
foreach ( $entries as $entry ) {
	$mo->add_entry( $entry );
}
$mo->export_to_file( $mo_path );

$headersの内容

ポイントは$headers$entryの内容はそれぞれ連想配列となり、これらを理解するにはPOファイルを見るのが手っ取り早い。ということで、標準テーマの「Twenty Seventeen」のPOファイルを例に各内容を紹介する。

まずはPOファイルの冒頭部分から(#からはじまるコメント行は割愛)。

msgid ""
msgstr ""
"PO-Revision-Date: 2017-11-16 08:35:12+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: GlotPress/2.4.0-alpha\n"
"Language: ja_JP\n"
"Project-Id-Version: Themes - Twenty Seventeen\n"

この内容が$headersの連想配列の情報となる。

$headers = array(
	'PO-Revision-Date'			=> '2017-11-16 08:35:12+0000',
	'MIME-Version'				=> '1.0',
	'Content-Type'				=> 'text/plain; charset=UTF-8',
	'Content-Transfer-Encoding'	=> '8bit',
	'Plural-Forms'				=> 'nplurals=1; plural=0;',
	'X-Generator'				=> 'GlotPress/2.4.0-alpha',
	'Language'					=> 'ja_JP',
	'Project-Id-Version'		=> 'Themes - Twenty Seventeen',
);

順番が前後するが、'Project-Id-Version'の値はテーマまたはプラグイン名となる。基本的な書式は「種別 - 名前 - バージョン情報」となり、「種別」はWordPressのテーマなら'Themes'、プラグインなら'Plugins'となる。なお「バージョン情報」部分に関しては、この「Twenty Seventeen」のように省略されている場合もある。

翻訳対象の言語によって変化するのが、'Plural-Forms'と'Language'の値である。日本語の場合、'Plural-Forms'の値は'nplurals=1; plural=0;'となり、'Language'の値は'ja_JP'となる。

'X-Generator'の値は、翻訳ファイルの作成に使用したツールの名前で、WordPress本体や標準テーマは「GlotPress」が利用されていることがわかる。

$entriesの内容

$entriesの内容は翻訳情報を示す$entryの配列で、その中身は各翻訳内容に応じて変わってくる。まずは原文と翻訳文が1体1のシンプルなパターン。

msgid "Footer"
msgstr "フッター"

$entryの内容は次の通りで、キー'singular'の値には「msgid」の内容を、'translations'の値には「msgstr」の内容を格納した配列を指定する。'translations'の値に文字列を指定すると、内部で空の配列が適用され、意図したMOファイルが作成されない。なお'translator_comments'から'flags'までの値についてはMOファイルには出力されないと思われるので、ここでは''または空の配列を指定している。

$entry = array(
	'context'				=> '',
	'singular'				=> 'Footer',
	'plural'				=> '',
	'translations'			=> array( 'フッター' ),
	'translator_comments'	=> '',
	'extracted_comments'	=> '',
	'references'			=> array(),
	'flags'					=> array(),
);

翻訳内容にはコンテキストありで複数形ありのパターンがある。

msgctxt "comments title"
msgid "%1$s Reply to “%2$s”"
msgid_plural "%1$s Replies to “%2$s”"
msgstr[0] "“%2$s” への%1$s件の返信"

この場合は、'singular'と'translations'を同様に指定するほか、'context'の値には「msgctxt」の内容を、'plural'には「msgid_plural」の内容を格納する。

$entry = array(
	'context'				=> 'comments title',
	'singular'				=> '%1$s Reply to “%2$s”',
	'plural'				=> '%1$s Replies to “%2$s”',
	'translations'			=> array( '“%2$s” への%1$s件の返信' ),
	'translator_comments'	=> '',
	'extracted_comments'	=> '',
	'references'			=> array(),
	'flags'					=> array(),
);

POファイルを読み書きできるPOクラスもある

ちなみにMOファイル向けのmo.phpがあるように、POファイル向けのpo.phpも同梱されている。po.phpにはPOクラスが定義されており、POファイルの読み書きをしたい場合は参考にするとよいだろう。なおpo.phpは標準では読み込まれていない。POクラスを使用する場合はpo.phpをrequire_onceする必要がある。


最終更新 : 2018年07月25日 16:57


お勧め

add_shortcode(2018年5月27日 更新)

void add_shortcode( string $tag, mixed $func )
ショートコード(独自タグ)を追加する。ショートコードは、投稿記事内でテキスト内容がない[tag]や、テキストを内包する[tag]テキスト[/tag]の書式で使用できる独自タグのこと。標準の状態では、 the_content関数によって表示する直前のフィルター処理内でパラメータ$funcで指定した関数・メソッドが実行される。

get_user_setting(2022年1月31日 更新)

mixed get_user_setting( string $name [ , string $default = false ] )
ユーザーインターフェイス設定を取得する。

have_posts(2018年5月27日 更新)

bool have_posts( )
次の投稿データが存在するかを調べる。

in_category(2018年5月27日 更新)

bool in_category( mixed $category [ , mixed $post = null ] )
投稿情報が指定したカテゴリーに属しているか調べる。

add_feed(2024年6月24日 更新)

string add_feed( string $feedname, callable $callback )
フィードを追加する。