📘 Vol.9.6：【Struts2】メッセージリソース活用編 〜 i18n対応・バリデーションエラーの多言語表示で保守性UP 〜

### 💡 はじめに
Struts2のバリデーション処理では、エラーメッセージの表示方法を工夫することで「保守性」「再利用性」「多言語対応」の向上が図れます。

本記事では、`ActionMessages.properties`などの***メッセージリソースファイル***を使って、***バリデーションエラーメッセージを外部化・i18n対応***する方法を解説します！

---

### 🏗 バリデーション × プロパティファイル の基本構成

Struts2では以下のように、プロパティファイルにエラーメッセージを記述して、Java側またはXML側から呼び出します。

### 📁 ファイル構成例

```css
src/
└── main/
    └── resources/
        └── com/company/bulletinboard/action/login/LoginAction.properties
```

### 📝 LoginAction.properties

```properties
errors.required.username = ユーザー名は必須入力です。
errors.invalid.username = ユーザー名の形式が不正です。
```

---

### 🧩 Java側：validate()での使用
```java
@Override
public void validate() {
    if (username == null || username.isEmpty()) {
        addFieldError("username", getText("errors.required.username"));
    }
}
```

### ✅ getText() とは？
- Struts2が提供する国際化対応のメソッド

- メッセージプロパティファイルからキーに対応する文言を取得します

- 言語ファイルの切り替えも可能（例：LoginAction_en.properties）

---

### 🧩 XML側：バリデーション定義での使用
```xml
<field name="username">
  <field-validator type="requiredstring">
    <message key="errors.required.username"/>
  </field-validator>
</field>
```

- `message` タグの `key` 属性でメッセージリソースを参照

- Java側と同様に外部化・i18nが可能！

---

### 🌍 多言語対応（i18n）の設定例
```properties
# LoginAction.properties（デフォルト＝日本語）
errors.required.username = ユーザー名は必須入力です。

# LoginAction_en.properties（英語）
errors.required.username = Username is required.
```

Struts2は、リクエストヘッダーの `Accept-Language` を見て自動的にファイルを切り替えます。

---

### 📝 Tips：BaseActionなど共通クラスでも getText() は使用可能！

共通処理クラス（例：BaseAction）で ***`getText()`*** を使えば、***エラー共通処理やログ出力にも柔軟にメッセージを適用できます！***
```java
logger.warn(getText("errors.session.timeout"));
```

---

### ✅ まとめ
| 項目       | 内容                      |
| -------- | ----------------------- |
| 🔑 メリット① | エラーメッセージを一元管理でき、保守性が高まる |
| 🌐 メリット② | 多言語対応（i18n）に自然と対応可能     |
| 🔁 メリット③ | 同じキーを複数のActionで再利用できる   |
---

### [🧭 次回予告：Vol.9.7](https://qiita.com/juehara-crypto/items/793e85ad47b981d6fbae)
次回は、***バリデーションエラー時のフィールド保持・初期値再表示***の工夫について紹介予定です！

---

### ✨ シリーズまとめ（Vol.9.x バリデーション編）

- [✅ Vol.9.0：入力バリデーションと型変換の世界へ](https://qiita.com/juehara-crypto/items/263e0eb599be73681b0f)

- [✅ Vol.9.1：validate()の基本と addFieldError]()

- [✅ Vol.9.2：Struts2実装編（input遷移・fielderror活用）](https://qiita.com/juehara-crypto/items/44fd5012bfbc809d352a)

- [✅ Vol.9.3：XMLバリデーション定義](https://qiita.com/juehara-crypto/items/fd6881d2c54de07b3ae4)

- [✅ Vol.9.4：条件付きチェック・複数フィールド連動チェック](https://qiita.com/juehara-crypto/items/c82203f583b2712be395)

- [✅ Vol.9.5：エラーメッセージ表示のデザインとUX](https://qiita.com/juehara-crypto/items/c44fae5980a5c9b40312)

- 🆕 Vol.9.6：（←今回）
---



## 🔎 Vol.9系で扱うトピック

| 回   | テーマ                                         | 内容の一部紹介                              |
|------|----------------------------------------------|--------------------------------------------|
| [9.1](https://qiita.com/juehara-crypto/items/a67976acd60430fa0da6)  | `validate()`メソッドの基本                    | Struts2標準の入力チェック基礎              |
| [9.2](https://qiita.com/juehara-crypto/items/44fd5012bfbc809d352a)  | `@Validations` アノテーション活用             | 宣言的バリデーション設計                   |
| [9.3](https://qiita.com/juehara-crypto/items/fd6881d2c54de07b3ae4)  | `validation.xml` 外部定義でのバリデーション   | 大規模PJでのメンテナンス性                 |
| [9.4](https://qiita.com/juehara-crypto/items/c82203f583b2712be395)  | `conversion.properties` と型変換              | 日付/数値/Enum変換の実務対応               |
| [9.5](https://qiita.com/juehara-crypto/items/c44fae5980a5c9b40312)  | 入力エラー時のメッセージ制御                  | `addFieldError()` / メッセージキー運用     |
| [9.6](https://qiita.com/juehara-crypto/items/de18b174f1740f9b3646)  | バリデーション共通化                         | 共通部品によるDRY設計                      |
| [9.7](https://qiita.com/juehara-crypto/items/793e85ad47b981d6fbae)  | サーバサイドとクライアントサイドの協調        | jQueryやHTML5との併用戦略                  |
| [9.8](https://qiita.com/juehara-crypto/items/b11017ca621d94599f72)  | 実務シナリオでのバリデーション総仕上げ       | 会員登録/投稿処理などの実例適用           |
| [9.9](https://qiita.com/juehara-crypto/items/6df87d22d07818df5166)  | バリデーション処理の単体テスト編       | validate()／独自バリデータ／input遷移の検証を網羅的に |
| [9.10](https://qiita.com/juehara-crypto/items/6c042593898aa598cba4)  | エラー表示のUIデザイン編        | 視認性・操作性を高める実践テクニック |
| [9.11](https://qiita.com/juehara-crypto/items/7d33c9cd812b37153c12)  | Ajax×バリデーション連携編        | クライアント×サーバーで UX＆保守性を両立するハイブリッド構成 |



---