WordPressを日本語環境にしている場合、プラグインの表記を英語で使う方法はないのか?と調べて結構ハマったのでその時のメモです。
結論から言いますよ。
多言語化してあるテーマやプラグインを特定の言語に変更する正統派の手段はWordPressの言語設定を特定の言語に変えることです。こうすれば間違いありません。
しかし、それだと管理画面が日本語以外の言語になってしまうので、それはイヤだ!となる人は結構多いのではないかと思います。
そこで、この記事では管理画面の言語設定は日本語のまま、翻訳ファイルも書き換えず、フィルターフックを使い、function.phpのカスタマイズで翻訳内容を書き換える方法をご紹介します。
プラグインの翻訳ファイルの確認
プラグインなどが多言語化されているとすると、poファイルを使っていると思います。
poファイルはどこにあるでしょうか?
ココです。
各plugin毎にpoという拡張子を持つ翻訳ファイルがあると思います。
このファイルの中で翻訳前後の対応表が定義されているわけです。
まず、poファイルの書式から見ていきます。
ざっくり、こんな感じの見た目です。
# @ text_domain
#: inc/hohoho-widget.php:165
msgid "General Settings"
msgstr "一般設定"
# @ text_domain テキストドメイン名
#: hogehoge 翻訳箇所のソース位置を示しているようです
msgid: 翻訳前の文字列
msgstr:翻訳後の文字列
このフォーマットは、__()を使って多言語化している場合だと思います。
_x()を使って多言語化している場合は別の書式になります。
msgctxtが追加されています。
# @ text_domain
#: inc/hogehoge.php:738
msgctxt "event meta"
msgid "n/j"
msgstr "n月j日"
このファイルを書き換えれば翻訳内容を変更することができますが、poファイルが上書きされてしまうと元に戻ってしまいます。
翻訳ファイルカスタマイズ方法
poファイルで定義されている翻訳内容をファイルを書き換えずに変更するカスタマイズについて説明します。
参考:https://wordpress.stackexchange.com/questions/266432/implementing-conditional-gettext-translation
poファイルの中で見かける翻訳定義は大きく2通りです。
- contextあり(_x())
- contextなし(__())
どちらが使われているかでカスタマイズ方法が違います。
__()の場合、コンテキストなし
コンテキストなしの場合は、gettextを使います。
コンテキストなしの場合、poファイルで以下のように翻訳内容が定義されている場合を例に説明します。
# @ text_domain
msgid ‘Message’
msgstr ‘Contact Us’
つまり、コンテキストはなしで置き換え前のテキストが’Message’で、置き換え後のテキストが’Contact Us’になります。
function.phpに以下のように付け加えます。
add_filter( 'gettext', 'um_rename_messagetxt', 10, 3);
function um_rename_messagetxt( $translation, $text, $domain ) {
if ( 'text_domain' === $domain ) {
if ( 'Message' === $text ) {
$translation = 'Contact Us';
}
}
return $translation;
}
TCDの翻訳ファイルの場合
TCDテーマの場合は、以下のようになっていますので、少し変更が必要です。
__('Project', 'tcd-w')
add_filter( 'gettext', 'um_rename_messagetxt', 10, 3);
function um_rename_messagetxt( $translation, $text, $domain ) {
if ( 'tcd-w' === $domain ) {
if ( 'Project' === $text ) {
$translation = '置き換えたい名前';
}
}
return $translation;
}
_x()の場合、コンテキストあり
コンテキストありの場合は、gettext_with_contextを使います。
コンテキストありの場合は、poファイルで以下のようなケースに相当します。
# @ text_domain
msgctxt ‘for use in footer text’
msgid ‘Message’
msgstr ‘Message Us’
つまり、コンテキストが、’for use in footer text’で置き換え前のテキストが’Message’で、置き換え後のテキストが’Message Us’になります。
function.phpに以下のように付け加えます。
add_filter( 'gettext_with_context', 'wpse_gettext_with_context', 10, 4 );
function wpse_gettext_with_context( $translation, $text, $context, $domain ) {
if ( 'text_domain' === $domain ) {
if ( 'Message' === $text && 'for use in footer text' === $context ) {
$translation = 'Message Us';
}
}
return $translation;
}
gettextフックで解決できない例
実際自分がやろうとしてgettextで置き換えられない例もありました。
たとえば、月を表示するときに、日本語だと1月、2月、・・・と行きますが、同じソース記述で英語設定だとJan、Feb、Mar・・・と表示されます。こういうのは翻訳ファイルじゃなく、Wordpress内部で言語設定毎に処出力内容が変わっているのでgettextフックではどうしようもありません。
本気でやるならば、__()や_x()が書かれているphp側のソースファイルを変更する必要があります。
まとめ
翻訳ファイルを使って多言語化したプラグインやテーマを翻訳ファイルを修正せずにフックで修正する方法を紹介しました。少し調べるとgettextについては出てくるのですが、gettext_with_contextについてはなかなか情報が無く困ったのでまとめておきました。