上一篇已经明白了,实现国际化的原理,我们就开始实现,我们这个例子使用全局的国际化资源文件;
前提,我们要实现国际化,其根本就是动态的调用不同资源文件,调用不同的语言的资源文件,又是依赖你的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的值,
说的有些复杂了,自己在代码中运行体会吧!