プラグインを自作したら日本語の表現をひとまず英語にして、その後国際化しておきましょう。(日本語翻訳を付け、ワードプレス日本語版を使っている場合には日本語で表示されるようにする)
ワードプレスの公式ディレクトリに登録するための対応になりますが、一気にやってしまうのが良いですね。
テキストドメインを設定したり、ソースの中に翻訳文字列の指定を入れたりと、手順的には大きく分けて5つありますが、ここでは「More Tag Auto Insert」というプラグインを自作した時に行ってみた国際化のための手順、方法をご紹介。
参考)プラグインの作成(wordpress公式)
⇒プラグインの多言語化
Contents
手順1)テキストドメインの設定
プラグイン(やテーマ)の国際化(翻訳対応)では、
ソースコード内で翻訳表示する文字列を以下のような記述で1つ1つ指定しますが、その指定の中で使う「テキストドメイン」というものをまず設定します。
1 2 3 4 5 6 7 8 9 10 11 |
<?php //その場で直接表示する場合 _e( 'english', 'text-domain' ); //変数に入れる場合 $translate = __( 'english', 'text-domain' ); //単数、複数のある場合 //変数($post_count)が1の場合「post」、それ以外は「posts」を表示 echo _n( 'post' , 'posts' , $post_count, 'test-domain' ); ?> |
この例の場合、「english」の箇所が翻訳対象の文字列、
「text-domain」の箇所が「テキストドメイン」と呼ばれるもの。
テキストドメインとは、翻訳する文字列(テキスト)がどこにあるかを示す識別子で、作成する翻訳ファイル( .pot, .po, .mo )のファイル名にもなるものです。
この識別子を使って各言語の翻訳ファイルが作られます。
- 例)テキストドメインが「textdomain」という文字列の場合の翻訳ファイル(.mo)の例
- textdomain-ja.mo (日本語の翻訳ファイル)
- textdomain-fr.mo (フランス語の翻訳ファイル)
- textdomain-de.mo (ドイツ語の翻訳ファイル)
- textdomain-th.mo (タイ語の翻訳ファイル)
こんな感じで、各言語の翻訳ファイルの元となって、翻訳する文字列(テキスト)の領域(ドメイン)を示す識別子となることから、テキストドメインなんて呼ばれるんですね。
(日本語翻訳ファイル textdomain-ja.mo は、textdomainという大きな領域内の ja区域、みたいなものかな?jpではないことに注意。)
プラグインの公式ディレクトリ上にある翻訳ファイルと被らないよう、テキストドメインは唯一の名称である必要があり、ワードプレスの公式ドキュメントでは以下のように説明されてます。
- プラグインが1つのファイルのみ(例えば my-plugin.php)であれば「my-plugin」をテキストドメインとして設定する
- 複数ファイルで構成されフォルダ(例えば my-plugin2 フォルダー)になっている場合には、そのプラグインフォルダ名称「my-plugin2」をテキストドメインとして設定する
参考)I18n for WordPress Developers
(※:I18n とは Internationalization(国際化)のこと。最初の"l"と最後の"n"の間に18文字あるからこうした表現になっているのだとか。面白いですね)
この公式ドキュメントからすると、
テキストドメインはプラグインのヘッダ部分にも記載する必要があるようです。
1 2 3 4 5 |
/* * Plugin Name: My Plugin * Author: Jin Koyama * Text Domain: my-plugin */ |
(記載しなくても翻訳は機能するようですが、プラグインを公式ディレクトリに登録した後、必要になるのかな?)
テキストドメインはアンダースコア( _ )は使わず、使うならハイフン( - )を使う。
ファイルの命名規則に同じになりますね。
手順2)翻訳ファイルの指定(フォルダ指定)
テキストドメインを決めたら、そのテキストドメインと翻訳ファイル(.moファイル)のありかをload_plugin_textdomain()関数で記述します。
1 |
load_plugin_textdomain( 'text-domain', false, basename( dirname( __FILE__ ) ) . '/languages' ); |
関数リファレンス:load_plugin_textdomain(英語)
- 第1引数:テキストドメイン
- 第2引数:非推奨になっているので、デフォルトである false を指定
- 第3引数:翻訳ファイル(.moファイル)を置くパス(フォルダ)を指定
このコードの意味合いとしては、
第三引数で指定されたフォルダの中にあるファイルのうち「テキストドメイン」と名称が合致している翻訳ファイルをワードプレス内に持って来る、みたいになるでしょうか。
第三引数の最後に「 /languages 」とあるように、翻訳ファイルを置く場合の基本として「languages」という名称でフォルダを作成してその中に入れるようにします。
load_plugin_textdomain() 関数はファイルが見つからなければ false を返すだけなので(Warning や Fatal error を出さないので)、翻訳ファイルがまだなくても先に記述しておいて良いですね。
具体的な記述例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php /* * Plugin Name: More Tag Auto Insert * Plugin URI:https://tabibitojin.com/add-more-tag-auto * Description:Automatically insert a more tag (read more tag <!--More-->) just before the first H2 headline (H2 tag) in the article. If the article does not have a more tag, a more tag is automatically inserted when the article is displayed or when the article is saved (when published, updated, or saved as a draft). You can also search for articles that do not have a more tag, and display them in a list. * Version: 0.9.3 * Author: Jin Koyama * Author URI:https://tabibitojin.com/ * Text Domain: jin-more-tag-auto */ //------------------------------------ // 翻訳追加 //------------------------------------ define( "JAMT_TEXT_DOMAIN" , "jin-more-tag-auto" ); load_plugin_textdomain( JAMT_TEXT_DOMAIN , false, basename( dirname( __FILE__ ) ) . '/languages' ); //------------------------------------ // メインファイル読み込み //------------------------------------ require( 'jin-more-tag-auto-settings.php' ); require( 'jin-more-tag-auto-when-display.php' ); require( 'jin-more-tag-auto-when-save.php' ); ?> |
この例は「More Tag Auto Insert」というプラグインを作った時のものですが、以下のようにしています。
- ヘッダ内9行目にテキストドメインの記述
- 15行目:テキストドメインを定数として定義
- 16行目:load_plugin_textdomain()関数を使用してテキストドメインと翻訳ファイルのフォルダ指定
テキストドメインとしては、このプラグインを作った時のプラグインフォルダ名称を指定してます。ちなみに15行目でテキストドメインを定数として定義しているのは、使用する場面が多いから定数にしておけば後々便利、ということから。
※)フォルダ名称は必ず languages ?
第三引数で指定するフォルダ名称と翻訳ファイル(.moファイル)を置くフォルダ名称が一致していれば翻訳が機能するのを確認してますし、絶対「languages」という名称にせよ、と公式ドキュメントには書かれてないようです。
WordPress_の翻訳/国際化対応 にもmo 翻訳ファイル(.moファイル)を languages ディレクトリ内に配置、とか書かれているので、何か特別な理由がなければ、誰から見ても分かりやすい languages フォルダーにしておくのが良さそうです。
手順3)翻訳したい個所の設定( _e(), __() をなどを使う)
プラグインの設定画面など画面に表示する文字列に対して、
・英語環境では英語で表示、
・日本語環境では日本語で表示、
と、翻訳表示したい文字列を翻訳のための関数で1つ1つ指定していきます。
※)ポイント:元々の日本語はコメントで残しておきましょう
(Poeditなどを使って翻訳ファイルを作成する時に使いますので)
翻訳のための関数として主に使うのは _e(), __()、
たまに _n() を使うぐらいになると思います。
1 2 3 4 5 6 7 8 9 10 11 |
<?php //その場で直接表示する場合 _e( 'english', 'text-domain' ); //変数に入れる場合 $message = __( 'english', 'text-domain' ); //単数、複数のある場合 //変数($post_count)が1の場合「post」、それ以外は「posts」を表示 echo _n( 'post' , 'posts' , $post_count, 'test-domain' ); ?> |
(他にも記号などをエスケープして翻訳する esc_attr_e() , esc_attr__() とかもあるので、関数リファレンスを参照)
具体例:_e()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php echo '<a href="~">新規</a>'; echo '<a href="~">編集</a>'; echo '<a href="~">削除</a>'; // 新規、編集、削除、を翻訳表示の対象としたい // ↓↓↓↓↓↓ // まず英語にする echo '<a href="~">new</a>'; //新規 echo '<a href="~">edit</a>'; //編集 echo '<a href="~">delet</a>'; //削除 // _e() を使って翻訳対応を入れる // ↓↓↓↓↓↓ echo '<a href="~">'._e( 'new', 'text-domain').'</a>'; //新規 echo '<a href="~">'._e( 'edit', 'text-domain').'</a>'; //編集 echo '<a href="~">'._e( 'delet', 'text-domain').'</a>'; //削除 ?> |
ちょっとしたところや、ソースの中に混ぜても分かりづらくならないものは _e() を使って置き換えていけばよいですね。
テキストドメインをdefineで定義している場合には、以下のようになります。
例)defineでテキストドメイン text-domain を TEXT_DOMAIN として定義している場合
1 2 3 4 5 6 7 |
<?php define( "TEXT_DOMAIN" , "text-domain" ); echo '<a href="~">'._e( 'new', TEXT_DOMAIN ).'</a>'; //新規 echo '<a href="~">'._e( 'edit', TEXT_DOMAIN ).'</a>'; //編集 echo '<a href="~">'._e( 'delet', TEXT_DOMAIN ).'</a>'; //削除 ?> |
具体例:__()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php $h1_title = __( 'More Tag Auto Insert', 'text-domain' ); //moreタグ自動追加設定 $description1 = __( 'A plugin automatically inserts a more tag before the first h2 tag headline in a post or a page.', 'text-domain' ); //記事中の最初のh2見出し前にmoreタグを自動で挿入するプラグイン。 ?> <div id="jin_amt_settings"> <div class="settings"> <h1><?php echo $h1_title; ?></h1> <div class="description"> <p><?php echo $description1; ?></p> </div> <form method="post" action="options.php"> <?php settings_fields( 'jin-amt-settings-field-group' ); ?> <?php do_settings_sections( 'jin-amt-settings' ); ?> <?php submit_button(); ?> </form> </div><!--settings--> </div><!--jin_amt_settings--> |
- __() を使って、2行目、4行目で翻訳したい文字列を指定して、
- 各々 $h1_title, $description1 といった変数へ代入し、
- 9行目、11行目でHTMLの中に組み込んでいる
といった例。
翻訳対象の文字列がある程度長く、ソースの中に _e()関数を使って入れると分かりづらくなるなどの場合に使えばよいですね。
具体例:_n()
1 2 3 4 5 6 7 8 |
<?php // 1記事、2記事と表示する echo $post_count.'記事'; //↓↓↓↓↓↓(単数と複数とで表示を変える) printf( _n( '%d post' , '%d posts' , $post_count, 'text-domain' ), $post_count); ?> |
この例では、記事数を数えてそれを表示する、という場合ですが、
日本語では1記事、2記事、... と記事数によって「記事」は変化しません。
でも英語になると、1 post, 2 posts, ... と、
1記事では単数の「post」、2記事以上は複数になって post に「s」を付ける必要が出てくる(posts にしないといけない)。
単数、複数って面倒!なんて思いますが(笑)
これはもう仕方がないですね。
こうした場合分けがある時に使うのが _n() で以下のように設定します。
- 第一引数( %d post )は単数の場合に表示する文字列
- 第二引数( %d posts )は複数の場合に表示する文字列
- 第三引数( $post_count )は変化する数値
更にprintf() を使うことで %dには数値が入り、その数値は printf の第二引数($post_count)で指定する、ってわけですね。
関数リファレンス:printf()(公式phpマニュアル)
printf()とか使わずに、以下のようにしてもOK。
1 2 3 4 5 6 7 8 |
<?php // 1記事、2記事と表示する echo $post_count.'記事'; //↓↓↓↓↓↓(単数と複数とで表示を変える) echo $post_count . _n( ' post' , ' posts' , $post_count, 'text-domain' ); ?> |
これら _e(), __(), _n() などを使って、翻訳対象の文字列を指定していきましょう。
手順4)翻訳ファイルの作成(poedit)
ここまでで、テキストドメインの設定、翻訳ファイルの指定、翻訳したい個所の設定、としてきましたが、あとは実際の翻訳ファイルを作成するだけ。
翻訳ファイルの作成は Poedit というソフトを使えばすぐできます。
(phpファイル内の _e(), __() などで指定した翻訳対象の文字列を一気に抽出してくれるので物凄く楽)
Poeditの使い方、実際の .po, .mo(と .pot)の作り方は以下で見てみてください。
⇒ Poeditの使い方!翻訳ファイル .pot .po, .moを作る手順を分かりやすく解説
手順5)翻訳ファイルの配置(指定フォルダへ入れる)
Poeditを使って (.poと).moファイルを作る過程で、
翻訳対象プラグインのフォルダー内「languages」フォルダーに .moファイルが作成されると思います。
ブログのフォルダ(ワードプレスのフォルダ)
├ wp-admin
├ wp-content
├ languages
├ plugins
├ akismet
├ jin-more-tag-auto
├ languages
├ jin-more-tag-auto-ja.pot
├ jin-more-tag-auto-ja.po
├ jin-more-tag-auto-ja.mo
├ jin-more-tag-auto.php
├ xxxxx.php
├ xxxxx.css
├ ・・・・
├ wp-include
├ .htaccess
├ index.php
├ ・・・・
プラグインのフォルダ―「jin-more-tag-auto」の中の「languages」フォルダーに、翻訳ファイルとなる .moファイル(jin-more-tag-auto-ja.mo)を配置している例。
分かりやすくしようと思って書いてみましたが、ちょっと分かりづらいですね。^-^;)
ファイルのフォルダ配置のご参考までに。
今回のポイント!
プラグインやテーマの国際化(翻訳対応)は以下を行えばOK!
- 1)テキストドメインを決める
- 2)load_plugin_textdomain()関数で、テキストドメインと翻訳ファイルのありかを設定する
- 3)ソース内で、__()関数や _e()関数などを使って翻訳対象の文字列を指定する
- 4)Poeditで .moファイル(翻訳ファイル)を作り、2で設定している翻訳ファイルのありかに配置する
こうしてみれば、プラグインの国際化は難しいというものではなく、
淡々と1つ1つやっていくだけ。
私の場合も一番面倒だったのが、
最初phpソース内の日本語であった文字列を __()関数などで英語文字列にして、その後Poeditで英語の文字列に対して元の日本語訳を入れる時に、元の日本語ってなんだっけ?となったケース。
Edit (編集)とか Search(検索)といった単純な単語なら良いですが、プラグインの説明のための文章とか設定画面のガイド文言など、ある程度長い文字列はソース内に必ず元の日本語をコメントとして残しておきましょう。
(でないと日本語⇒英語に訳す⇒その訳した英語から改めて日本語訳を考える、みたいな結構面倒なことになる(笑))
ではこれでプラグインの国際化もできました。
ネットビジネスでの進め方に迷っているとかブログの収益化の仕方が分からない、という場合には以下のメルマガも併せて見てみてくださいね。