WordPressで見かけるアンダーバー2つ __() について。コピペで貼り付けた場合でも、記載されている文字列がそのまま表示されるので、意味を理解せずとも使える仕様ではある。
これは、多言語化対応する時に必要な関数で、作成した言語ファイルから対応する文字列を抜き出してくれる。
結構便利な機能で、表示用のテンプレートに直接文字列を打ち込まず、一つの言語ファイルにひとまとめにすることができるのでメンテ性が向上する。
LaravelやRuby on Railsでも同様の機能があり、実際のプロジェクトでも活用されている。
言語ファイルを用意しない場合
まずは、よくわからずペタッとコピペしてる場合にこの関数が何をしているかについて。
__( $text, $domain )
引数は2つで、必須な$textと、オプションの$domain。どちらも文字列(string)で指定する。
$domainは指定した$textの値が保存してある言語ファイルの場所を指す。指定の言語ファイルが存在しない場合は、$textをそのまま表示する。
例えば、__( ‘title’, ‘my-theme’ ) という記述で、対応する言語ファイル my-theme-ja.mo が存在しない場合は、第一引数の 「title」 が出力される。
実例
カスタム投稿タイプを作成する場合で言語ファイルが存在しない場合は以下のようになる。
function create_post_type() {
register_post_type( 'news', [
'labels' => [
'name' => __('title', 'my-theme'), // 管理画面上で表示する投稿タイプ名
'singular_name' => __('singular', 'my-theme'), // カスタム投稿の識別名
],
'public' => true,
'has_archive' => true,
'menu_position' => 5,
'show_in_rest' => true,
]);
}
add_action( 'init', 'create_post_type' );
__()関数で指定した内容がそのまま表示される。エラーにならないのがありがたい。
言語ファイルの作成方法(ja.moとja.poの使い方)
次に、実際に言語ファイルを使う方法について。拡張子が.moと.poという専用のファイルを作成する必要がある。
専用のエディタが出てきたりと手順が複雑そうに見えるが、やることは比較的単純で簡単。
- Poeditのインストール
- -ja.poファイルの作成
- -ja.moファイルの作成
- __()で呼び出し
Poeditのインストール
WordPressで言語ファイルを作成するためには、.poという拡張子のファイルに専用のフォーマットで言語を記述し、それをコンピュータ用のバイナリファイル .moにコンパイルする必要がある。
このコンパイルで必要なのが、Poeditというフリーのエディタ。これを専用ページからダウンロードしインストールする。
.poと.moの意味とは?
.poと.moは珍しい拡張子なので気になる。これは、gettextという言語の国際化プロジェクトで提唱されている仕様。
poはPortable Objectの略で人間が読めるファイル。moはMachine Objectの略で機械用のファイル。
WordPress以外にもPostgreSQLなどでも使われている。
-ja.poファイルの作成
翻訳ファイルの元となる -ja.po ファイルを作成する。
wp-content > languages > themes のディレクトリを開く。この中に、デフォルトでインストールされているテーマの言語ファイルが既に入っている。
wp-content > languages > themes 配下に、{任意の名前}-ja.po というファイルを作成する。ここでは例として、my-theme-ja.po とする。
ファイルを作成したら、以下を冒頭に貼り付ける。(既存の -ja.po ファイルの冒頭部分をコピペでOK)
msgid ""
msgstr ""
"PO-Revision-Date: 2021-04-15 06:03:55+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/3.0.0-alpha.2\n"
"Language: ja_JP\n"
"Project-Id-Version: Themes - My Theme\n"
これを記述しないと、Poeditエディタで開いた時に変な言語として認識される。(自分の場合はトルコ語とビルマ語になった、、)
次に、翻訳する内容を下に記載していく。
識別子 | 意味 |
msgid | ID名を指定(massage idの略) |
msgstr | 翻訳後の文字列を指定(massage string) |
基本的にはmsgidが英語、msgstrが日本語となる。
#でコメントアウトが使える。コメントアウトにも独自の記述ルールがある(強制ではなく任意)。
記述方法 | 内容 |
# | 汎用的なコメントアウト |
#: | 使用するファイルパス(と行) |
#. | フラグ。翻訳内容の説明 |
msgid ""
msgstr ""
"PO-Revision-Date: 2021-04-15 06:03:55+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/3.0.0-alpha.2\n"
"Language: ja_JP\n"
"Project-Id-Version: Themes - My Theme\n"
# カスタム投稿タイプ
msgid "title"
msgstr "ニュース"
msgid "singular"
msgstr "news"
今回は、titleとsingularというidに対応する文字列のみを作成。ファイルを保存する。
-ja.moファイルの作成
作成した -ja.po ファイルを元に、Poeditを使って -ja.mo ファイルを作成する。
(1)Proeditを起動
(2) 作成した -ja.po ファイルを開く
「翻訳を編集」または ctrl + o で作成したファイルを開く。
-ja.poファイルに記述した内容が表示される。
(3) 場所を指定して保存する
ファイル > 名前をつけて保存 または、cmd + shift + s で保存場所を指定する。名前はデフォルトのままでOK。
保存場所は、-ja.poと同じディレクトリを指定する。 -ja.poを上書きしてもいいかというアラートはOKで閉じる。
(4) -ja.mo ファイルが作成されたことを確認
wp-content > languages > themes > my-theme-ja.mo
以上で翻訳が完了。テーマ内の好きな場所から指定したmsgid名で対応する翻訳を呼び出すことができる。
__()で呼び出し
__()関数を使って作成した翻訳ファイルから言語を呼び出す。
__( $text, $domain )
第一引数の$testに呼び出したい msgid名を記述する。
第二引数の$domainに呼び出したいファイルの -ja.poをとった部分を記述する。例えば、my-theme-ja.po の中身を呼び出したい場合は、my-theme とする。
実例
カスタム投稿タイプを作成する場合で言語ファイルが存在しない場合は以下のようになる。
function create_post_type() {
register_post_type( 'news', [
'labels' => [
'name' => __('title', 'my-theme'), // 管理画面上で表示する投稿タイプ名
'singular_name' => __('singular', 'my-theme'), // カスタム投稿の識別名
],
'public' => true,
'has_archive' => true,
'menu_position' => 5,
'show_in_rest' => true,
]);
}
add_action( 'init', 'create_post_type' );
nameプロパティの値を __(‘title’, ‘my-theme’) としている。これで、-ja.poファイルに記述した、msgstr “ニュース” の「ニュース」が呼び出せればOK。
指定した通り、-ja.poファイルから言語が呼び出せた。
以上で完了。変更などのメンテナンスをしたい場合は、phpファイルをいじらずとも、-ja.poファイルを編集すればいいだけなので管理が楽になる。
.phpファイルのHTMLの中で呼び出す方法
functions.phpの中で呼び出す方法ではなく、テンプレートなどのHTMLの中で呼び出したい時は以下のように記述すると呼び出せる。
▼翻訳内容を表示する場合
<?php echo __( $text, $domain ); ?>
▼変数に格納する場合
<?php $translated_text = __( $text, $domain ); ?>
_e()|アンダースコア1個 e
言語ファイルの中身を表示する場合は、echoを使って表示することもできるが、 __() の代わりに _e() 関数を使っても記述できる。
<?php _e( $text, $domain ); ?>