Struts2國際化詳細配置說明
一.首先了解一下什麼是國際化:
國際化的英文為Internationalization,所以它又稱為I18n(internationalization的首末字元i和n,18為中間的字元數)。i18n支援多種語言,但是同一時間只能是英文和一種選定的語言,例如英文+中文、英文+德文、英文+韓文等等;為了使不同國家地區的人使用到適應他們環境和語言的軟體或網站,國際化成為了Java的必要因素之一。國際化機制在軟體開發過程中,使得軟體與特定的語言或地區脫鉤。當我們做的軟體被移植到其他國家時,不必更改軟體本身的程式碼就可以適應當地區的使用了,所以國際化是必須的。
二.通過測試程式碼獲得本機作業系統的預設語言和區域。
測試程式碼:
public static void main(String[] args) {
Locale defaultLocale=Locale.getDefault();
System.out.println("country="+defaultLocale.getCountry());
System.out.println("language="+defaultLocale.getLanguage());
}
三.國際化的配置
1.先要配置baseName來指定資原始檔,可在struts.xml檔案中配置
<constant name="struts.custom.i18n.resources" value="message"></constant>
注:程式碼中的message為baseName,此後的資原始檔名必須為它。
2.資原始檔
為了實現程式的國際化,必須先提供程式所需要的資原始檔。資原始檔的內容是很多的 key-value對,其中key是程式使用的部分,而value是程式的顯示部分。
資原始檔的命名可以是如下3種形式:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是資原始檔的基本名稱,使用者可自由定義,而language和country都不可隨意變化,必須是Java所支援的語言和國家。
Java不可能支援所有的國家和語言,可以通過Locale類的getAvailableLocale方法獲取支援的,該方法返回一個Locale陣列,該陣列中包含了所有支援的國家和語言。
獲取所支援的語言和國家程式碼如下:
public static void main(String[] args) {
Locale [] locales = Locale.getAvailableLocales();
for(Locale locale:locales){
//輸出所有支援的國家 System.out.print(locale.getDisplayCountry()+":"+locale.getCountry());
//輸出所有支出的語言 System.out.println(locale.getDisplayLanguage()+":"+locale.getLanguage());
}
}
首先編寫兩個資原始檔,例如:
message_zh_CN.properties
title=標題
message_en_US.properties
title=title
struts2資原始檔的管理:
a.全域性範圍,在classes路徑下。
baseName-language-country.properties.如message_zh_CN.properties
b.包範圍,在包根路徑下。
package-language-country.properties.如package_zh_CN.properties
c.類範圍,在該類同一路徑下。
actionName-language-country.properties.如LoginAction_zh_CN.properties
3.struts2的國際化分三種情況,同時也分三個範圍,分別為:前臺頁面的國際化,Action類中的國際化,驗證框架xml配置檔案的國際化。
1)為了在JSP頁面中輸出國際化訊息,可以使用Struts2的<s:text…/>標籤,該標籤可以指定 一個name 屬性,該屬性指定了國際化資原始檔中的key.
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<!—使用s:text 標籤輸出國際化訊息-->
<title><s:text name="loginPage"/></title>
</head>
<body>
<h3><s:text name="loginTip"/></h3>
<!—在表單元素中使用key來指定國際化訊息的key-->
<s:form action="Login" method="post">
<s:textfield name="username" key="user"/>
<s:password name="password" key="password"/>
<s:submit name="submit" key="submit" />
</s:form>
</body>
</html>
2) 為了在Action類中訪問國際化訊息,可以使用ActionSupport類的getText方法,該方法可以接受一個name 引數,該引數指定了國際化資原始檔中的key .public class LoginAction extends ActionSupport{
//完成輸入校驗需要重寫的validate方法(讀取資原始檔getText(String str))
public void validate(){
//呼叫getText方法取出國際化資訊
if(getUsername()==null||"".equals(this.getUsername().trim())){
this.addFieldError("username", this.getText("username.required"));
}
if(this.getPassword()==null||"".equals(this.getPassword().trim())){
this.addFieldError("password", this.getText("password.required"));
}
}
}
通過在Action類中呼叫ActionSupport類的getText通過這種方式,就可以取得國際化資源文件中的國際化訊息。通過這種方式,即使Action需要設定在下一個頁面顯示的資訊,也無需直接設定字串常量,而是使用國際化訊息的key來輸出,從而實現程式的國際化。
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="name">
<field-validator type="requiredstring">
<param name="tirm">true</param>
<message key="name"></message>
</field-validator>
</field>
</validators>
4.實現在jsp頁面中的中英文切換。
Action中的程式碼:
public String changeLanguage() {
// 1、根據頁面請求,建立下同的Locale物件
Locale locale = Locale.getDefault();
if(flag.equals(null) || flag.equals("")){
locale = new Locale("zh", "CN");
}else if (flag.equals("zh")) {
locale = new Locale("zh", "CN");
} else if (flag.equals("en")) {
locale = new Locale("en", "US");
}
/*
* 2、設定Action中的Locale 前臺頁面的Locale和後臺session中的Locale範圍是不一樣的
* a)只改頁面Locale當前頁面資訊會改變但提交後Locale又會改回到預設的
* b)改變了後臺Locale,當前執行緒中的頁面Locale並不會改變,但會隨下一次提交
* Action一同改變,所以可能要重新整理頁面兩次,第一次只變後臺Locale,第二次 前臺和後臺同時改變
* 為避免上述情況,需要前臺和後臺的Locale一起改變
*/
ActionContext.getContext().setLocale(locale);
ServletActionContext.getRequest().getSession().setAttribute("WW_TRANS_I18N_LOCALE", locale);
System.out.println(SystemUtil.getPropertiesValue("currentLang")+this.getText("login.name"));
return "SUCESS";
}