基本的なJSP /サーブレットwebアプリケーションの場合には、基本的なアプローチが使用されるであろうJSTLの fmt
タグライブラリをと組み合わせてリソースバンドル。リソースバンドルには、キーと値のペアが含まれています。キーはすべての言語で同じ定数であり、値は言語ごとに異なります。リソースバンドルは通常、APIによってロードされるプロパティファイルですResourceBundle
。ただし、これはカスタマイズして、たとえばデータベースからキーと値のペアをロードできるようにすることができます。
これは、プロパティファイルベースのリソースバンドルを使用してWebアプリケーションのログインフォームを国際化する方法の例です。
次のファイルを作成し、いくつかのパッケージに入れますcom.example.i18n
(Mavenの場合は、内部のパッケージ構造に入れますsrc/main/resources
)。
text.properties
(デフォルト言語(通常は英語)のキーと値のペアが含まれています)
login.label.username =ユーザー名
login.label.password =パスワード
login.button.submit =サインイン
text_nl.properties
(オランダ語(nl
)のキーと値のペアが含まれています)
login.label.username = Gebruikersnaam
login.label.password = Wachtwoord
login.button.submit = Inloggen
text_es.properties
(スペイン語(es
)のキーと値のペアが含まれています)
login.label.username = Nombre de usuario
login.label.password =Contraseña
login.button.submit = Acceder
リソースバンドルのファイル名は、次のパターンに従う必要がありますname_ll_CC.properties
。_ll
一部は小文字でなければなりませんISO 693から1言語コード。これはオプションであり、_CC
パーツが存在する場合にのみ必要です。_CC
一部は大文字でなければなりませんISO 3166-1アルファ-2国コード。これはオプションであり、多くの場合、アメリカ英語(_en_US
)やイギリス英語(_en_GB
)など、国固有の言語方言を区別するためにのみ使用されます。
まだ完了していない場合は、JSTLをインストールします。サーブレット2.5コンテナ以降(Tomcat 6.0など)で実行していてweb.xml
、サーブレット2.5仕様に準拠していると宣言されている場合は、jstl-1.2.jarをwebappの/WEB-INF/lib
フォルダに配置するだけです。
次のサンプルJSPファイルを作成し、Webコンテンツフォルダーに配置します。
login.jsp
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
<fmt:setBundle basename="com.example.i18n.text" />
<!DOCTYPE html>
<html lang="${language}">
<head>
<title>JSP/JSTL i18n demo</title>
</head>
<body>
<form>
<select id="language" name="language" onchange="submit()">
<option value="en" ${language == 'en' ? 'selected' : ''}>English</option>
<option value="nl" ${language == 'nl' ? 'selected' : ''}>Nederlands</option>
<option value="es" ${language == 'es' ? 'selected' : ''}>Español</option>
</select>
</form>
<form method="post">
<label for="username"><fmt:message key="login.label.username" />:</label>
<input type="text" id="username" name="username">
<br>
<label for="password"><fmt:message key="login.label.password" />:</label>
<input type="password" id="password" name="password">
<br>
<fmt:message key="login.button.submit" var="buttonValue" />
<input type="submit" name="submit" value="${buttonValue}">
</form>
</body>
</html>
<c:set var="language">
現在の言語を管理します。言語が(言語ドロップダウンによって)要求パラメーターとして指定された場合、それが設定されます。それ以外の場合、言語が以前にセッションで設定されている場合は、代わりにそれに固執します。それ以外の場合は、リクエストヘッダーでユーザー指定のロケールを使用します。
<fmt:setLocale>
リソースバンドルのロケールを設定します。これは、この行があることが重要です前に<fmt:setBundle>
。
<fmt:setBundle>
(なしで唯一の名前を持つまでは、完全修飾パッケージ名でそのベース名でリソースバンドルを初期化_ll_CC
指定子)。
<fmt:message>
指定されたバンドル鍵によってメッセージ値を取得します。
<html lang="${language}">
インフォームページが、それは重複コンテンツ(SEOのためにこのように、良い)としてマークされないようにしているどの言語searchbots。
別の言語が選択されると、言語ドロップダウンはJavaScriptによってすぐに送信され、ページは新しく選択された言語で更新されます。
ただし、プロパティファイルはデフォルトでISO-8859-1文字エンコードを使用して読み取られることに注意する必要があります。あなたはユニコードエスケープによってそれらをエスケープする必要があるでしょう。これは、JDKが提供するnative2ascii.exe
ツールを使用して実行できます。詳細については、この記事のセクションも参照してください。
理論的な代替案は、Control
これらのファイルをUTF-8としてロードするカスタムをバンドルに提供することですが、残念ながら、これは基本的なJSTLtaglibではサポートされていませんfmt
。の助けを借りて、すべて自分で管理する必要がありますFilter
。JSFのように、これをより透過的な方法で処理できる(MVC)フレームワークがあります。この記事も参照してください。