當某個企業應用需要面對不同國家或地區的用戶時就必須考慮國際化問題最終效果就是讓不同國家的用戶在界面上看到的文字內容是自己的語言並且可以選擇其他語言來顯示對於Java EE應用程序開發者來說其主要工作包括提示信息國際化編碼國際化兩個方面
提示信息國際化
這部分工作主要就是把程序中字符串常量提取到統一的資源信息文件中針對不同的程序代碼又有不同的處理方式
java code的處理
首先需提供一個公共國際化資源接口類server啟動時會根據具體環境加載不同的資源假設國際化資源類為Message接口為getString(String key)那麼java code的形式變化如下
原代碼
String strLabel = 業務邏輯
新代碼
String strLabel = MessagegetString(BIZ_NAME)資源文件(message_zh_CNproperties)內容BIZ_NAME=業務邏輯
()jsp代碼的處理
)html部分
頁面中表單的提示信息和表格標題等內容一般都是直接寫在html代碼中根據jsp規范此時做國際化有兩種途徑第一種是直接利用<%=%>調java表達式來輸出國際化信息第二種是通過自定義標簽來輸出例如
原代碼
<table>
<tr>
<td>客戶姓名
</td>
<td><input type=text name=cust_name>
</td>
</tr>
</table>
第一種實現
<table>
<tr>
<td><%=WebPageMessagegetString(CUST_NAME)%>
</td>
<td><input type=text name=cust_name>
</td>
</tr>
</table>
第二種實現
<table>
<tr>
<td><in:message key=CUST_NAME/>
</td>
<td><input type=text name=cust_name>
</td>
</tr>
</table>
資源文件(message_zh_CNproperties)內容
CUST_NAME=客戶姓名
)jsp tag部分
有時候jsp tag的屬性值也是和具體語言相關的字符串此時需要該屬性支持java expression如不支持可修改<rtexprvalue>false</rtexprvalue>為<rtexprvalue>true</rtexprvalue>例如
原代碼
<dictselect businessType=SEX nullLabel=未知/>
新代碼
<dictselect businessType=SEX nullLabel=<%=WebPageMessagegetString(NULL)%>/>資源文件(message_zh_CNproperties)內容NULL=未知
()jscssimage部分
對於這三種元素需要根據不同的語言環境加載不同的資源文件我們可以在jsp對應的目錄下建立一個resources目錄然後在下面按地區語言名建立文件夾本分別保存前語言對應的jscssimage資源為了實現此目的可以把以前html的引用方式改成jsp tag來引用原資源文件例如
Html引用
<SCRIPT SRC=/resources/scripts/messagejs LANGUAGE=javascript></SCRIPT> <LINK HREF=/resources /css/stylecss REL=stylesheet TYPE=text/css/> <IMG SRC=/resources/images/titlegif WIDTH= HEIGHT= BORDER= ALT=title>
Jsp tag引用
<injavascript src=/resources/scripts/messagejs/> <incss /> <inimage src=/resources/images/titlegif width= height= border= alt=title/>
假如當前浏覽器環境為zh_CN那麼上述tag生成的html代碼如下
<script language=javascript> var Message= { getString function(){ return eval(this + arguments[])} } </script> <SCRIPT SRC=/resources/zh_CN/scripts/messagejs LANGUAGE=javascript></SCRIPT> <LINK HREF=/resources/zh_CN/css/stylecss REL=stylesheet TYPE=text/css/> <IMG SRC=/resources/zh_CN/images/titlegif WIDTH= HEIGHT= BORDER= ALT=title>
值得注意的是對於js資源引用需要插入一段javascript代碼對應的國際化資源內容如下
Messagecalendar_JANUARY=一月 Messagecalendar_FEBRUARY=二月 Messagecalendar_MARCH=三月 Messagecalendar_APRIL=四月 Messagecalendar_MAY=五月 Messagecalendar_JUNE=六月 Messagecalendar_JULY=七月 Messagecalendar_AUGUST=八月 Messagecalendar_SEPTEMBER=九月 Messagecalendar_OCTOBER=十月 Messagecalendar_NOVEMBER=十一月 Messagecalendar_DECEMBER=十二月
國際化時需作如下替換
原代碼
var mon = 一月
新代碼
var mon = MessagegetString( calendar_JANUARY)
編碼國際化
服務器配置
服務器端配置主要包括兩方面其一要指定環境語言其二要指定字符集編碼
環境語言
一般服務器的JVM缺省語言和操作系統平台一致但也可以為JVM指定特定的缺省語言具體配置例如Duserlanguage=zh Duserregion=CN
字符集編碼
一般情況下一種語言會對應一種或多種字符集編碼例如中文可以用GB編碼來顯示日文可以用ShiftJIS編碼來顯示一旦遇到客戶端浏覽器設置的是GB編碼而頁面上有日文或韓文的內容就不能正確顯示了假如采用UTF編碼方式就不會出現這種情況了因為UTF編碼幾乎被所有的操作系統平台支持並且包含了世界上絕大多數語言
為統一編碼我們需要在JVM參數浏覽器請求Web Server響應三個方面進行配置具體如下
aJVM參數
Dfileencoding=UTF針對EOS還需指定Dxmlencoding=UTF
b浏覽器請求
如果Web Serve支持jsp規范我們可以直接在WEBINF目錄下的webxml中指定編碼方式如
<jspconfig> <jsppropertygroup> <urlpattern>*jsp</urlpattern> <pageencoding>UTF</pageencoding> </jsppropertygroup> </jspconfig>
設置完畢還需檢查jsphtml頁面中的字符顯示設置是不是UTF或者直接把頁面顯示字符設置刪除例如
<%@ page language=java contentType=text/html charset=UTF pageEncoding=UTF%> <META httpequiv=ContentType content=text/html charset=UTF>
cWeb Server響應
如果是jsp則需指定<% request setCharacterEncoding(UTF) %>
如果是servlet則需調用 HttpServletRequest setCharacterEncoding(UTF)
這兩條語句均要在放在getParameterValue()getParameterValues()語句之前
文件編碼
如果一個文件原編碼是GBK現要以UTF編碼顯示我們會發現除了ASCII碼之外的字符都是亂碼其原因是UTF僅僅和ASCII碼兼容除此之外同一字符的編碼值並不相等為解決這一問題我們還需把Web應用涉及到的jsphtmlcssjs等文本文件的格式轉換成UTF編碼又由於windows操作系統識別UTF文件時是靠該文件的頭三個字節的內容判斷的而java虛擬機並不識別此文件頭(BOM)故轉換編碼時一定不能包含BOM頭
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26277.html