上一篇已经明白了,实现国际化的原理,我们就开始实现,我们这个例子使用全局的国际化资源文件;

            前提,我们要实现国际化,其根本就是动态的调用不同资源文件,调用不同的语言的资源文件,又是依赖你的Locale对象,这个对象会检测你的语言设置;我们只要动态切换语言环境即可;语言切换原理:它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中  (这里也就是说session中保存的WW_TRANS_I18N_LOCALE这个值决定了这个请求的语言包);

      1、全局资源文件设置好,

      资源名:messageResource_en_US.properties      

                    messageResource_zh_CN.properties

       在strust.xml中设置,

     <constant name="struts.custom.i18n.resources" value="messageResource"/>;

      这样拦截器就会针对,资源文件进行一系列操作;

    2、写一个保存所有Locale的Action,以便在JSP中动态选择:


package lee;
import java.util.*;
public class Locales
{
                                                                                                                                                                                                                                        
    private Locale current;
    public void setCurrent(Locale cur)
    {
        this.current = cur;
    }
                                                                                                                                                                                                                                        
    public Map<String, Locale> getLocales()
    {
        Map<String, Locale> locales =new Hashtable<String, Locale>();
        ResourceBundle bundle=ResourceBundle.getBundle("messageResource", current);
                                                                                                                                                                                                                                            
        locales.put(bundle.getString("enus"), Locale.US);
        locales.put(bundle.getString("zhcn"), Locale.CHINA);
        //System.out.println(Locale.US+"-----"+Locale.CHINA);
        //System.out.println(this.current);
        return locales;
    }
}


        3、在JSP页面动态选择;

     

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<script type="text/javascript">
function langSelecter_onChanged()
{
    document.getElementById("langForm").submit();
}
</script>
<%--语言切换原理:它的原理为在执行Action方法前,
i18n拦截器查找请求中的一个名为"request_locale"的参数。
如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale)
,最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中 
 (这里也就是说session中保存的WW_TRANS_I18N_LOCALE这个值决定了这个请求的语言包)--%>
1.session:  <s:property value="#session['WW_TRANS_I18N_LOCALE']"/><br />
2.locale:  <s:property value="locale"/><%--locale为ActionSupport类的getLocale()方法的调用--%><br/>
<!-- 使用lee.Locales创建locales实例 -->
<s:bean var="locales" name="lee.Locales">
    <s:param name="current"  value="locale"/>
</s:bean>
<form action="" id="langForm"
    style="background-color:#bbbbbb; padding-top: 4px; padding-bottom: 4px;">
    <s:text name="language"/>
    <s:select  list="#locales.locales"
        listKey="value" listValue="key"
        value="locale"
        name="request_locale"
        onchange="langSelecter_onChanged()" theme="simple"/>
</form>


说明:在进行语言选择前,已经经过了Action的处理,在你的action中已经获得了当前所有的项目支持的语言资源文件;并且返回,保存在值栈中,然后,你在JSP页面中,使用strust的标签获得所能获得的所有值:bean、以及locals这个map中的值,使用list标签将value/key都显示出来,list=“#locals.locals” listKey="value" ;listValue="Key";然后根据语言的切换原理,你必须添加名为固定值的参数:name=“request_locale”value="locale";这样,你在提交的时候,拦截器会寻找request_locale并检查他的值,这个值便是决定使用哪个语言包,最初这个是根据

ResourceBundle bundle=ResourceBundle.getBundle("messageResource", current);来决定的,是当前系统的默认值;但是在你的Action中,将这个值设定好,又将所有的语言包绑定保存在值栈中,在前台,你使用list=“#locals.locals”获得所有语言包,你在下拉框中动态的改变ResourceBundle bundle=ResourceBundle.getBundle("messageResource", current);的值,提交的时候,拦截器再次拦截,ResourceBundle bundle=ResourceBundle.getBundle("messageResource", current);的值便会改变,再次在前台显示的时候,就会是你所选的语言。

至于,name=“request_locale”value="locale"中value的值,是值栈中#SESSION_LOCALE的值,

     说的有些复杂了,自己在代码中运行体会吧!