wordpress WordPress で多言語化(2ヶ国語)

2013年5月17日

ネットワーク機能を使ってマルチサイトにして、1つのサイトの言語を「英語」、他を「日本語」に設定した場合等の2ヶ国語化する際のメモ。

目次

おおまかな流れ

  • 多言語化ファイル(.po と .mo)を作成する。
  • functions.php で load_theme_textdomain()を 使ってテーマ用のmoファイルをロードする。
  • __()と_e()を使って翻訳テキストを表示する。

多言語化ファイル(.po と .mo)の作成

翻訳リソースファイル(.poファイル)はテキストエディタ(UTF対応)で作成できるが、文字コード(UTF-8またはUTF-8N?)を指定しても新規作成すると、文字化けしてしまうことがあるので、簡単なのはすでにある po ファイルをコピーして別名で(別の場所に)保存し、それをテキストエディタで開いて編集する。

  • wp-content/language の中に ja.po というファイルがあるので、それを自分のテーマフォルダにコピーして保存。名前は「ja.po」のまま同じ。
  • 不要な部分を削除・編集して、使用する翻訳を記述。「msgid」と「msgstr」の対になっている。
  • 必要であれば、その翻訳の出現個所をコメントとして記述。
    (例 #: wp-admin/user-edit.php:22 wp-admin/user-edit.php:24)
  • そのファイルを「Poedit」というソフトで開き、内容を確認して保存。保存すると「ja.mo」という mo ファイル(翻訳ファイル)が作成される。

poEdit:翻訳ファイルを編集できるエディタ(Windows、Mac OS X、Linuxに対応)

「Poedit」は編集のみが可能なので、訳語を追加する場合は、po ファイルをテキストエディタで開き、追加編集して保存し、そのファイルを「Poedit」で開き、保存する。

「Poedit」で保存すると、 mo ファイルを作成し、自動的にファイルの情報を付加および更新してくれる。以下は ja.po の例。

# Translation of MySite in Japanese
 msgid ""
 msgstr ""
 "PO-Revision-Date: 2013-03-22 13:54-0500\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: Poedit 1.5.5\n"
 "Project-Id-Version: 3.5.x\n"
 "POT-Creation-Date: \n"
 "Language-Team: \n"

 #: wp-content/themes/cubic/functions.php :93(出現個所→オプション)
 msgid "Topics"   (翻訳対象)
 msgstr "トピックス"  (翻訳)

 #: wp-content/themes/cubic/functions.php :95
 msgid "Add New Topics"
 msgstr "新規トピックスの追加"

 #: wp-content/themes/cubic/functions.php :96
 msgid "Edit Topics"
 msgstr "トピックスの編集"

使用例

上記の手順で、ja.mo ファイルを作成し、テーマのディレクトリ(wp-content/themes/テーマ名/)に保存。

functions.php に以下を記述して、moファイルをロードし、カスタム投稿タイプを作成し、カスタム投稿タイプの管理画面で、言語設定により表示を変更する場合の例。

functions.php 

//'after_setup_theme' アクションフックを利用してmoファイルをロード 
add_action('after_setup_theme', 'my_theme_setup');
function my_theme_setup(){
    load_theme_textdomain('テーマ名');
} 
 
function new_post_type() {  //トピックスというカスタム投稿タイプを登録
  register_post_type(
 'topics',
 array(
  'label' => __('Topics', 'テーマ名'),  //ラベルは英語の場合「Topics」、日本語の場合「トピックス」
   'labels' => array(
   'add_new' => __('Add New Topics', 'テーマ名'),  
    'edit_item' => __('Edit Topics', 'テーマ名'),  
    ),
  'public' => true,
  ...
  )
 );
 }
add_action('init', 'new_post_type'); 

テーマ用のmoファイルをロードする関数:load_theme_textdomain()

load_theme_textdomain($domain , $path )
テーマ用のmoファイルをロードする関数
パラメータ:
 $domain: テーマ名を指定(__()と_e()の第2パラメータになる)
 $path: 国際化用ファイル(moファイル)のパス名を指定。
     (moファイルをテーマの直下に置いた場合は省略可能)
戻り値:
 ロードが成功した場合はtrue、ロードに失敗した場合はfalse。

追加情報

第一パラメータの「$domain」については、あまりよくわかっていない。ここでは「テーマ名」としていて実際にそれで機能したが、後日テーマを変更した際に新しいテーマ名を指定すると機能しなくなった。最初に指定した元のテーマ名を指定すると機能する。。。

例:/wp-content/themes/mytheme/ja.mo にMOファイルを配置した場合は以下のいずれかで指定可能

load_theme_textdomain( 'テーマ名', TEMPLATEPATH ); 
load_theme_textdomain( 'テーマ名', get_template_directory());
load_theme_textdomain( 'テーマ名' );

例:/wp-content/themes/mytheme/languages/ja.moにMOファイルを配置した場合は以下のいずれかで指定可能

load_theme_textdomain( 'テーマ名',get_template_directory().'/language/');
load_theme_textdomain( 'テーマ名', TEMPLATEPATH.'/languages' );

Function Reference/load theme textdomain

翻訳テキストを表示または返す関数:__()と_e()

第1引数:翻訳するメッセージ
第2引数:load_theme_textdomain()で指定したドメイン(翻訳ファイル(.moファイル)を読み込むディレクトリ?)。ドメインを指定しない場合は WordPress 本体の翻訳ファイルを参照するようになる。

__($message, $domain)
  翻訳された$messageをreturnで返す(アンダーバーは2つ)

_e($message, $domain)
  翻訳された$messageをechoで返す

状況に応じて文字列の位置が変化する場合

  • PHP の sprintf 関数と __() や _e() を組み合わせて使う。
  • sprintf 関数を使うと、状況によって位置が変化する文字列を「%s」で表し、その部分を変数で置き換えることができる。
  • 位置が変化する文字列が複数ある場合は、sprintf 関数のパラメータに複数の値(変数)を指定して、パラメータ内の何番目の値で置き換えるかを「%1$s」「%2$s」のように指定する。

以下は、「Hello, XX !」を「XXさん、こんにちは。」に翻訳する場合の例。

  • 言語ファイルに以下の情報を追加する。
  • 英語:「Hello, %s !」、日本語:「%sさん、こんにちは。」
  • sprintf 関数を使って「%s」の部分を置き換える。
  • 変数「$username」にユーザー名を取得しておく。
<?php echo sprintf(__('Hello, %s !', ''テーマ名'),$username); ?>

以下は、検索キーワードが該当しなかった場合の記述の例。

//ja.po
msgid "Your search for \"<span>%s</span>\" did not yield any results."
msgstr "「<span>%s</span>」の検索結果が見つかりませんでした。"

msgid "Enter your keywords:"
msgstr "別のキーワードでお試しください。"
//search.php 抜粋
・・・
<?php endwhile; ?>
<?php else: ?>
<?php $search = esc_html(get_search_query()); ?>
<h2><?php echo sprintf(__('Your search for "<span>%s</span>" did not yield any results.', 'mysite'),$search ); ?></h2>
<p class="keyword"><?php _e('Enter your keywords:', 'mysite'); ?></p>
<?php get_search_form(); ?>
<?php endif;  ?>

タイトル画像などを日本語環境と英語環境の場合で出力を変更する例

「title-en.jpg」と「title-ja.jpg」という2つの画像を用意しておき、画像部分を以下のように記述。

<img src="<?php echo get_template_directory_uri(); ?>/images/title<?php _e('-en','テーマ名') ?>.jpg" alt="<?php _e('Title','テーマ名') ?>" />

ja.poに以下を追記し、.moファイルをPoeditで再度生成してアップ

msgid "-en"
msgstr "-ja"

msgid "Title"
msgstr "タイトル"