國際化(internationalization)是設(shè)計和制造容易適應(yīng)不同區(qū)域要求的產(chǎn)品的一種方式。它要求從產(chǎn)品中抽離所有的與語言,國家/地區(qū)和文化相關(guān)的元素。換言之,應(yīng)用程序的功能和代碼設(shè)計考慮在不同地區(qū)運行的需要,其代碼簡化了不同本地版本的生產(chǎn)。開發(fā)這樣的程序的過程,就稱為國際化。
很多技術(shù)框架都提供國際化支持,struts2的國際化大致上分為頁面的國際化,Action的國際化以及xml的國際化。
我們將使用Struts2國際化技術(shù)實現(xiàn)登錄功能的國際化。實現(xiàn)根據(jù)客戶端的瀏覽器區(qū)域進行語言的切換,我們以英文和中文為例子。
右鍵點擊TestStruts2_001項目的“src”文件夾,選擇“New”->“File”在里面新建一文件:
在File name處輸入“struts.properties”。properties文件為資源文件。其內(nèi)容格式為:“Key=Value”。點擊“Finish”后即可看到打開了該文件,界面如下:
點擊“Add”按鈕,看到如下窗體:
在Name處輸入“struts.custom.i18n.resources”。這個為鍵名。
在Value處輸入“messageResource”。這個則為鍵值。
添加完后點擊“Finish”可以看到列表中出現(xiàn):
用同樣的方法,先新建一個名字叫messageResource_en_US.properties的文件,分別添加鍵值:
Name Value
netrobot.login.username username
netrobot.login.password password
netrobot.login.submitbutton submit
netrobot.helloworld Hello World!
得到下面列表:
使用同樣方法再創(chuàng)建一個messageResource_zh_CN.properties的文件,并且在里面添加鍵值:
Name Value
netrobot.login.username 用戶名
netrobot.login.password 密碼
netrobot.login.submitbutton 登錄
netrobot.helloworld 你好!
得到如圖:
注意,查看messageResource_zh_CN.properties的代碼視圖“Source”可以看到:
netrobot.login.username=u7528u6237u540D
netrobot.login.password=u5BC6u7801
netrobot.login.submitbutton=u767Bu5F55
netrobot.helloworld=u4F60u597DuFF01
中文不能直接寫在properties文件中,必須使ascii碼表示。
然后我們修改一下login.jsp頁面:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib prefix="s" uri="/struts-tags"%>
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <html>
5 <head></head>
6 <body>
7 <s:form action="loginAction" >
8 <s:textfield name="username" key="netrobot.login.username"/>
9 <s:password name="password" key="netrobot.login.password"/>
10 <s:submit key="netrobot.login.submitbutton"/>
11 </s:form>
12 </body>
13 </html>
在各個控件后加上相應(yīng)的key=””,即可實現(xiàn)頁面的國際化。表單控件有很多,其他控件的用法請參考struts2相關(guān)文檔。
我們再修改一下HelloWorld.java,在里面修改代碼如下:
1 package hello;
2 import com.opensymphony.xwork2.ActionSupport;
3 public class HelloWorld extends ActionSupport{
4 private String message;
5 public String getMessage() {
6 return message;
7 }
8 public void setMessage(String message) {
9 this.message = message;
10 }
11 public String execute(){
12 setMessage(getText("netrobot.helloWorld"));
13 return "success";
14 }
15 }
與之前的區(qū)別有兩個地方:1. HelloWorld類繼承了ActionSupport,要使用Struts2的國際化,必須繼承該類。2. 通過getText("label.helloWorld")方法獲得國際化后的HelloWorld值。通過getText方法可以實現(xiàn)Action中的國際化。
運行結(jié)果:
假如運行時,操作系統(tǒng)為英文操作系統(tǒng),則顯示英文界面如圖:
在控制面板將系統(tǒng)的“區(qū)域與語言”設(shè)置為“中文(中國)”,則顯示中文界面:
注意:
如需添加其他語言,只需增加messageResource_語言_國家.properties文檔即可。語言和國家的代碼請參考相關(guān)資料。
國際化資源文件分為三種級別(1)全局資源文件,可以被整個應(yīng)該程序引用,也就是struts.custom.i18n.resources = messageResource指定的文件。
(2) 包級資源文件,每個包的根目錄下可以新建資源文件,僅被當前包中的類訪問.文件名格式為:package_語言代碼_國家代碼.
(3) Action級資源文件,僅被當前Action引用,名稱為action名_語言代碼_國家代碼
查找順序為從小范圍到大范圍, Action級優(yōu)先級大。