「Download Monitor」プラグインを使い始めて、何だか設定画面の翻訳が変(分かりづらい)と思い、再翻訳をした後、本体の翻訳と共に自身の翻訳が変更になってしまうのを避けるため、いつも通り?load_textdomain_mofileフックを使って上書きしようとしたところ、なぜかDownload Monitorプラグインではうまくいきませんでした。
まあ、WordPressの翻訳ディレクトリに入れて、更新されたらまた上書きして..でもいいかとも思いつつ、やっぱり原因を調べて解決しておきたいと思い、いろいろとやってようやく解決できたので公開しておきます。
まずはきちんと翻訳ファイルが読み込まれるかを確認するため、プラグインのlanguagesフォルダへ「download-monitor-ja.mo」を設置し、WordPressの翻訳ディレクトリにある「download-monitor-ja.mo」をリネーム、これで通常であれば、プラグインのlanguagesフォルダにあるファイルが読み込まれて日本語化されるはず..が、うまくいきませんでした。
翻訳の読み込みがされていない(翻訳読み込み用プログラムがない)から、WordPressの翻訳ディレクトリにある場合のみ適用されるのだろうと推察し、書かれているコードを見てみました。
Download Monitorのバージョン4.9.5では、翻訳ファイルのロードは、「/src/DLM.php」の237行目に書かれていました。以下のコードがその部分です(分かりやすくするために注釈を入れています)。
/**
* Load Textdomain
*
* @since 4.7.72
*/
private function load_textdomain() {
$dlm_lang = dirname( DLM_FILE ) . '/languages/';
if ( get_user_locale() !== get_locale() ) {//ユーザーの言語がサイト言語と違う場合
unload_textdomain( 'download-monitor' );//テキストドメインを無効にする
$locale = apply_filters( 'plugin_locale', get_user_locale(),
'download-monitor' );//ユーザー言語をセット
$lang_ext = sprintf( '%1$s-%2$s.mo', 'download-monitor', $locale );
$lang_ext1 = WP_LANG_DIR. "/download-monitor/download-monitor-{$locale}.mo";
$lang_ext2 = WP_LANG_DIR. "/plugins/download-monitor/{$lang_ext}";
//WP翻訳ディレクトリ→download-monitorディレクトリの中に翻訳ファイルがある
if ( file_exists( $lang_ext1 ) ) {
load_textdomain( 'download-monitor', $lang_ext1 );
//WP翻訳ディレクトリの中に翻訳ファイルがある
} elseif ( file_exists( $lang_ext2 ) ) {//
load_textdomain( 'download-monitor', $lang_ext2 );
//どちらにも翻訳ファイルがない
} else {
load_plugin_textdomain( 'download-monitor', false, $dlm_lang );
}
//ユーザーの言語がサイト言語と同じ場合
} else {
load_plugin_textdomain( 'download-monitor', false, $dlm_lang );
}
}
ユーザーのロケール(言語設定)が「サイトデフォルト」のまま(ユーザープロフィールで確認)だと、値がないので、「ユーザーの言語がサイト言語と違う場合」が適用され、そちらの判断で翻訳が適用されるようになっているようです。
そして前処理として、unload_textdomainで翻訳を一旦なしにした上で、再びユーザーロケールをロケールとしてセットしています
続きの処理順を文字にしてみると..
- WP_LANG_DIR(wp-content/languages)/download-monitorにdownload-monitor-ja.moがあれば、そのファイルを翻訳として適用
- WP_LANG_DIR(wp-content/languages)/plugins/download-monitor/にdownload-monitor-ja.moがあれば、そのファイルを翻訳として適用
- どちらもなければload_plugin_textdomainで/plugins/download-monitor/languages内のdownload-monitor-ja.moを翻訳ファイルとして適用
なので、どこにもなければ、通常通り以下のように読み込まれるはず..
- プラグインフォルダ→「languages」内にdownload-monitor-ja.moがあれば適用
- wp-content/languages/plugins内にdownload-monitor-ja.moがあれば上書き
- load_textdomain_mofileフックで任意の場所の翻訳ファイルを上書き
なのですが、なぜか3が効かないという状況でした。
試しに、ユーザーの言語を「日本語」にした上で、$lang_ext1や$lang_ext2の条件の通りにしてみたものの、うまくいきませんでした。コードを見る限り何も問題はなさそうなのにねぇ..という感じでした。
いろいろ試した結果、以下のように処理を一旦無効にした上で、通常通り適用させてみたところ、うまく上書きできるようです。
- 一旦これらの処理を含め、unload_textdomainで翻訳の適用を無効にする
- 改めて翻訳ファイルを読み込むための処理を行う
実際にテーマのfunctions.phpへ追加したのが以下のコードです。
/***** Download Monitor 翻訳ファイルの適用 *****/
/* 一旦翻訳をアンロード */
function pwcn_unload_download_monitor_textdomain() {
unload_textdomain( 'download-monitor' );
}
add_action( 'after_setup_theme', 'pwcn_unload_download_monitor_textdomain' );
/* 通常ロードさせる */
function pwcn_download_monitor_language_setup(){
load_plugin_textdomain('download-monitor', false, content_url() . '/plugins/download-monitor/languages');
}
add_action('after_setup_theme', 'pwcn_download_monitor_language_setup');
前半はアンロードの処理、後半は通常の翻訳ファイルを読み込む処理です。
テーマのfunctions.phpへ入れ、after_setup_themeへフックさせていますので、自作プラグインなどで措置をするときはよしなに変えてくださいね。
補足:コードを見て一瞬日本語ロケールは「_JP」のない「ja」オンリーだからでは?と思いましたが、結局何も訪ね当たらないのでload_plugin_textdomainで読み込まれるはず、そこにload_textdomain_mofileでフックさせるのだから問題ないはずなのですが..結局なんでだろうというのは残ってしまいました..。
コメントを残す