2012-09-18 77 views
10

我們有一個應用程序,它使用基本的JSP/servlet,所有當前使用英文的文本在JSP頁面中被硬編碼。我們正在考慮應用程序的國際化,因此我們需要某種方式將文本提取到屬性文件中。用於國際化和本地化的JSTL資源包

這是我到目前爲止所做的:
1)創建一個名爲XXXXX-messages_en.properties的文件,將鍵/值對添加到屬性文件中,例如, AAAAA = Hello World

2)負載JSTL相關標籤庫到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)看來,我要補充<fmt:setBundle>標籤到每個燒毛JSP頁面,這是一個有點難看,如果有什麼需要的未來的變化(名稱變更?)這會使生活變得更加困難。

我想想也許我可以創建一個單獨的頁面並將其放入此<fmt:setBundle>,然後使用<jsp:include>包含此頁面。或者我可以通過servlet過濾器注入?我會說我對任何選項都不滿意。

有沒有推薦的方法來做到這一點?

問題2)如果在那裏沒有匹配屬性文件,如何指定默認語言?我測試過我的情況,如果我把<fmt:setLocale>加入到帶有法語的JSP頁面中,頁面仍然可以正確加載。這是否意味着英文版本始終是默認版本,還是僅僅因爲我的操作系統/瀏覽器是英文的?

如果中國/日本用戶打開我的頁面,並且我有英文和法文屬性文件,會發生什麼情況?

回答

6

您可以使用備用的區域,以解決第二個問題:

如果沒有找到匹配的,格式化的行動尋找所謂的回退區域配置設置。配置設置是由應用程序的web.xml文件中的上下文參數或JSTL操作或其中一個JSP範圍內的Java代碼設置的值。在網絡中設置回退區域設置。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

+0

我肯定讀這時候我身邊谷歌,所以我怎麼能忘記呢?那個時候我的腦子一定要掉頭。無論如何,謝謝你的回答! –

8

OK,我發現解決自己的問題1. 基本上我需要做的就是將它放入web.xml文件的方式:

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

通過這樣做,我可以節省setBundle的標籤在每個jsp頁面中。

2

下面是一個使用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>