お問い合わせはコチラから

【WordPress】翻訳ファイルをfilterフックで書き換える方法【使えるメモ】

サイト運営

WordPressを日本語環境にしている場合、プラグインの表記を英語で使う方法はないのか?と調べて結構ハマったのでその時のメモです。

結論から言いますよ。

多言語化してあるテーマやプラグインを特定の言語に変更する正統派の手段はWordPressの言語設定を特定の言語に変えることです。こうすれば間違いありません。

しかし、それだと管理画面が日本語以外の言語になってしまうので、それはイヤだ!となる人は結構多いのではないかと思います。

そこで、この記事では管理画面の言語設定は日本語のまま、翻訳ファイルも書き換えず、フィルターフックを使い、function.phpのカスタマイズで翻訳内容を書き換える方法をご紹介します。

プラグインの翻訳ファイルの確認

プラグインなどが多言語化されているとすると、poファイルを使っていると思います。

poファイルはどこにあるでしょうか?

ココです。

wp-content/languages/plugins/プラグイン名.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を使います。

gettext – Hook | Developer.WordPress.org
Filters text with its translation.

コンテキストなしの場合、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を使います。

gettext_with_context – Hook | Developer.WordPress.org
Filters text with its translation based on context information.

コンテキストありの場合は、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についてはなかなか情報が無く困ったのでまとめておきました。

この記事を書いた人
ブーン

はるばる日本よりオランダ王国へやってまいりました。
自分の経験が少しでも参考になれば嬉しいです。
お問い合わせは、『こちら』からお願い致します。

\ブーンをフォロー/
スポンサーリンク
サイト運営
\シェアお願いします!/
\ブーンをフォロー/
こんな記事も読まれています

失敗しないレンタルサーバーランキング

mixhost

不正アクセスに強くて使いやすいおススメサーバー
\本サイトで利用中/
メリット①:自動ウィルス駆除対応
メリット②:サイトの表示速度が速い!
メリット③:転送量の上限が多い!
メリット④:自由にプラン変更ができ、アクセス増にも対応できる!
メリット⑤:バックアップデータが無料で復元できる!
メリット⑥:Wordpressが簡単にインストールできる!
メリット⑦:どのプランでも初期費用が無料!
メリット⑧:10日間の無料お試し期間と30日の返金保証!

Conoha Wing

国内Wordpress最速の最強サーバー
メリット①:圧倒的な表示速度
メリット②:レンタルサーバーと独自ドメインがセットでお得◎
メリット③:プラン変更はすべてのプランで自由自在
メリット④:一か月の利用転送量の制限が緩い(9TB~)
メリット⑤:WordPresサイトの移行が簡単

エックスサーバー

国内シェアNo1の安定性と実績が魅力。ALL SSDで死角なしの万能サーバー。
メリット①:サイトの表示速度が安定して速い!
メリット②:アクセス負荷に強くて安定性が高い!
メリット③:24時間365日の充実サポートで安心!電話サポートもあり!
メリット④:転送量が多い!
メリット⑤:自動バックアップ機能付き!
メリット⑥:WordPressが簡単にインストールできる!
メリット⑦:10日の無料お試し期間がある!

タイトルとURLをコピーしました