<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 117  文章 - 72  trackbacks - 0

    聲明:原創(chuàng)作品(標(biāo)有[原]字樣)轉(zhuǎn)載時(shí)請(qǐng)注明出處,謝謝。

    常用鏈接

    常用設(shè)置
    常用軟件
    常用命令
     

    訂閱

    訂閱

    留言簿(7)

    隨筆分類(130)

    隨筆檔案(123)

    搜索

    •  

    積分與排名

    • 積分 - 155602
    • 排名 - 391

    最新評(píng)論

    [標(biāo)題]:[原]Struts2-國(guó)際化
    [時(shí)間]:2009-8-9
    [摘要]:Struts2 internationalization
    [關(guān)鍵字]:浪曦視頻,Struts2應(yīng)用開發(fā)系列,WebWork,Apache,國(guó)際化,i18n,multi-lingual,多語言,資源文件
    [環(huán)境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
    [作者]:Winty (wintys@gmail.com) http://www.tkk7.com/wintys

    [正文]:
        首先要在struts.xml中配置全局國(guó)際化文件Basename為message:
        <constant name="struts.custom.i18n.resources" value="message" />
    1、JSP頁面的國(guó)際化
    a.普通信息國(guó)際化
    在src目錄下新建message.properties(optional,沒有zh_CN和en_US等資源文件時(shí)就會(huì)找message.properties),新建對(duì)應(yīng)的中文和英文properties為:
    message_zh_CN.properties、message_en_US.properties。

    /StrutsHelloWorld/src/message_en_US.properties:
    wintys.i18n.title=Register

    /StrutsHelloWorld/src/message_zh_CN.properties:
    wintys.i18n.title=注冊(cè)

    在JSP頁面中使用:
    <s:text name="wintys.i18n.title" />

    在瀏覽器中訪問時(shí),會(huì)根據(jù)不同的Locale顯示相應(yīng)的國(guó)際化信息。

    b.表單信息國(guó)際化
    同樣是在message_zh_CN.properties、message_en_US.properties中配置key=value。

    JSP頁面中的表單:
    <s:form action="...">
        ......
        <s:textfield name="name" key="wintys.i18n.name" />
        ......
    </s:form>

    沒有國(guó)際化時(shí)是用<s:textfield label="name" />,國(guó)際化后應(yīng)該用<s:textfield name="name" key="wintys.i18n.name" />

    注意,國(guó)際化時(shí),表單的theme不能為simple

    c.國(guó)際化標(biāo)簽<s:i18n />
    除了可以使用<s:text />國(guó)際化,還可以使用<s:i18n />。<s:text />會(huì)在message_XX_XX.properties中查找key(如果有包級(jí)別、類級(jí)別的properties,則會(huì)優(yōu)先應(yīng)用包級(jí)別和類級(jí)別的properties)。而<s:i18n name="basename"/>則在basename指明的文件(/src/basename_XX_XX.properties)中查找key。

    /StrutsHelloWorld/src/messagefile_en_US.properties:
    wintys.i18n.desc = description
    wintys.i18n.addition = {0} , additional information


    /StrutsHelloWorld/src/messagefile_zh_CN.properties:
    wintys.i18n.desc = "u8BF4"u660E
    wintys.i18n.addition ={0} , "u989D"u5916"u4FE1"u606F

    使用如下:
    <s:i18n name="messagefile">
        <s:text  name="wintys.i18n.desc"/><br/>
        <s:text name="wintys.i18n.addition">
            <s:param>Hello</s:param>
        </s:text>
    </s:i18n>


    2、Action中的國(guó)際化
        ActionSupport類中有一系列重載的getText()方法,用于國(guó)際化。
    一句話:addActionError(getText("wintys.i18n.name.invalid"));。addFieldError()也類似。

    /StrutsHelloWorld/src/wintys/struts2/i18n/I18nAction.java:
    package wintys.struts2.i18n;
    import com.opensymphony.xwork2.ActionSupport;
    /**
     *
     * @author Winty (wintys@gmail.com)
     * @version 2009-8-9
     * @see http://wintys.blogjava.net
     */
    public class I18nAction extends ActionSupport {
        private static final long serialVersionUID = 2188344424923390101L;
        
        private String name;
        private int age;
        
        //此處省略了getter and setter
            
        @Override
        public void validate() {
            if(name == null || "".equals(name.trim()) ){
                //before i18n
                //addActionError("name should not be empty");
                
                //after i18n
                //帶參數(shù)也可以:getText(String key , String[] args);
                addActionError(getText("wintys.i18n.name.invalid"));
            }
        }
        
        @Override
        public String execute() throws Exception {    
            return SUCCESS;
        }
    }

    3、驗(yàn)證框架的國(guó)際化
    一句話:<message key="wintys.i18n.age.conversion.error" />。
    還可以使用<message>${getText("name.invalid")}</message>。

    /StrutsHelloWorld/src/wintys/struts2/i18n/I18nAction-validation.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC
              "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
              "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
     <validators>
         <field name="age">
             <field-validator type="conversion" short-circuit="true">
                 <!-- before i18n:<message>age conversion error</message> -->
                 <message key="wintys.i18n.age.conversion.error" />
             </field-validator>
             <field-validator type="int">
                 <param name="min">1</param>
                 <param name="max">150</param>
                 <!-- <message>age range: ${min} ~ ${max}</message> -->
                 <message key="wintys.i18n.age.exceed.range"/>
             </field-validator>
         </field>
     </validators>

    4、局部國(guó)際化文件
        前面所定義的key都是在全局國(guó)際化文件message_XX_XX.properties中定義的,也可以定義包級(jí)別和類級(jí)別的properties,其中key的優(yōu)先級(jí)是:類級(jí)別>包級(jí)別>全局。

        a.包級(jí)別properties
            在包中新建"package_XX_XX.properties"。
    /StrutsHelloWorld/src/wintys/struts2/i18n/package_en_US.properties:
    wintys.i18n.name = Name
    wintys.i18n.age = Age
    wintys.i18n.submit = Submit

    /StrutsHelloWorld/src/wintys/struts2/i18n/package_zh_CN.properties:
    wintys.i18n.name = \u59D3\u540D
    wintys.i18n.age = \u5E74\u9F84
    wintys.i18n.submit = \u63D0\u4EA4

        b.類級(jí)別properties
            在包中新建"類名_XX_XX.properties"。
    /StrutsHelloWorld/src/wintys/struts2/i18n/I18nAction_en_US.properties:
    wintys.i18n.name = Name(class level)
    wintys.i18n.age = Age(class level)
    wintys.i18n.submit = Submit(class level)

    /StrutsHelloWorld/src/wintys/struts2/i18n/I18nAction_zh_CN.properties:
    wintys.i18n.name = \u59D3\u540D(\u7C7B\u7EA7\u522B)
    wintys.i18n.age = \u5E74\u9F84(\u7C7B\u7EA7\u522B)
    wintys.i18n.submit = \u63D0\u4EA4(\u7C7B\u7EA7\u522B)

    注意:包級(jí)別、類級(jí)別properties只有在jsp頁面提交到action,正在顯示的頁面是.action時(shí),才能被讀取并顯示。

    5、其它
        a.Struts國(guó)際化由I18n攔截器實(shí)現(xiàn)(xwork-2.1.2.jar/com.opensymphony.xwork2.interceptor.I18nInterceptor)。

        b.在瀏覽器中設(shè)置不同的語言首選項(xiàng)即可看到國(guó)際化的效果。

    6、詳細(xì)代碼
    /StrutsHelloWorld/WebRoot/i18n/input.jsp:
    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>register</title>
        <meta http-equiv="pragma" content="no-cache">
      </head>
     
      <body>
          <s:actionerror/>
          
          <s:text name="wintys.i18n.title" />
          
        <s:form action="i18n" >
            <!--s:textfield name="name" label="姓名"/ -->
            <!-- s:textfield name="age" label="年齡" / -->
            <!-- s:submit name="submit" value=" 提交  " / -->
            <s:textfield name="name" key="wintys.i18n.name"></s:textfield><br/>
            <s:textfield name="age" key="wintys.i18n.age"></s:textfield><br/>
            <s:submit name="submit" key="wintys.i18n.submit"></s:submit>
        </s:form>
        
        <s:i18n name="messagefile">
            <s:text  name="wintys.i18n.desc"/><br/>
            <s:text name="wintys.i18n.addition">
                <s:param>Hello</s:param>
            </s:text>
        </s:i18n>
      </body>
    </html>


    /StrutsHelloWorld/WebRoot/i18n/output.jsp:
    <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>    
        <title>My JSP 'output.jsp' starting page</title>
      </head>
     
      <body>
        姓名:<s:property value="name"/><br/>
        年齡:<s:property value="age"/><br/>
      </body>
    </html>

    struts.xml配置:
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

    <struts>
        <!-- 定義全局錯(cuò)誤信息資源文件message.properties -->
        <constant name="struts.custom.i18n.resources" value="message" />
        <package name="MyStruts" extends="struts-default">        
            <!-- 國(guó)際化 -->
            <action name="i18n" class="wintys.struts2.i18n.I18nAction">
                <result name="success">/i18n/output.jsp</result>
                <result name="input">/i18n/input.jsp</result>
            </action>
        </package>
    </struts>


    /StrutsHelloWorld/src/message_en_US.properties:
    wintys.i18n.title=Register
    wintys.i18n.name.invalid=NAME should not be empty.
    wintys.i18n.age.conversion.error = age conversion error.
    wintys.i18n.age.exceed.range = age exceed range: ${min} ~ ${max}

    wintys.i18n.name = Name(global level)
    wintys.i18n.age = Age(global level)
    wintys.i18n.submit = Submit(global level)


    /StrutsHelloWorld/src/message_zh_CN.properties:
    wintys.i18n.title=\u6CE8\u518C
    wintys.i18n.name.invalid =\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A
    wintys.i18n.age.conversion.error =\u5E74\u9F84\u8F6C\u6362\u9519\u8BEF
    wintys.i18n.age.exceed.range =\u5E74\u9F84\u8D85\u51FA\u8303\u56F4\: ${min} ~ ${max}

    wintys.i18n.name = \u59D3\u540D(\u5168\u5C40)
    wintys.i18n.age = \u5E74\u9F84(\u5168\u5C40)
    wintys.i18n.submit =\u63D0\u4EA4(\u5168\u5C40)



    [參考資料]:
        [1] 《浪曦視頻之Struts2應(yīng)用開發(fā)系列》
        [2] 【Java EE】struts2國(guó)際化 : http://www.cnitblog.com/intrl/archive/2009/04/18/56464.html
        [3] Struts2 的國(guó)際化 : http://hi.baidu.com/countryroadtao/blog/item/4ac77e2b6ec3c4305243c125.html

    [附件]:
        源代碼 : http://www.tkk7.com/Files/wintys/Struts_helloworld_i18n.zip
    posted on 2009-08-10 18:13 天堂露珠 閱讀(770) 評(píng)論(2)  編輯  收藏 所屬分類: Struts

    FeedBack:
    # re: [原]Struts2-國(guó)際化 2009-08-28 18:46 心夢(mèng)帆影
    嗯,不錯(cuò),把浪曦視頻中的Struts2.0的內(nèi)容運(yùn)行在Struts2.1.6版本中.
    繼續(xù)學(xué)習(xí),呵呵

    有時(shí)間, 學(xué)一下Struts2.1.6的新特性!  回復(fù)  更多評(píng)論
      
    # re: [原]Struts2-國(guó)際化 2009-08-29 16:59 天堂露珠
    好的,多謝提醒。  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲AV日韩精品久久久久| www国产亚洲精品久久久| 免费国产黄网站在线观看视频| 久久久久久夜精品精品免费啦 | 亚洲中文字幕无码久久综合网| 亚洲av女电影网| 特级无码毛片免费视频尤物| 色视频色露露永久免费观看| 中文字幕不卡亚洲| 国产精品综合专区中文字幕免费播放| 亚洲av永久中文无码精品| 久久国产精品免费| 亚洲中文字幕不卡无码| 中文字幕无码日韩专区免费 | 在线不卡免费视频| 亚洲国产精品一区二区成人片国内| 亚洲人和日本人jizz| 成人无码精品1区2区3区免费看| 成人毛片18女人毛片免费96| 亚洲AV无码国产精品麻豆天美| 男女交性无遮挡免费视频| 男男AV纯肉无码免费播放无码 | 亚洲国产精品一区二区久| 2021免费日韩视频网| 亚洲成AV人片在线观看WWW| 国产精品免费看久久久| 久久久青草青青国产亚洲免观 | 亚洲国产美女福利直播秀一区二区 | 一级毛片免费在线| 成人免费a级毛片无码网站入口| 国产亚洲精品AAAA片APP| 国产精品免费观看| 亚洲精品无码久久久久久| 国产精品视频免费| 国产精品亚洲片在线花蝴蝶| 日韩一区二区在线免费观看| ASS亚洲熟妇毛茸茸PICS| 亚洲成人免费电影| 久久精品亚洲精品国产色婷 | 日韩人妻无码免费视频一区二区三区 | 亚洲综合图色40p|