【Java・SpringBoot・Thymeleaf】ブラウザ言語設定でエラーメッセージの言語を変更（SpringBootアプリケーション実践編8）

#おさらい
ログインをして、ユーザー一覧を表示するアプリケーションを作成し、
Springでの開発について勉強していきます🌟
前回はユーザー登録画面で、まずは必須入力チェックを行い、次に中身のチェックを行うという、エラー**メッセージを順番に実行**する実装をしました〜
今回は**Webブラウザの言語設定に応じて、メッセージプロパティファイルを切り替え、表示メッセージを英語に切り替え**られるようにします

前回の記事🌟
[【Java・SpringBoot・Thymeleaf】バリデーションチェックの順番を設定（SpringBootアプリケーション実践編7）](https://qiita.com/suema0331/items/9369646e937ed6e5b257)

構成は以下のようになっています

```
Project Root
└─src
    └─ main
        └─ java  
            └─ com.example.demo
                └─ login
                    └─ controller                ...コントローラクラス用パッケージ
                └─ domain                        ...ビジネスロジック用パッケージ
                    └─ model                     ...Modelクラス用パッケージ
                        └─ LoginForm.java
                        └─ SignupForm.java
                        └─ ValidGroup1.java
                        └─ ValidGroup2.java
                        └─ ValidGroup3.java
                        └─ GroupOrder.java
        └─ resouces
            └─ static                            ...css,js用フォルダ
            └─ templates
                └─ login
                    └─ login.html
                    └─ signup.html
            └─ messages.properties
            └─ messages_en.properties
```

#英語用のメッセージファイルを作成
* messages_en.propertiesを作成します

```src/main/resources/messages_en.properties
# =======================================
# データバインドエラーメッセージ
# =======================================

#typeMismatch.[ModelAttribute名].[プロパティ名]
typeMismatch.signupForm.age=Please enter a numeric value
typeMismatch.signupForm.birthday=Please enter in yyyy / MM / dd format

# =================================================
# バリデーションエラーメッセージ
# =================================================

#ユーザーID
signupForm.userId=UserID
NotBlank.signupForm.userId={0} is required 
Email.signupForm.userId=Please enter {0} in e-mail address format

#パスワード
signupForm.password=Password
NotBlank.signupForm.password={0} is required 
Length.signupForm.password=Please input {0} with more than {2} digits, {1} digits or fewer digits
Pattern.signupForm.password=Please enter {0} with half-width alphanumeric characters

#ユーザー名
signupForm.userName=UserName
NotBlank.signupForm.userName={0} is required 

#誕生日
signupForm.birthday=Birthday
NotNull.signupForm.birthday={0} is required 

#年齢
signupForm.age=Age
Min.signupForm.age={0} must be at least {1}
Max.signupForm.age={0} must be less than {1}

#結婚
AssertFalse.signupForm.marriage=You can only register if false
```

##ブラウザの言語設定を変更
* ブラウザの言語設定で**英語の優先順位を一番にする**
* Googleの設定から、
* 詳細設定＞言語＞英語（アメリカ合衆国）
    * その他の操作＞トップに移動


![google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282755/892b09da-e34e-9eb5-df5a-b5549a4c8f0a.png)

##ユーザー登録画面を確認！
* ブラウザを再起動
* http://localhost:8080/signup
* ユーザー登録画面で何も入力せずにユーザー登録ボタンをクリック
* エラーメッセージが英語になりました〜〜^^
* これで**ブラウザの言語設定に応じて、メッセージ用プロパティファイルが切り替えられました**o(^_^)o

![eng_err.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282755/5c2a1b67-a278-e2f6-6831-d4933ccc85a1.png)


#バインド・バリデーションのまとめ
* **🌟データバインド**
    * **@ModelAttribute**：コントローラークラスと画面の間でフォームクラスを受け取る
    * **th:object属性やth:field属性**：画面とフォームクラスのマッピングを行う
    * **@DateTimeFormat**：Date型フィールドへのバインドを行う
    * エラーメッセージは`src/main/resources/messages.properties`に設定
* **🌟バリデーション**
    * バリデーションをするには、**フォームクラスに@NotBlankなど**を付け、<br>**コントローラークラスに@Validated**を付ける
    * **@GroupSequence**：バリデーションの順番を制御する
    * 言語毎のメッセージプロパティファイルを用意すれば、多言語対応可能！