Jakarta EE JSPの国際化(i18n)対応の基礎をやさしく解説|初心者でもできる多言語化の始め方
生徒
「JSPで国際化に対応した画面を作りたいです。日本語と英語を切り替えたり、利用者の言語に合わせて自動表示したりできますか?」
先生
「できます。Jakarta EEでは、サーバー側で言語リソースを切り替えてJSPに渡す方法が簡単です。初心者でも段階を踏めば多言語化を導入できます。」
生徒
「タグライブラリをまだ学んでいないので、まずは基本だけで実装したいです。どんな流れになりますか?」
先生
「まず言語ごとのプロパティファイルを用意し、Servletで利用者の言語を判定して文字列を読み出し、JSPで表示します。順番に見ていきましょう。」
1. 国際化対応の全体像をつかもう
国際化対応は、画面の文字列をコードに直書きせず、言語ごとの外部ファイルに分けて管理する考え方です。Jakarta EEのJSPでは、サーバー側のServletで言語を判定し、対応するリソースバンドルから文言を取得してJSPへ渡します。これにより、同じJSPでも日本語、英語、その他の言語に柔軟に切り替えられます。学習の最初では、複雑な仕組みを使わずに、プロパティファイルと基本的なJSPの式だけで十分です。
2. プロジェクト構成とリソース配置を確認しよう
多言語化では、言語ごとのプロパティファイルをクラスパス上に配置します。一般的にはsrc/main/resourcesに置いて、ビルド時にWEB-INF/classesへ出力されるようにします。ファイル名は共通のベース名に言語コードを付けるだけで切り替えられます。例えば、デフォルト用と日本語用、英語用を次のように用意します。
messages.properties
messages_ja.properties
messages_en.properties
この命名ルールにより、サーバーがリクエストのロケールに合わせて最適なファイルを探せます。まずは日本語と英語の二言語から始めると理解しやすく、運用時の拡張も簡単です。
3. 言語ごとのプロパティファイルを用意しよう
本文タイトル、ボタン名、案内文などをキーと値で管理します。文字化けを避けるため、プロジェクト全体をUTF-8で統一すると安心です。
# messages.properties(デフォルト)
app.title=Sample Application
app.greeting=Hello
app.button.submit=Submit
app.label.name=Name
# messages_ja.properties(日本語)
app.title=サンプルアプリケーション
app.greeting=こんにちは
app.button.submit=送信
app.label.name=お名前
# messages_en.properties(英語)
app.title=Sample Application
app.greeting=Hello
app.button.submit=Submit
app.label.name=Name
はじめは表示に必要な最小限のキーだけ作り、画面が増えたら順次追加します。キー名は用途が分かるようにまとめ、命名の規則性を保つと保守が楽になります。
4. Servletでロケールを決めて文言を取り出そう
Servletでリクエストのロケールを決め、対応する文言を取り出してJSPへ渡します。ここではURLパラメータで言語を切り替える簡単な例を使います。
package i18n;
import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class I18nServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String lang = request.getParameter("lang"); // 例: ja / en
Locale locale;
if ("ja".equalsIgnoreCase(lang)) {
locale = Locale.JAPAN;
} else if ("en".equalsIgnoreCase(lang)) {
locale = Locale.US;
} else {
locale = request.getLocale(); // ブラウザの言語設定
}
ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
request.setAttribute("title", bundle.getString("app.title"));
request.setAttribute("greeting", bundle.getString("app.greeting"));
request.setAttribute("submitLabel", bundle.getString("app.button.submit"));
request.setAttribute("nameLabel", bundle.getString("app.label.name"));
request.getRequestDispatcher("/WEB-INF/views/i18n.jsp").forward(request, response);
}
}
このServletは、言語指定がなければブラウザのAccept-Languageに従ってロケールを推測します。学習段階ではパラメータとブラウザ設定の両方に対応しておくと挙動の理解が深まります。
5. web.xmlでServletをURLに関連付けよう
次に、Servletを呼び出すためのURLを設定します。ここでは/i18nというパスでアクセスできるようにします。
<web-app>
<servlet>
<servlet-name>i18n</servlet-name>
<servlet-class>i18n.I18nServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>i18n</servlet-name>
<url-pattern>/i18n</url-pattern>
</servlet-mapping>
</web-app>
設定を反映したら、/i18nにアクセスします。?lang=jaや?lang=enを付けると、切り替えの動作を簡単に確認できます。
6. JSPで受け取った文言を表示しよう
JSP側では、Servletから受け取った属性をそのまま表示します。学習段階では式を使ったシンプルな表示で十分です。ページの文字コード指定も忘れずに記述します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><%= (String)request.getAttribute("title") %></title>
</head>
<body class="container py-4">
<h2 class="mb-3"><%= (String)request.getAttribute("greeting") %></h2>
<form class="card p-3 mb-3" action="/i18n" method="get">
<div class="mb-3">
<label class="form-label"><%= (String)request.getAttribute("nameLabel") %></label>
<input class="form-control" type="text" name="dummy">
</div>
<button class="btn btn-primary" type="submit">
<i class="bi bi-translate"></i> <%= (String)request.getAttribute("submitLabel") %>
</button>
</form>
<div class="mb-2">
<a class="btn btn-outline-secondary btn-sm" href="/i18n?lang=ja">日本語</a>
<a class="btn btn-outline-secondary btn-sm" href="/i18n?lang=en">English</a>
</div>
</body>
</html>
言語切り替えのUIは、リンクやドロップダウンなど自由に設計できます。まずは固定リンクで切り替え、慣れてきたらヘッダーやフッターに共通化すると使いやすくなります。
7. 文字化けを防ぐポイントを押さえよう
国際化では文字コードの不一致が原因で文字化けが起きがちです。プロジェクト設定、JSPのメタタグ、ビルドツールのエンコーディング、ソースファイル保存形式などをすべてUTF-8に統一しましょう。プロパティファイルもUTF-8で保存しておけば、追加の変換手順に悩まずに済みます。サーバーのレスポンスヘッダーが適切なContent-Typeを返すかも確認しておくと安心です。
8. ブラウザの言語設定と優先順位の考え方
利用者の環境によっては、URLパラメータがない状態でも自動的に言語を切り替えたい場面があります。その場合はブラウザのAccept-Languageヘッダーを利用します。Servletのrequest.getLocale()はこの情報から最適なロケールを推測します。学習の早い段階では、パラメータ指定を優先し、指定がなければブラウザ設定を使うという二段構えにしておくと、挙動が分かりやすく、デバッグも容易です。
9. 日付や数値の表記差にも注意しよう
国際化は文字列だけではありません。日付や数値の表記も言語と地域で変わります。学習段階ではJSPの式を使い、ロケールに合わせて簡単に整形してみましょう。次のような出力を参考に、将来的には共通のフォーマット処理へ発展させられます。
(ここに出力結果)
実運用では、入力値の検証やエラーメッセージも言語ごとに用意します。まずは画面表示の主要文言から対応を進め、頻出の文言は共通キーとして整理しておくと保守が楽になります。
10. テスト手順とチェックリストで品質を高めよう
学習の締めくくりとして、動作確認の手順を整理します。言語切り替えリンクの動作、ブラウザの言語設定による自動選択、文字化けの有無、プロパティキーの漏れ、フォールバックの挙動などを順番に検証します。さらに、ファイル追加時にキーを統一するルールをチームで共有しておくと、拡張時のトラブルを未然に防げます。Jakarta EEのJSPで国際化の基礎ができていれば、画面が増えても同じ手順で着実に多言語化を進められます。