9件の返信を表示中 - 1 - 9件目 (全9件中)
  • 4か月も前の投稿なので、もはや回答は不要かもしれませんが・・・
    最近、この件をまとめましたので参考にしてみてください。
    ユーザー登録時のエラーメッセージの制御(翻訳不可文字列の対応)

    トピック投稿者 firth

    (@firth)

    yah!!さん、
    ご返信ありがとうございます。

    2点確認したいのですが、
    このコードは具体的にどこに記述するのがよいのでしょうか?
    functions.phpではないかも・・と思いました

    また、私の希望としては、プロフィール画面のエラーの英語表記の
    変更なのですが、コアファイルなどを
    いじることなく、プロフィールのエラーを日本語化することが出来る
    ということで大丈夫なのでしょうか?

    ご紹介した記事は、Theme My Loginを使って登録フォームを作成するシリーズの一部分です。
    そこから紹介すべきでした。失礼いたしました。

    この記事は、入力項目のバリデートを紹介した記事の続きとなっています。
    「新規ユーザー登録時のバリデート」のコードをfunctions.phpに記述します。
    バリデートがエラーメッセージをはきだしますので、そのロジックに追加記述することで英語のままの文字列をお好みの日本語に置換しているということです。

    必要に応じて編集する必要がありますが、functions.phpに記述するfunctionはバリデート部分と英語→日本語置換部分とをマージして以下のような感じになります。

    /***********************************************
    * 新規ユーザー登録時のバリデート
    ***********************************************/
    function tml_registration_errors( $errors ) {
    
    	$tel_format="/^[0-9]{2,3}\-[0-9]{3,4}\-[0-9]{3,4}$/";
    
    	if ( empty( $_POST['last_name'     ] ) ) $errors->add( 'empty_last_name',      '<strong>エラー</strong>: お名前を入力してください');
    	if ( empty( $_POST['user_name_kana'] ) ) $errors->add( 'empty_user_name_kana', '<strong>エラー</strong>: お名前フリガナを入力してください' );
    	if ( empty( $_POST['user_tel'] ) ) {
    		//電話番号が入力されていな場合のエラー
    		$errors->add( 'empty_user_tel',       '<strong>エラー</strong>: 電話番号を入力してください' );
    	} else {
    		//電話番号は入力されているが書式が間違っている場合のエラー
    		if ( !preg_match($tel_format,$_POST["user_tel"]) ) {
    			$errors->add( 'error_user_tel',   '<strong>エラー</strong>: 電話番号の書式が間違っています' );
    		}
    	}
    	if ( !empty( $_POST['user_fax'] ) && !preg_match($tel_format,$_POST["user_fax"]) ) {
    		//FAX番号は入力されているが書式が間違っている場合のエラー(空はOK)
    		$errors->add( 'error_user_fax',   '<strong>エラー</strong>: FAX番号の書式が間違っています' );
    	}
    	if ( empty( $_POST['user_confirm'  ] ) ) $errors->add( 'empty_user_confirm',   '<strong>エラー</strong>: 会員規約に同意をチェックしてください' );
    
    	// tml_registration_errors に追記部分
    	$rep1 = array();
    	$rep2 = array();
    	array_push($rep1, "<strong>ERROR</strong>");
    	array_push($rep2, "<strong>エラー</strong>");
    	array_push($rep1, "Please enter your password twice.");
    	array_push($rep2, "パスワードを2回入力してください。");
    	array_push($rep1, "Please enter the same password in the two password fields.");
    	array_push($rep2, "パスワードは同じものを2回入力してください。");
    	array_push($rep1, "This username is already registered, please choose another one.");
    	array_push($rep2, "同じメールアドレスがすでに登録されているため、ユーザー名を確定できません。");
    	array_push($rep1, "ユーザー名を入力してください。");
    	array_push($rep2, "ユーザー名を確定できません。メールアドレスを入力してください。");
    	$custom_error = new WP_Error();
    	foreach ( $errors -> errors as $key => $val ) {
    		$tmp = str_replace($rep1,$rep2,$val[0]);
    		$custom_error -> add($key, $tmp);
    	}
    	return $custom_error;
    //	return $errors;
    
    }
    add_filter( 'registration_errors', 'tml_registration_errors' );

    functions.phpの記述で完結できますので、コアファイル等は使用する必要はありません。

    しかしながら、これは登録時のエラーをフックする方法です。
    firthさんのトピックを見ると、プロフィールページということでしたね。
    user_profile_update_errorsというフックがあるようです。
    試していませんが、add_filterのところをuser_profile_update_errorsにフックするようにすればよいのかもしれません。
    参考に。

    トピック投稿者 firth

    (@firth)

    yah!!さん
    たびたび失礼します。

    yah!!さんが上記のコードでも記述してくださっている通りですが、
    まさしくプロフィールのパスワードとメールアドレスの部分だけが
    英語表記のままとなってしまいます。

    そこで、yah!!さんのサイトやここでのお話をもとに、
    プロフィールの英語表記について以下のようなコードを
    functions.phpに記述したのですが、
    特に変化が見られませんでした。

    <?php
    function tml_registration_errors( $errors ) {
    
        $rep1 = array();
        $rep2 = array();
        array_push($rep1, "<strong>ERROR</strong>");
        array_push($rep2, "<strong>エラー</strong>");
        array_push($rep1, "Please enter your password twice.");
        array_push($rep2, "パスワードを2回入力してください。");
        array_push($rep1, "Please enter the same password in the two password fields.");
        array_push($rep2, "パスワードは同じものを2回入力してください。");
        array_push($rep1, "This username is already registered, please choose another one.");
        array_push($rep2, "同じメールアドレスがすでに登録されています。");
        $custom_error = new WP_Error();
        foreach ( $errors -> errors as $key => $val ) {
            $tmp = str_replace($rep1,$rep2,$val[0]);
            $custom_error -> add($key, $tmp);
        }   
    
        return $custom_error;
        return $errors;
    }
    add_filter( 'user_profile_update_errors', 'tml_registration_errors' );
    ?>

    なにか他に書き加える必要などあるのでしょうか?
    やはりコアファイルを書き換える必要があるのでしょうか?
    もしよろしければご意見をいただけますと幸いです。

    トピック投稿者 firth

    (@firth)

    何度もすいません。
    報告という形になるのですが、

    yah!!さんがこのトピックで提示してくださいましたコードを
    add_filterのところを
    registration_errorsから
    user_profile_update_errorsに変更して
    貼り付けてみました。

    その結果、
    エラー: お名前を入力してください
    エラー: お名前フリガナを入力してください
    エラー: 電話番号を入力してください
    エラー: 会員規約に同意をチェックしてください
    というのが表示されましたが、
    パスワードとメールアドレスのエラーは英語表記のままでした。

    また、英語表記でのエラーなのですが、
    私の画面では、
    ERROR: You entered your new password only once.
    ERROR: Please enter the same password in the two password fields.
    ERROR: Please enter an e-mail address.
    というように表示され、
    yah!!さんの提示して下さっているコードと
    若干の違いが見られました。
    これらも、英語表記が変化しない原因なのでしょうか。

    この後も自分で調べてみたのですが、
    やはり変更方法がわからないので、
    もしわかるようでしたら、教えていただけますと幸いです。

    firthさん、コメントしてくださったいたのに気付いていませんでした。
    大変失礼いたしました。

    return $custom_error;
        return $errors;

    の2行目ですが、これを削除(もしくはコメントアウト)していただくとどうなるでしょうか。
    この$errorsは置換前の英語が含まれる配列ですから、これはreturnしません。

    トピック投稿者 firth

    (@firth)

    yah!!さん
    こちらこそ、返信が遅くなってしまい、
    大変申し訳ありませんでした。

    return $custom_error;
    return $errors;

    の2行を削除したのですが、
    特に変化は見られませんでした。

    ご報告という形になってしまいましたが、
    よろしくお願い致します。

    実装してみました。
    以下のコードで出来ました!(私の環境では・・・)

    //プロフィール編集時のエラー
    	function tml_profile_errors( $errors ) {
    		$rep1 = array();
    		$rep2 = array();
    		array_push($rep1, "<strong>ERROR</strong>");
    		array_push($rep2, "<strong>エラー</strong>");
    		array_push($rep1, "You entered your new password only once.");
    		array_push($rep2, "新しいパスワードが1回しか入力されていません。");
    		array_push($rep1, "Please enter the same password in the two password fields.");
    		array_push($rep2, "パスワードは同じものを2回入力してください。");
    		array_push($rep1, "Please enter an e-mail address.");
    		array_push($rep2, "メールアドレスをご入力ください。");
    
    		foreach ( $errors -> errors as $key => $val ) {
    			for ($i = 0; $i <= count($val); $i++) {
    				$tmp = str_replace($rep1,$rep2,$val[$i]);
    				if ( $tmp ) {
    					unset($errors->errors[$key][$i]);
    					$errors -> add($key, $tmp);
    				}
    			}
    		}
    	}
    	add_filter( 'user_profile_update_errors', 'tml_profile_errors' );

    登録時とプロフィール更新時とではエラーの持ち方がちょっと違ったようですね。

    簡単に説明すると、
    $errorを受け取って解析しているわけですが、
    エラー文字列を一行ずつ($val[$i])解析して、
    $rep1にマッチする文字列があった場合
     その配列をunset(削除)して
     かつ、$rep2の該当する文字列を$errorに追加
    という感じの処理をしています。

    今度こそ・・・

    トピック投稿者 firth

    (@firth)

    yah!!さん!!
    こちらの環境でも無事出来ました!!

    驚いたことに、仕組み上、英語だけでなく日本語でも
    いけるということがわかり、
    さらに重宝するという感じです。

    もちろん、最初から日本語表記出来ている部分については、
    poeditなどで編集するのも良いのでしょうが、
    yah!!さんのコードの応用で変更できるのは、大変助かります。
    ※私は、メールアドレスがすでに利用されている時のエラー表示を
     変更させていただきました。

    この問題は、私の中でも常に問題として抱えていたのですが、
    このような形で対応することが出来て、
    本当に感謝しています。
    半ば興奮のような感じです。

    このコードはぜひ使わせていただきたいと思います。
    ありがとうござます!!!

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「theme my loginで英語表記の部分を日本語にしたい」には新たに返信することはできません。