一、具備的特徵:
1、對於程序中使用的文本元素(例如:菜單欄、導航欄、錯誤提示、狀態信息等),需要根據來訪者的地區和國家,選擇不同語言的文本爲之服務
2、對於程序中動態生成的數據(例如:日期、貨幣),軟件應能根據當前的國家或地區的文化習慣進行顯示
二、固定文本元素的國際化
·可以把固定不變的文本信息寫到一個properties中,並根據不同的國家編寫不同的properties文件。這一組properties文件被稱爲一個資源包
·提供了ResourceBundle類用於描述一個資源包
·創建資源包和資源文件
一個資源包中的資源文件都有一個相同的基名,而且每個資源文件都必須有表示本地信息的附加部分的信息
例如:
一個資源包的基名是:myresource;則與中文和英文相對應的資源文件則爲:myresource_zh.properties,myresource_en.properties
每一個資源包都有一個默認的資源文件,這個文件不帶有表示本地信息的部分。若resourceBundle對象在資源包中找不到與用戶匹配的資源文件,他將選擇與資源包中相近的資源文件,若是再找不到,則使用默認的資源文件。
·資源文件的書寫格式
資源文件的內容通常採用“關鍵字=值”的形式,軟件根據關鍵字檢索值顯示在頁面上。一個資源包中的所有的資源文件的關鍵字是相同的
並且所有的資源文件中採用的是ASCII字碼,對於想中文這樣的非ASCII字符,需進行編碼。
·在java類中編寫代碼實現固定文本元素的國際化
Locale locale=new Locale("en");
//用來描述資源包下的信息
ResourceBundle bundle1=ResourceBundle.getBundle("com.hbsi.resource.myresource",locale);
//讀取資源文件中的鍵值對,指定是哪一個資源文件
String username1=bundle1.getString("username");
String password1=bundle1.getString("password");
String submit1=bundle1.getString("submit");
System.out.println(username1+":"+password1+":"+submit1);
ResourceBundle類提供了一個靜態方法getBundle,該方法用於裝載資源文件,該方法的第一個參數是資源包名,且爲完整的資源包名,第二個參數是指定的資源文件
加載資源文件後,程序就可以調用ResourceBundle實例對象getString方法獲取指定的資源信息名稱所對應的值
·在jsp頁面中使用固定文本元素的國際化標籤
1、<fmt:setLocale>
<%
Locale locale=new Locale("zh","CN");
request.setAttribute("locale",locale);
%>
<%-- 在jsp頁面中顯示設置用戶的本地化信息,並將設置的本地化信息一locale對象存儲在web作用域中,使用了該標籤設置本地化信息後,國際化標籤庫中的其他的標籤將使用本地化信息,而忽略客戶端瀏覽器傳遞過來的本地信息,如果value的值爲null,該標籤將採用客戶端瀏覽器傳遞過來的本地信息--%>
<!--
<fmt:setLocale value="${locale}"/>
-->
<%-- 也可以是一個字符串:語言_國家 --%>
<!--
<fmt:setLocale value="zh_CN"/>
-->
2、<fmt:setBundle>
用於根據標籤<fmt:setBundle>設置的本地化信息創建一個資源包實例化對象,並將綁定到一個web域的屬性上。
<fmt:setBundle basename="basename"
[var="varName"]
[scope="{page|request|session|application}"] />
<fmt:setBundle>標籤有如下一些特性:
(1)如果basename屬性的值爲null或空字符串,或找不到basename屬性指定的資源,<fmt:setBundle>標籤保存到Web域中的屬性的值爲null。
(2)如果指定了var屬性,<fmt:setBundle>標籤將把ResourceBundle實例對象以var屬性的值作爲域屬性名稱保存到Web域中。
(3)如果沒有指定var屬性,<fmt:setBundle>標籤將把ResourceBundle實例對象以域屬性名javax.servlet.jsp.jstl.fmt.localizationContext保存到Web域中。所有沒有嵌套在<fmt:bundle>標籤中且未指定bundle屬性的<fmt:formatDate>都將使用該標籤創建的資源包。
3、<fmt :bundle>
fmt:bundle>標籤與<fmt:setBundle>標籤的功能類似,但它創建的ResourceBundle實例對象只在其標籤體內有效
4、如果設置了<fmt:bundle>標籤的prefix屬性,則其中嵌套的<fmt:message>標籤的key屬性值中就可以省略prefix屬性設置的前綴部分,這對要使用具有相同前綴的多個關鍵字的情況提供了一些簡便。
5、<fmt:message>
<fmt:message>標籤用於從一個資源包中讀取信息並進行格式化輸出,它有如下一些使用語法格式:
語法1,沒有標籤體的情況:
<fmt:message key="messageKey"
[bundle="resourceBundle"]
[var="varName"]
[scope="{page|request|session|application}"] />
語法2,在標籤體中指定格式化文本串中的佔位符參數的情況:
<fmt:message key="messageKey"
[bundle="resourceBundle"]
[var="varName"]
[scope="{page|request|session|application}"]>
<fmt:param>subtags
</fmt:message>
語法3,在標籤體中指定消息關鍵字和可選擇的佔位符參數:
<fmt:message [bundle="resourceBundle"]
[var="varName"]
[scope="{page|request|session|application}"]>
key
optional <fmt:param>subtags
</fmt:message>
<fmt:message>標籤有如下一些特性:
·如果指定的資源不存在,輸出“???<key>???”形式的錯誤信息。
·如果ResouceBundle中不存在key屬性指定的信息,輸出“???<key>???”形式的錯誤信息。
·如果key屬性的值爲null或空字符串,輸出“??????”形式的錯誤信息。
·如果沒有指定var屬性,<fmt:message>標籤將直接輸出格式化的結果;如果指定了var屬性,則<fmt:message>標籤將格式化的結果保存在scope屬性指定的Web域中,保存在Web域中的屬性名稱爲var屬性指定的值。如果指定了scope屬性,就必須指定var屬性。
·要輸出的消息的關鍵字可以使用key屬性指定,也可以在標籤體中指定。如果<fmt:message>標籤嵌套在<fmt:bundle>標籤內,並且<fmt:bundle>標籤設置了prefix屬性,則該屬性的值追加到<fmt:message>標籤指定的關鍵字的前面。
·可以通過在<fmt:message>標籤內嵌套<fmt:param>標籤來指定格式化文本串中的佔位符的參數值,每個<fmt:param>標籤分別設置一個參數,各個<fmt:param>標籤的順序與格式化字符串的參數相對應,即第一個<fmt:param>標籤對應于格式化字符串中的第一個參數,第二個<fmt:param>對應于格式化字符串中的第二個參數,依次類推。
·如果<fmt:message>標籤處理的格式化文本串中包含有參數,但其中沒有嵌套與該參數對應<fmt:param>標籤,則直接輸出該參數在格式化文本串中的原始形式。
三、動態數據的國際化
·由於是在程序運行是動態生成,所以無法向文字一樣簡單的將他們從應用程序中分離出來而是要特殊處理
·提供了java.util包和java.text包中的類解決
·Locale類
實例對象代表一個特定的地理,政治文化區域,實例對象本身不會去驗證他代表的語言和國家的地區信息是否正確,只是向本地銘感的類提供國家地區信息
·DateFormat類
可以按國家地區格式化輸出日期、也定義了一些用於描述日期、時間的顯示模式的int常量,包括FULL、LONG、MEDIUM、DEFAULT、SHORT,可以使用這些常量,控制日期/時間的顯示長度
方法:format:將date對象格式化爲符合某個本地環境習慣的字符串
Parse:將字符串解析爲日期/時間對象
·NumberFormat類
將一個數值格式化爲符合某個國家地區習慣的數值字符串,也可以將符合某個國家地區習慣的數值字符串解析爲對應的數值
Formt方法:講一個數值格式化爲符合某個過家地區習慣的數值字符串
Parse方法:警服個某個國家地區習慣的數值字符串解析爲對應的數值
·MesseageFormat(動態文本)