文章出處

保留全局級國際化信息資源文件。并在message.properteis中增加一個帶有參數的國際化信息。 

Java代碼  收藏代碼
  1. labela = labela in zh_CN    
  2. labelb = labelb,{0}  



<s:text>訪問國際化信息 
用<s:text>標簽來訪問國際化信息,只需要在它的name屬性上填入需要的key即可。下面,來看看它的其它的屬性。 
1:使用帶參數的國際化信息 
       可以用參數把一些可變值傳給國際化信息,在<s:text>標簽訪問國際化信息的時候,只需要配合上<s:param>子標簽即可傳入參數,示例如下: 

Java代碼  收藏代碼
  1. <%@ taglib prefix="s" uri="/struts-tags" %>    
  2. <s:text name="labela"/>    
  3. <hr>    
  4. <s:text name="labelb">    
  5.     <s:param>ok</s:param>    
  6. </s:text>  

  
上面的示例中,key為labela的國際化信息沒有參數,因此<s:text>標簽直接結束,沒有子標簽;而key為labelb的國際化信息有參數,因此<s:text>標簽用<s:param>子標簽來傳入參數值ok。在運行的時候,參數{0}被替換為ok 

2:指定國際化信息來源 
再來添加一個國際化信息來源。比如,恢復包級國際化信息資源文件,也就是package_zh_CN.properties文件,內容如下: 

Java代碼  收藏代碼
  1. labela = labela in zh_CN with package    


現在,同時存在全局級國際化信息資源和包級國際化信息資源,根據前面所學的知識,包級國際化信息資源會覆蓋全局級國際化信息資源,因此,<s:text name=”labela”/>將會返回在package_zh_CN.properties中定義的labela = labela in zh_CN with package。 
       現在需要仍然顯示全局級的國際化信息,該怎么辦呢? 
       可以通過<s:i18n>標簽,來為<s:text>標簽指定國際化信息來源。如果<s:text>標簽作為<s:i18n>標簽的子標簽出現,則會使用<s:i18n>指定的國際化信息來源。把jsp修改如下: 

Java代碼  收藏代碼
  1. <%@ taglib prefix="s" uri="/struts-tags" %>    
  2.     
  3. <s:text name="labela"/>    
  4. <hr>    
  5. <s:i18n name="message">    
  6.     <s:text name="labela"/>    
  7. </s:i18n>    


解釋一下如何引用國際化信息資源,仍然分為三種情況討論: 
全局級國際化信息資源:直接用文件前綴名即可—message。 
包級國際化信息資源:用這個包的全限定名+package—cn.javass.i18n.package。 
類級國際化信息資源:用這個類的全限定名—cn.javass. i18n.I18NAction。 
上面的示例中,第一個<s:text>標簽沒有作為<s:i18n>的標簽子標簽出現,則它訪問包級國際化信息資源;而第二個<s:text>標簽作為<s:i18n>標簽的子標簽出現,則它訪問<s:i18n>標簽中指定的message國際化信息資源 

Java代碼  收藏代碼
  1. <%@ taglib prefix="s" uri="/struts-tags" %>    
  2. <s:form>    
  3.     <s:textfield name="name1" label="labela"/>    
  4. </s:form>  



它采用<s:form>的默認主題(xhtml)建立了一個一行一列的表單,其中,<s:textfield>標簽的label屬性用于在文本框前生成這個文本框的說明,label屬性就是簡單的把它的值“labela”放在了文本框前。 
       現在只需要做個小小的改動,就可以訪問國際化的信息了,簡單的把label屬性改為key屬性,就可以訪問國際化信息來顯示文本框前的說明信息了,示例如下: 

Java代碼  收藏代碼
  1. <%@ taglib prefix="s" uri="/struts-tags" %>    
  2. <s:form>    
  3.     <s:textfield name="name1" key="labela"/>    
  4. </s:form>  

  
與<s:textfield>類似,s標簽中的其他可見表單域標簽也都支持使用key屬性來訪問國際化信息,包括:<s:label/>、<s:textarea/>、<s:password/>、<s:submit/>等等,這里就不再去列舉了。 
使用表單標簽還有兩個問題: 
表單標簽在訪問國際化信息的時候,不能使用<s:param>標簽指定參數值。 
表單標簽也可以使用<s:i18n>標簽來指定國際化信息來源,代碼示例如下: 

Java代碼  收藏代碼
  1. <%@ taglib prefix="s" uri="/struts-tags" %>    
  2. <s:form>    
  3.     <s:textfield name="name1" key="labela"/>    
  4. </s:form>    
  5. <hr>    
  6. <s:i18n name="message">    
  7.     <s:form>    
  8.         <s:textfield name="name1" key="labela"/>    
  9.     </s:form>    
  10. </s:i18n>   


可以看到,第一個仍訪問默認的國際化信息來源,而第二個則指定了名稱為message的全局級國際化信息。 

在Action中訪問國際化信息 
前面都是在頁面上來訪問國際化的信息,如果要在Action中訪問國際化信息,該怎么辦呢? 
       如果我們自己寫的Action類繼承自ActionSupport,就可以直接使用ActionSupport的一系列getText方法來訪問國際化信息。這些方法聲明于ActionSupport類實現的TextProvider接口。 
分為三種情況討論: 
訪問沒有參數的國際化信息。 
直接調用最簡單的getText(String aTextName)即可,傳入國際化信息的key,這個在前面講ActionSupport的時候,就示例過這種情況。 
訪問有參數的國際化信息。 
調用可以設置參數的getText(String aTextName,String defaultValue,String… args),其中,第一個參數為國際化信息的key,第二個參數為找不到此key時返回的默認值,第三個String[]參數傳入需要傳給國際化信息的參數。 

指定國際化信息來源。 
調用其getTexts(String aBundleName)可以返回一個ResourceBundle對象,可然后就可以自由操作此ResourcBundle對象。 
       比如,可以在execute方法中訪問國際化信息,示例如下: 


Java代碼  收藏代碼
  1. public class I18NAction  extends ActionSupport{    
  2.     public String execute() throws Exception {    
  3.         System.out.println(this.getText("labela"));    
  4.         System.out.println(this.getText("labelb",null,"ok"));    
  5.         ResourceBundle bundle = this.getTexts("message");    
  6.         System.out.println(bundle.getString("labela"));    
  7.         return SUCCESS;    
  8.     }    
  9. }    


在上例中,第一句訪問默認的國際化信息,第二句訪問默認的國際化信息并傳入參數值為ok,第三句訪問名為message的全局國際化信息。訪問這個Action,運行的結果是 


引用
labela in zh_CN with package  
labelb,ok  
labela in zh_CN 

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()