webサイトを多言語化する際は、moファイルというものを使用します。
moファイルはpoファイルから生成されたものであり、
通常はpoファイルを編集して、それをmoファイルに変換することで使用します。
※moファイルはバイナリファイルであり、エディタで開いて編集できるものではありません。
そして、その作業行う際に使用するソフトの中で、最もメジャーなものが「Poedit」になります。
このPoeditの役割をWordpress内で行えるようにしたものが「Loco Translate」になります。
今回はそんな Loco Translate の使用方法を、
Wordpressの有料テーマ「PremiumPress」の翻訳を元に説明していきます。
locotranslateの使用方法
Loco Translate をインストールすると、
管理画面のメニュー内に Loco Translate のメニューがでてきます。
今回であれば、 PremiumPress の翻訳を行いますので、
【テーマ -> Directory Theme】を選択した後に、【日本語】を選択します。
そうすると、上記画像の画面がでてきますので、そこから任意の行を選択して翻訳していきます。
目的の翻訳行を探す場合は、【翻訳を絞り込み】のボックスに、探したい日本語や英語を入力してください。
※後々判明しますが、登録されていても検索結果に出てこないものもあります。
【日本語の翻訳:】に任意の翻訳内容を入れ込んで【保存】ボタンを押せば翻訳完了です。
キャッシュ系のプラグインを入れている場合は、キャッシュを消すのを忘れないようにしましょう。
削除してはいけない文字列について
翻訳ファイルには、変更してはいけない文字列があります。
それが%s
%d
など、%
からはじまる文字列や、あからさまに不自然な%
のみの文字となります。
ここには、文字列や数値などが格納されており、不要だと思い削除すると、本来必要な内容が表示されなくなります。
%s
は%string
(文字列)の略、%d
は%digit
(数値)の略というように、
開発者にとって置き換え文字列がどの型式なのかをわかりやすくするために
%
の後に識別子であるs
やd
などをつけています。
例えば下記の場合について考えます。
英語 | %s has applied for a job interview. |
日本語 | %sは就職の面接に応募しました。 |
この場合、文脈から察するに%s
にはユーザー名が入る可能性が考えられます。
仮にユーザー名を「田中太郎」だと仮定した場合、日本語訳は下記のようになります。
田中太郎は就職の面接に応募しました。
そして、%関係の文字列は、削除はしてはいけませんが、%x
を据え置きして変更することは問題ありません。
例えば、上記の文章は下記のようにも変更できます。
日本語 | %s様|就職面接への応募が完了しました。 |
田中太郎様|就職面接への応募が完了しました。
もちろん、「就職面接への応募が完了しました|%s様」のように位置を移動させることも問題ありません。
文字列が見つからない場合(難易度:高)
翻訳ファイルを編集していると、まれに見つからない文字列があります。
その場合、テーマファイル内を閲覧して、
どのように翻訳が使用されているか検索する必要がでてきます。
そこで、今回は「String Locator」というプラグインを使用してテーマ内の文字列を検索してみます。
例題
例えば、 PremiumPress の詳細ページに下記の記述がありました。
「レビューを書くの最初になる」
このような日本語はありませんので、変更したいところです。
ですが、Loco translate で検索したところ、
「レビューを書く」は出てきても、
「レビューを書くの最初になる」や「の最初になる」は出てきません。
この場合は、先程紹介した String Locator にて検索して、
どのような構造になっているのかを調べる必要があります。
今回は、「レビューを書く」の翻訳が出てきたので、そちらを基準に考えます。
locotranslateで検索する
まず、「レビューを書く」を Loco translate で調べると下記のような結果になりました。
困ったことに、2つ出てきます。
どちらが目的の箇所で使用されている「レビューを書く」かわかりません。
わからない時は近くの文言で検索
そういう時は、近くにある別の文言で検索してみます。
今回であれば、同じブロック内の「ユーザーレビュー」という文字列で検索してみます。
これで目的の場所の近辺で「User Reviews」という文字列が使用されていることが判明しました。
String locatorで検索する
実際に、管理画面の【ツール -> String locator】から、下記の設定で検索をかけます。
検索するファイル | Directory Theme(premiumpressのこと) |
検索する文字列 | User Reviews |
実際の結果が下記になります。
色々と出てきますが、Premiumpressの場合は、
ファイルのcontent/themes/DT10
の後に
framework
language
と来るものは無視してください。
また、wordpressの翻訳データの呼び出しコードは、
__("英文","テーマやプラグイン名")
となりますので、
一番左の列(文字列)に上記の文章が含まれている行が翻訳を使用しています。
上記を踏まえて見ると、当てはまるものは最終行のみとなります。
ファイルの中身を見る
行にカーソルを当てると、一番左に【編集】という文字が出てきますので、
そちらをクリックして内容を見てみます。
<div class="_header">
<div class="_title w-100">
<?php echo __("User Reviews","premiumpress"); ?>
</div>
</div>
<div class="_content p-3">
<?php
$GLOBALS['single-data-block'] = "reviews";
echo _ppt_template( 'single/single-content-data-block' );
unset($GLOBALS['single-data-block']);
?>
3行目に「User Reviews」の文字列が見つかりました。
ただ、「レビューを書くの最初になる」に関する記述が見当たりません。
ここで見ていただきたいのは_ppt_template( 'single/single-content-data-block' )
です。
_ppt_template()
は察するに「PremiumPressTheme_Template」の略であると考えられます。
これで、premiumpress/single/single-content-data-block.php
を呼び出しています。
実際に、【外観 -> テーマファイルエディター】から見てみましょう。
正直、ここまで来るとPHP自体を知る必要が出てきますので、簡易的に説明します。
先程同様_ppt_template()
を使用して
premiumpress/single/xxx.php
を呼び出していることがわかります。
そして、その前にcase 'xxx'
という文字列(条件分岐)があり、
xxx
は、先程のコードのreviews
という箇所がそれに当てはまると考えられます。
$GLOBALS['single-data-block'] = "reviews";
echo _ppt_template( 'single/single-content-data-block' );
エディタ内で検索Ctrl+F
してみると下記のような記述が見つかりました。
上記から、premiumpress/single/single-content-data-reviews.php
というファイルを呼び出していることがわかります。
上記のファイルから、今度は下記の双方を検索します。
今回は「write a review」がヒットしました。
そして、その後に「Be the first to %s」があります。
つまり、
「レビューを書くの最初になる」は
「write a review」と「Be the first to %s」を
組み合わせたものであるということがわかりました。
上記コードについて
少し話はそれますが、上記コードの対象箇所を整理すると下記のようになります。
echo str_replace(
"%s",
'<a href="javascript:void(0)" '.$link.' class="text-underline text-dark text-500">'.__("write a review","premiumpress").'</a>',
__("Be the first to %s","premiumpress")
);
str_replace(
'検索文字列',
'置換文字列',
'対象文字列'
)
対象文字列から、検索文字列を見つけ出し、置換文字列に置換える
検索文字列 | %s |
置換文字列 | '<a href="javascript:void(0)" '.$link.' class="text-underline text-dark text-500">'.__("write a review","premiumpress").'</a>' |
対象文字列 | __("Be the first to %s","premiumpress") |
上記の場合、字面だけで見ると最終的に下記になります。
「Be the first to write a review」
前項の話になりますが、翻訳系のサイトでは、
このように%x
を置換えているため%
関係の取り扱いに注意する必要があります。
また、コードの冒頭にあるecho
は「呼び出す」という命令になりますので、削除すると対象箇所に何も表示されなくなります。
再度locotranslateで検索する
実際に loco translate で「Be the first to %s」を検索してみます。
出てきました!
ただ、「最初」や「最初になる」で調べても出てこなかったので、
Loco translate での検索が絶対ではないということが判明しました。
どうするか決める
また「レビューを書くの最初になる」を
「最初のレビューを書く」にしたい場合は問題ないのですが、
「レビューを書く」だけにしたいという要望があるかもしれません。
その場合は、PHPファイルを変更する必要があり、下記のリスクを伴います。
# PHPファイルを変更することのリスク
- テーマが更新されてもアップデートできない
実際はできますが、子テーマに関する技術と知識が必要です。 - PHPファイルを編集する必要がある
失敗したらサイトが真っ白になります。
ベストプラクティスとしては、「子テーマを作成し翻訳を進めていく」ですが、
すべての人がそれを実現できるわけではありませんので、
どうするかは個々で決めていただく必要があります。
ただし、子テーマにした場合は、親テーマの対象のファイルがアップデートされた場合、
子テーマの対象ファイルもアップデートする必要があることは念頭においてください。
実際に変更してみる
今回の場合、気をつけないといけないことは下記となります。
2つの翻訳を組み合わせている場合の注意点
2つの翻訳を組み合わせているということは、
別の場所で単体で使用されている可能性があるということです。
そのため、その点を念頭に入れて翻訳を進める必要があります。
不安であれば、それぞれの英文を再度 String locator で調べてみてください。
echo __("英文", "テーマやプラグイン名")
のが一つしかない場合は、
変更して問題ないと考えていいでしょう。
上記の記述が2つ以上ある場合や、
$hoge = __("英文", "テーマやプラグイン名")
のような場合は、
複数箇所で使用されている可能性もあるので、下手に変更すべきではないでしょう。
変更する
今回の場合を再度確認します。
文言は「レビューを書くの最初になる」、コードは下記の通り。
echo str_replace(
"%s",
'<a href="javascript:void(0)" '.$link.' class="text-underline text-dark text-500">'.__("write a review","premiumpress").'</a>',
__("Be the first to %s","premiumpress")
);
これを「最初のレビューを書く」に変更してみます。
詳しく書くと、この文字列が出力されます。
Be the first to <a href="javascript:void(0)" onclick="processCommentPop();" class="text-underline text-dark text-500">write a review</a>
まず、「レビューを書く(write a review)」の箇所はa
タグで囲まれていますので、変更しないほうが良いでしょう。
なので、「最初の」が必要になります。
「Be the first to %s」は現在下記のように翻訳されています。
上記の翻訳を「%sの最初になる」から「最初の%s」に変更すれば、
「最初のレビューを書く」になることが予想されます。
実際にやってみます。
【日本語 の翻訳:】の箇所に、今回であれば「最初の%s」を入れ、
最後に【保存】ボタンを押します。
キャッシュ系のプラグインを入れている場合は、キャッシュを消すのを忘れないようにしましょう。
ちゃんと変更されていますね!
これで翻訳完了となります。
最後に
いかがでしたでしょうか?
普通に翻訳する分には問題ないのですが、
これまで色々とプラグインやテーマなどの翻訳ファイルを編集してきた経験からいうと、
普通に翻訳できない場合(複数の翻訳を組み合わせている)が多数あります。
そういった場合に、この記事を少しでもご参考いただけるとありがたいです。
それでは、Wordpressで翻訳をする際のポイントです。
# point
%
関係の文字列には十分注意する- 文字列が見つからない場合は、テーマ内を検索する
- 翻訳対象が2つあって、どちらが対象かわからない場合は、近くの文字で検索してみる
- 翻訳に関するコードは
__("英文","テーマやプラグイン名")
- 2つの翻訳を組み合わせている場合は十分注意する
それでは、良いWPライフを!