1、資源文件命名
國際化資源文件命名格式如下:
1
2
3
|
basename_language_country.properties basename_language.properties basename.properties |
其中basename為資源文件的基本名稱,language和country必須是java支持的語言和國家。獲取java支持的語言和國家代碼如下:
1
2
3
4
|
Locale[] locales = Locale.getAvailableLocales(); for (Locale locale:locales){ System.out.println( "country:" + locale.getCountry() + ",language:" + locale.getLanguage()); } |
2、資源文件的配置和獲取
新建資源文件,在中文環境下,資源文件中的value值需要進行ascii轉換,可以通過運行后輸入native2ascii進行轉換,另外本文中使用了eclipse的屬性文件插件,因此直接顯示為中文。屬性文件配置如下:
info_en_US.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
username=zhangsan info_zh_CN.properties username=張三 info_zh.properties username=李四 password=lisi info.properties username=王五 password=wangwu email=郵箱 |
另外,如果需要讀取到屬性文件中的值,需要在struts-config.xml文件中配置常量。
1
2
|
<!-- 使用資源文件名稱 ,其中value值代表資源文件的baseName--> < constant name = "struts.custom.i18n.resources" value = "info" ></ constant > |
頁面獲取資源文件的方式為通過struts標簽<s:text/>,如下所示:
1
2
3
4
|
<!-- 資源文件獲取key值 --> < s:text name = "username" /> < s:text name = "password" /> < s:text name = "email" /> |
另外,如果在form表單中獲取key值,方式如下:
1
2
|
<!--其中key值為資源文件中的key值,作用是為輸入框添加label名稱,和label的屬性值一樣。但是在常量中會導致key值不能夠從屬性文件獲取對應的value--> < s:textfield name = "login.username" key = "username" ></ s:textfield > |
另請注意在常量<constant name="struts.ui.theme" value="simple"/>使用時會導致<s:textfield/>中的key值不能夠從屬性文件獲取對應的value。
最后頁面顯示結果如下:
從以上的配置文件中可以看出這三個值的取值來源,由此可以看出,資源文件的搜索順序如下:
先從basename_language_country.properties中尋找相關的key值,沒有則尋找basename_language.properties中尋找相關的key值,沒有則到basename.properties中尋找相關的key值,沒有則顯示為name的值。
3、屬性文件中占位符的使用
屬性文件配置內容如下:
username=張三,{0},{1}
在jsp中使用標簽<s:param>值</s:param>進行參數的傳遞。
1
2
3
4
|
< s:text name = "username" > < s:param >你好</ s:param > < s:param >歡迎你!</ s:param > </ s:text > |
4、action中應用資源文件
在action中使用資源文件,需要繼承ActionSupport類,ActionSupport類實現了TextProvider, LocaleProvider這兩個接口,其中TextProvider提供了獲取資源文件值的方法getText()方法,而LocaleProvider接口只有一個getLocale()方法,用來獲取Locale。
修改配置文件info_zh_CN.properties:
1
2
|
username=張三,{0},{1} usernameError=用戶名稱不能為空!請確認! |
在action中,獲取屬性文件方法如下:
1
|
this .getText( "usernameError" ); |
在action中使用占位符進行操作,代碼如下:
1
|
this .getText( "username" , new String[]{ "你好" , "歡迎你" }); |
5、包范圍的資源文件
處于該包以及子包下的action都能訪問到該資源文件,放置位置為某個包下面,命名格式為:package_language_country.properties。其中package為固定格式。配置文件package_zh_CN.properties如下:
username=包范圍下的username
在包下面的action中可以使用getText(“username”)的方式獲取。
6、action范圍的資源文件
可以為某個單獨的action指定一個屬性文件,放置位置為某個action同級目錄下。命名格式為
1
|
ActionName_language_country.properties |
。
配置action范圍的屬性文件:
1
|
username=action范圍內的username |
action中同樣使用getText(“username”)方法進行獲取值。
7、資源文件的加載順序
對于action的使用getText(key)值來說,當同時存在action范圍內的屬性文件、包范圍內的屬性文件和全局屬性文件時,加載順序如下:
首先,在指定action內的屬性文件是否存在key值,如果存在,則取值,如果不存在,則查找當前action上一級包中是否存在指定key值的包范圍屬性文件,不存在則繼續上一級包中尋找,如果一直沒有找到,則在全局的屬性文件中尋找是否存在指定key值。如果存在指定的key值,則取出key值對應的value值,如果不存在,則默認為key值。
另外,當全局屬性文件,有多個資源文件時,需要按照basename_language_country、basename_language、basename的順序進行尋找。
8、頁面獲取資源文件
(1)使用<s:i18n/>訪問某個資源文件。
代碼如下:
1
2
3
4
5
6
7
8
9
|
<!-- 使用i18n標簽獲取屬性文件 --> <!-- 獲取包范圍下的資源文件 --> < s:i18n name = "com/struts/package" > < s:text name = "username" ></ s:text > </ s:i18n > <!-- 獲取action范圍下的資源文件 --> < s:i18n name = "com/struts/service/LoginService" > < s:text name = "username" ></ s:text > </ s:i18n > |
(2)<fmt/>的使用
JSTL中包含了國際化和格式化標簽,使用國際化標簽可以讓一個jsp頁面可以根據訪問者所在的區域輸出不同語言的頁面表述。在此需要使用Maven添加依賴jar包。配置文件如下:
1
2
3
4
5
6
|
<!-- 引入jstl標簽庫 --> < dependency > < groupId >jstl</ groupId > < artifactId >jstl</ artifactId > < version >1.2</ version > </ dependency > |
在jsp頁面使用fmt標簽,應用代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<!-- 使用jstl標簽fmt --> <!-- 設置語言環境,會覆蓋客戶端傳遞的怨言 --> < fmt:setLocale value = "zh_CN" scope = "request" /> <!-- 裝載一個資源集,并保存在EL變量中 ,basename為基本名稱,如果為包范圍下則為com.struts.package,action范圍下為com.struts.service.LoginService--> < fmt:setBundle basename = "info" scope = "request" var = "baseName" /> < fmt:message key = "username" bundle = "${baseName }" > <!-- 占位符的傳遞參數 --> < fmt:param value = "您好" /> < fmt:param value = "歡迎" /> </ fmt:message >< br /> <!--fmt:bundle 設置一個只在標簽體內的訪問的資源集 --> <!-- package范圍下的資源文件 --> < fmt:bundle basename = "com.struts.package" > < fmt:message key = "username" /> </ fmt:bundle > <!-- action范圍下的資源文件 --> < fmt:bundle basename = "com.struts.service.LoginService" > < fmt:message key = "username" /> </ fmt:bundle > |