WooCommerce に限らず WordPress の各種プラグインの日本語訳で変更したい場合などがあります。その場合は大きく二つの方法があります。
翻訳ファイルを作り直す
WordPress の翻訳のシステムは GUN の gettext 翻訳システムを採用しています。そのため、pot,po,moファイルを作ることによって翻訳されることになります。厳密にいうと翻訳に利用するファイルはmoファイルなのですが、暗号化されているので、各言語に対応できる基本ファイルであるpotファイルを作り、各言語毎で各言語で入力できるpoファイルを作り、moファイルに変換するという流れです。
そのファイル変換をするソフトがあり、日本でも多く使われている Poedit というのもがありますので、それで翻訳ファイルを作成することができます。
ただし、この方法はプラグインがアップデートされる度に翻訳ファイルを更新しないといけないので、あまりお勧めはしません。ここでは、紹介程度に留めておきます。
翻訳プラグインで対応する
次にプラグインやテーマの翻訳をするプラグインがあります。一昔前まではなかなか使い勝手が悪いプラグインでしたが、最近は良くなってきているようです。「Loco Translate」というのが一番メジャーですかね。ちょっとこの辺りは私もあまり使わないので、検索して調べてみてください。
プラグインをインストールして、使い方を調べてもらえると比較的簡単に使えます。
ただ、デメリットも少しだけあります。プログラム全体を読み込みデータベースから翻訳を引っ張りますので少しだけサーバー速度が遅くなります。ただ、プラグインの数は20個以上とか、翻訳文字数が半端ない物ではない限り、そこまで影響は出ませんので、サイト構築状況次第ということになります。なので、全然アリなやり方です。
ただ、コードでカスタマイズ出来るとその問題点が解決できるので、私は使っていない状態です。
コードでカスタマイズする方法
ここからが翻訳のカスタマイズの方法です。シンプルに二つのフックを使います。
フィルターフックの ‘gettext’ か ‘gettext_with_context‘ を使う方法です。使い方や使う翻訳の場所がありますので、その解説をします。
gettext の使い方
gettext は通常の PHP コードで書かれている翻訳に使います。
通常のgettext 翻訳システムとして、コンテキスト(説明)がない形となります。通常の場合、以下のようになっています。
__(‘Test’, ‘test-domain’)
_e(‘Test2’, ‘test-domain’)
このフックには以下の3つの変数があります。
- $translation – 翻訳後のテキスト
- $text – 翻訳前のテキスト(基本英語)
- $domain – プラグインやテーマで指定されている文字。text domain と言われてるもの
この3つによって、プラグイン毎での訳を変更することも可能です。一般的には統一して訳すので、最後の $domain は使わなくても大丈夫です。
以下は WooCommerce Subscriptions での翻訳を変更するコードです。
gettext_with_context の使い方
gettext とほぼ同じなのですが、コンテキスト(説明)をつける場合は gettext_with_context の場合は変数が4つになります。
また、実際のコードでは以下のようにコンテキストが入って、xが関数名の所に含まれます。
_x(‘Test’, ‘as test’, ‘test-domain’)
_xe(‘Test2’, ‘as test2’, ‘test-domain’)
ソースコードを見て確認する方法もありますが、WordPress.org に公開されているプラグインでしたら、翻訳のページの一覧を見てもらって、画像のように赤で囲んでいるような文字がある場合は、このタイプになります。
このフックには以下の4つの変数があります。
- $translation – 翻訳後のテキスト
- $text – 翻訳前のテキスト(基本英語)
- $context – コンテキスト(説明・属性)
- $domain – プラグインやテーマで指定されている文字。text domain と言われてるもの
ここでも、gettext のフィルターフックと同様に $domain と $context を設定しなくても翻訳の変更は可能です。
一般的なプラグインでは大抵が翻訳部分に関しては gettext フックの __() か _e() の関数しか使わないことが多いのですが、WooCommerce のように様々な拡張プラグインがあるとその拡張によって訳し方を統一した方がいい場合などが、同じ言葉を使う可能性が高いので説明や属性を与えて区別するためにコンテキストを利用する gettext_with_context フックを使う場合がありますので、注意が必要です。
訳を変更したい文字列がコンテキストを含むかどうかで使うフックが変わりますので、注意しましょう。
注意:$domain のテキストドメインですが、原文が一つしかない場合はドメインを設定すると何故か対応してくれない場合がありますので、その場合はテキストドメイン指定を外せば大抵が表示されます。これ、微妙に gettext のバグだなと思っているんですけど。。。