日本語サイトをベースに英語サイトを作成したとき、英語サイトのテーマディレクトリに翻訳ファイル(en_US.mo)を設置しました。
けれど、デバッグしてみると翻訳ファイルが読み込まれない。
その原因の調査結果、解決策です。(WordPress 4.8.1 - 4.9.6)
間違った設定を行っていないか確認
まず、設定が間違っていると調べる意味はないので確認します。
内容は次の通りです。
- __() or _e()は使っているか?
- __() or _e()の第2引数にドメインテキストが指定されているか?
- functions.phpの定義に間違いはないか?
- 翻訳ファイルの設置場所に間違いはないか?
__() or _e()の使い方に間違いはありませんでした。
使い方はまちがってません。次にfunctions.phpの定義を確認しました。
内容に問題はありません。そもそも、前に別のテーマで使っていた定義をコピペしてきたものなので間違いはないはずです。
そのときは英語のテーマを日本語に翻訳したのですが、正常に動作していました。
英語用翻訳ファイルen_US.moファイルは、DocumentRoot/wp-content/themes/domain_name/languages/に設置しています。
設定に間違いありません。
こうなったらWordPressのソースを追跡する
この設定でなぜ翻訳ファイルが読み込まれないのか分かりません。悩んでてもラチがあかないのでソースコードを追います。
まずは、load_child_theme_textdomain()です。
load_child_theme_textdomain()
ここでは、.moファイルの設置パスが未指定の場合、テーマのホームディレクトリを設定しているだけです。
次へ行きましょう。
load_theme_domain()
$localeでは、日本語サイトはjp、英語サイトではen_USになります。
問題は、31行目のload_textdomain()です。ここでは、テーマディレクトリではなく、Document/wp-content/languages/themes/のdomain_name-en_US.moファイルを読み込もうとします。
デバッグをしたところ必ずtrueが返ってきます。指定したパスの.moファイル読み込みは、最終行で行われるので、これでは.moファイルを読み込むはずもありません。
load_textdomain()を見てみましょう。
load_textdomain()
問題は33行目です。
これが必ずtrueを返します。これでは、設置した翻訳ファイルの内容が反映されません。
うしろの処理が行われません。
- .moファイルを読み込む
- オブジェクト(new MO)にマージした結果を格納
- グローバル変数$l10n[]に挿入
この行は、.moファイルの読み込みの上書きを無効にするかをフィルタリングします。
3番目の引数で上書きしない(false)にしているので、デフォルトはfalseを返すはずです。
ということは、別のどこかで'override_load_textdomain'のフックに対してtrueを返すようにしているのでは?と気づきました。
そこで、WordPressのDocumentRootディレクトリ全域で検索をかけました。
すると、BackWPupプラグインで "add_filter( 'override_load_textdomain', '__return_true' );" を記述している箇所が2つもありました。
テーマのfunctions.phpを修正する
これを修正する方法はかんたんです。テーマのfunctions.phpファイルに次の1行を追加します。
add_filterの第2引数で'__return_false'を指定すると、フィルタの関数で必ずfalseを返すようになります。
まとめ
原因はBackWPupプラグインにありました。プラグインの記述でテーマの翻訳ファイルにまで影響していました。
あとは自分のWordPressに対する知識不足でしょう。この投稿を最初に書いたときはWordPressを使い始めて間もないころで不慣れでした。
filterの使い方をあまり知らずに書いたため、必要のない暫定処理を書いていました。
きちんとした修正方法が見つかったので、これでWordPressのアップデートがあっても大丈夫です。
(暫定処理はWordpressのソースを直接編集していた。)
2018/07/18
暫定措置の内容を残そうとも思いましたが、最終的にたどり着いた原因・対策とかけ離れているので、ぜんぶ削除しました。
WordPress 4.8.2 にバージョンアップしたので同じような暫定措置を入れました。
WordPress 4.8.3にバージョンアップしたので同じような暫定措置を入れました。