そんなにGeekじゃないエンジニアブログ

[WordPressプラグイン開発]翻訳ファイル.poファイル、.moファイルで多言語化したプラグインを作ろう

calendar

こんにちは。でんすけ(@notgeek_densuke)です。

今回は、言語ファイル(.poファイル、.moファイル)について。

WordPressって、基本的には英語で書かれることが多いので、公式にプラグインを登録したりする場合は英語で開発するのが通常の流れです。
が、日本人ですからね。日本語で書きたいやん?

ということで、WordPressのプラグインを多言語で書く方法。

スポンサーリンク

翻訳ファイル.poファイルとは?

まず、そもそも.poファイルってなんだ、という話ですが。
こんな中身の、テキストファイルです。

# LANGUAGE (LOCALE) translation for WordPress.
# Copyright (C) YEAR WordPress contributors.
# This file is distributed under the same license as the WordPress package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: WordPress VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2005-02-27 17:11-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: hogehoge.php:10
msgid "test"
msgstr "テスト"

17行目まではヘッダー情報。
公式Wikiからコピーしてきたヘッダー内容です。

公式の情報はこちら。
WordPress公式Wiki

西暦とか、名前、メールアドレスなど、自分で書き換えるところがあるのでご注意。

あと、16行目のcharsetは「utf-8」に、僕が書き換えました。
日本語であれば、utf-8で書くのがベターかと。

で、19行目以降に翻訳内容を書いていきます。
「test」という英語に対して、日本語では「テスト」ですよ、ということです。

コメントで
「#: hogehoge.php:10」のように、
ソース上で出現する場所を書いてあげると親切、と公式さんはおっしゃってました。

・・・これ、どうなんでしょうね。
手書きでやっていくのは、メンテナンス性があまりにも悪い気がするのですが。
必須、というわけでもないっぽいので、努力目標的なものだと僕は思っています。

poファイルのファイル名

で、poファイルのファイル名ですが、
「任意の名前-ja.po
となります。

ファイル名に「ハイフン(国コード).po」を付ける、というのがルールになってます。
なので、日本語だったら「-ja.po」。

翻訳ファイル.moファイルとは?

で、poファイルと対になって出てくるのが.moファイルです。

先ほどのpoファイルをコンパイルするとmoファイルになります。

WordPressのプラグインなどから読み込まれるのは、このmoファイルの方。poファイルはそれを作るための土台です。

コンパイルは、poeditなどのツールを使うことで実行できます。
poeditのSourceForgeページはこちら

で、poeditで先ほどのpoファイルを開くとこんな感じ。

moへのコンパイルは、「ファイル」→「MOにコンパイル」です。

カンタンですね!

WordPressプラグインからの読み込み

WordPressプラグインなどからこの翻訳ファイルを読み込むにはこんな感じにします。

<?php
/*
Plugin Name: my test plugin
Plugin URI: 
Description: description
Version: 1.0
Author: 
Author URI: 
License: GPL2
Copyright 2018 name (email : email)
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as
	published by the Free Software Foundation.
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

add_action( 'plugins_loaded', 'load_lang_strings' );
add_action( 'admin_notices', 'display_notice' );

function load_lang_strings(){
    load_plugin_textdomain( 'test_lang', false, basename( dirname( __FILE__ ) ) . '/languages' );
}

function display_notice(){
    $str = __('test', 'test_lang');
    echo $str;
    _e('test', 'test_lang');
}
?>

こうすると、管理画面の上の方に「テストテスト」と出力されます。

まず、load_plugin_textdomain()で読み込むmoファイルを指定します。

書式はこんな感じ。
load_plugin_textdomain(スラッグ, false固定 , moファイルのディレクトリ);

moファイル名は、「スラッグ-ja.mo」という名前である必要があります。ちょっとでも違ったら読み込んでくれません。

でその後、
__(翻訳文字列, スラッグ);
もしくは
_e(翻訳文字列, スラッグ);
で翻訳された文字列が取得できます。

翻訳文字列がmoファイルに定義されていなければ、何も翻訳されず、引数に指定した文字列がそのまま返ってきます。

__()の方は文字列が返り値として返ってくるのに対し、
_e()の方は、文字列を「echo」してくれます。

なのでこのソース例だと、自分でechoを書いたのと、_e()でechoされたのとで、2つ「テスト」が出力されることになります。

翻訳ファイルの扱い、よくあるミス

これら、翻訳ファイルを扱っているとよくあるのが

・翻訳ファイルをアップロードし忘れる
・poをコンパイルし忘れる
ということ。

特にコンパイルし忘れたままアップロードして、テストしてみて「動かない!」となることがよくあります(僕の注意不足ですが。。

ご注意くださいませ。

まとめ

ということで、poファイル、moファイルを使って多言語対応する、という話でした。

poファイルに英語と翻訳語を書いて、
moファイルにコンパイルする。

load_plugin_textdomain()でmoファイルを読み込んで、
__()もしくは_e()で出力する
という流れです。

仕組みがわかればなんてことはないですが、コンパイルし忘れにはご注意を。

それではまたー。

この記事をシェアする

コメント

コメントはありません。

down コメントを残す




CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください