web-dev-qa-db-ja.com

国際化とローカリゼーションのためのJSTLリソースバンドル

現在英語で書かれているすべてのテキストがJSPページにハードコーディングされている基本的なJSP /サーブレットを使用するアプリケーションがあります。アプリの国際化を検討しているため、テキストをプロパティファイルに抽出するための何らかの方法が必要です。

これが私がこれまでにしたことです:
1)XXXXX-messages_en.propertiesというファイルを作成し、キーと値のペアをプロパティファイルに追加します。 AAAAA = Hello World

2)JSTL関連のtaglibをJSPページにロードします

<%@ taglib uri="http://Java.Sun.com/jsp/jstl/fmt" prefix="fmt" %>

3)前のテキストを次のように置き換えます

<fmt:message key="AAAAA" bundle="${XXXXX}"/>

4)setBundleタグをJSPページに追加します。

<fmt:setBundle basename="XXXXX-messages" var="XXXXX"/>

サーバーを再起動すると、すべてが正しく表示されます。

ただし、JSTL国際化ライブラリの使用に関する私の質問は次のとおりです。

質問1)単一のJSPページのそれぞれに<fmt:setBundle>タグを追加する必要があるようですが、これは少し醜いです。将来何かを変更する必要がある場合(名前の変更?)、これは生活をより困難にします。

別のページを作成してこの<fmt:setBundle>をその中に入れ、<jsp:include>を使用してこのページを含めることができるかもしれないと考えました。または、サーブレットフィルターを介してこれを注入できますか?私はどちらの選択肢にも満足していないと思います。

これを行うための推奨される方法はありますか?

質問2)一致するプロパティファイルがない場合、デフォルトの言語を指定するにはどうすればよいですか?私の場合はテストしましたが、<fmt:setLocale>をフランス語のJSPページに入れても、ページは正しく読み込まれます。それは英語版が常にデフォルトであることを意味しますか、それとも私のオペレーティングシステム/ブラウザが英語であるという理由だけですか?

中国語/日本語のユーザーが私のページを開き、英語とフランス語の両方のプロパティファイルがある場合はどうなりますか?

12
Yudong Li

フォールバックロケールを使用して、2番目の質問を解決できます。

一致するものが見つからない場合、フォーマットアクションはいわゆるフォールバックロケール構成設定を探します。構成設定は、アプリケーションのweb.xmlファイルのコンテキストパラメータまたはJSTLアクションまたはJSPスコープの1つでのJavaコードのいずれかによって設定される値です。フォールバックロケールを設定するにはweb.xmlファイルには、次の要素を含めます。

<context-param>
  <param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
  <param-value>en</param-value>
</context-param>

http://onjava.com/onjava/2002/09/11/jstl2.html

7
Jasper de Vries

OK、私は自分の質問1を解決する方法を見つけました。基本的に私がする必要があるのはそれをweb.xmlに入れることです:

<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>XXXXX-messages</param-value>
</context-param>

これにより、各jspページにsetBundleのタグを保存できます。

8
Yudong Li

以下は、JSTLを使用して作成されたJSPテンプレートです。これは、国際化とローカリゼーションのためにJSTLリソースバンドルを組み込むのに役立つ場合があります。

template.tag

<%@tag description="UI Template" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://Java.Sun.com/jsp/jstl/fmt"%>           
<%@attribute name="header" fragment="true"%>
<%@attribute name="footer" fragment="true"%>
<fmt:setLocale value="en" scope="session" />
<fmt:setBundle basename="resources.labels" var="label" scope="session" />
<fmt:setBundle basename="resources.messages" var="msg" scope="session" />
<html>
    <body>
        <div id="pageHeader">
            <jsp:invoke fragment="header"/>
        </div>
        <div id="body">            
            <jsp:doBody/>
        </div>
        <div id="pageFooter">            
            <jsp:invoke fragment="footer"/>
        </div>
    </body>
</html>


以下はhome.jspファイルで、本文とともにheader.jspおよびfooter.jspが含まれています。

home.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags"%>
<%@taglib prefix="fmt" uri="http://Java.Sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<t:template>
    <jsp:attribute name="header">
        <jsp:include page="../header.jsp" />
    </jsp:attribute>
    <jsp:attribute name="footer">
        <jsp:include page="../footer.jsp" />
    </jsp:attribute>
    <jsp:body>        
        <font style="font-family: Arial; font-size: 10pt; color: blue; font-weight: bold">
            <fmt:message bundle="${msg}" key="message.loginSuccess" />
        </font>
        <br/>
        <font style="font-family: Arial; font-size: 10pt; font-weight: bold">
            <fmt:message bundle="${label}" key="label.home" />
        </font>
    </jsp:body>
</t:template>


web.xmlファイル

<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.labels</param-value>
    <param-value>resources.messages</param-value>
</context-param>
2
Dinesh Lomte