qtranslateと干渉して、Trust Formのエラーメッセージが英語になってしまう原因を調べてみた

WordPress で qtranslateTrust Form を利用しているサイトで、Trust Form のエラーメッセージが英語になってしまうんですけどという相談を受けたので、どうにかならないものかと調べてみました。

これが発生する原因は、qtranslate のデフォルトの表示言語の読み込みと、Trust Form の」翻訳ファイルの読み込み、エラーメッセージの定義のタイミングが関係しています。

詳しく解説すると、

  1. qtranslate のプラグインファイルが読み込まれる
  2. qtranslateが表示言語を取得値を変更するためのフックが追加される
    ※ この段階では、qtranslateのデフォルト言語の読み込みなされていないため、言語表示の設定がNULLとなっている
  3. Trust Form のプラグインファイルが読み込まれる
  4. Trust Form の読み込みと同時に、翻訳のための言語ファイルが読み込まれる
  5. また、同時にエラーメッセージの定義が行われる
  6. plugin_loadedフックにおいて、qtranslateのデフォルト言語設定が読み込まれ表示言語が変更される(優先度は2)

つまり、わずかな間ではあるものの、2から6までの実行の間においては、get_loacaleの返値がNULLになっていて、en-USであるとの判定となり、日本語の翻訳ファイルが読まれないこと、そして、エラーメッセージの定義も、この段階で行われるため、いかなる言語表示にしている場合でも英語で定義されてしまうのです。

この中で一番の問題は、qtranslate の言語設定のフック追加の後にデフォルト言語の読み込みが行われアキがあることです。Trust Formの翻訳ファイル読み込みタイミングが適切かどうかも検証してみましたが、翻訳ファイルの読み込みを行なっている load_plugin_textdomain の codex には、plugin_loadedフック程度のタイミングで実行してください。とありますので、間違っているとは言えません。

ただし、このような問題が起こりえるという事も鑑み、翻訳ファイルの読み込みやプラグインのロジック実行は、plugin_loaded 以降にした方がよりよいのかもしれません。私自身がリリースしているプラグインでも、プラグイン読み込みと同時に翻訳ファイルの読み込みを行なっているものがあるため、今度修正しようと思っています。

現状バージョンでの対応方法ですが、plugin_loaded以降のタイミングで、Trust Formを再度インスタンス化し、エラーメッセージを上書きすることで解消可能です。サンプルのCODE 1では、テーマのfunctions.phpでも有効となるよう、after_theme_setup にフックを追加しています。
この方法は、Trust Formでは有効なものの、これより早いタイミングで、何らかのフックを行なっているプラグインでは、正しく動作しない可能性もありますので、ご注意ください。

これと同じ現象は、Trust Form ではなくとも qtranslate より遅く読み込まれるプラグイン(プラグイン名がwpで始まるもの多いですしね)では、発生し得ますので、頭の片隅に留めておくといいかと思います。

CODE 1

 function trust_form_validator_message_override() {
    global $Trust_Form_Validator_Message;
	
	new Trust_Form();
    $Trust_Form_Validator_Message = array(
        'required'   => __("Please fill required field", TRUST_FORM_DOMAIN),
        'hiragana'   => __("Please enter by using Japanese hiragana", TRUST_FORM_DOMAIN),
        'minlength'  => __("Please enter more than __minlength__ charactors", TRUST_FORM_DOMAIN),
        'maxlength'  => __("Please enter within __maxlength__ charactors", TRUST_FORM_DOMAIN),
        'bothlength' => __("Please enter more than __minlength__ within __maxlength__ charactors", TRUST_FORM_DOMAIN),
        'zenkaku'    => __("Please enter by using multibyte charactor", TRUST_FORM_DOMAIN),
        'eiji'       => __("Please enter by using English", TRUST_FORM_DOMAIN),
        'number'     => __("Please enter by using number", TRUST_FORM_DOMAIN),
        'katakana'   => __("Please enter by using Japanese katakana", TRUST_FORM_DOMAIN),
        'hankaku'    => __("Please enter by using English or number", TRUST_FORM_DOMAIN),
        'hankaku2'   => __("Please enter by using English or number or code", TRUST_FORM_DOMAIN),
        'e-mail'     => __("The format of the e-mail address is invalid", TRUST_FORM_DOMAIN),
    );
}
add_action( 'after_setup_theme', 'trust_form_validator_message_override', 1000 );

[2012.9.21追記]
CODE 1だと、管理画面で Trust Form のメニューが2つになってしまうので、修正
CODE 2

 function trust_form_validator_message_override() {
    global $Trust_Form_Validator_Message;

	if ( is_admin() || ! class_exists( 'Trust_Form' ) ) { return; }
	new Trust_Form();
	$Trust_Form_Validator_Message = array(
        'required'   => __("Please fill required field", TRUST_FORM_DOMAIN),
        'hiragana'   => __("Please enter by using Japanese hiragana", TRUST_FORM_DOMAIN),
        'minlength'  => __("Please enter more than __minlength__ charactors", TRUST_FORM_DOMAIN),
        'maxlength'  => __("Please enter within __maxlength__ charactors", TRUST_FORM_DOMAIN),
        'bothlength' => __("Please enter more than __minlength__ within __maxlength__ charactors", TRUST_FORM_DOMAIN),
        'zenkaku'    => __("Please enter by using multibyte charactor", TRUST_FORM_DOMAIN),
        'eiji'       => __("Please enter by using English", TRUST_FORM_DOMAIN),
        'number'     => __("Please enter by using number", TRUST_FORM_DOMAIN),
        'katakana'   => __("Please enter by using Japanese katakana", TRUST_FORM_DOMAIN),
        'hankaku'    => __("Please enter by using English or number", TRUST_FORM_DOMAIN),
        'hankaku2'   => __("Please enter by using English or number or code", TRUST_FORM_DOMAIN),
        'e-mail'     => __("The format of the e-mail address is invalid", TRUST_FORM_DOMAIN),
    );
}
add_action( 'after_setup_theme', 'trust_form_validator_message_override', 1000 );

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です