1. 程式人生 > >Struts2國際化詳細配置說明

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來輸出,從而實現程式的國際化。

3) 驗證框架xml配置檔案的國際化.
<!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";
}