首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

STRUTS 2 国际化并自定义切换语言的有关问题解决

2012-08-25 
STRUTS 2国际化并自定义切换语言的问题解决在struts2配置文件struts.xml中添加好国际化拦截器,struts。prop

STRUTS 2 国际化并自定义切换语言的问题解决
在struts2配置文件struts.xml中添加好国际化拦截器,struts。properties中指定好资源文件后(这2步网上一搜一大把,就不再写),项目的国际化就弄好了。现在把浏览器的语言改成其他语言能顺利国际化访问。

  这一步做好后,我们开始要做自定义国际化切换的功能。这个功能网上搜到的内容都是错误,所以特此在此记录下,以方便后来人。
  网上很多说自定义国际化切换只要修改保存在session中的struts2国际化常量的值“WW_TRANS_I18N_LOCALE”就行了。
  实际上时完全错误,我们先看看struts2国际化的步骤:

1、判断struts.locale属性(在struts.properties)是否有值,如果有值,将这个值转换为Locale对象保存到ActionContext中。
2、如果没有设置struts.locale,从浏览器发送的请求报头里获得语言信息,创建Locale对象,保存到ActionContext中。
3、I18nInterceptor拦截器获取名为request_locale请求参数的值,如果这个值存在则创建以这个值的Locale对象,然后将这个对象作为session的属性(WW_TRANS_I18N_LOCALE)保存,并保存到ActionContext中。


在修改session的WW_TRANS_I18N_LOCALE值和request_locale等无效之后,发现程序始终是只会读取浏览器发送过来的区域信息。估计这是struts2国际化得BUG了。

知道了struts2的原理后,就好解决,我们现在要做的就是用用户自定义切换的国际化区域信息来替代浏览器请求报头里的语言信息。

先写一个过滤器,代码如下:


这个request包装器主要作用就是从session里获得区域对象,并修改请求报头,从而实现了自定义国际化切换。

如果本方法有问题或者各位有更好的方法,请告知。谢谢

js  Code:
private static final String LANGUAGE="language";//application中keyprivate String locale_language;//界面选择的语言public String getLocale_language() {return locale_language;}public void setLocale_language(String localeLanguage) {locale_language = localeLanguage;}public String changeLanguage(){writeLanguage();return "success";}//写cookiepublic void writeLanguage(){HttpServletResponse response=ServletActionContext.getResponse();Cookie cookie = new Cookie(LANGUAGE, locale_language);cookie.setMaxAge(356*24*60*60);response.addCookie(cookie);}//默认初始语言   或是  找用户计算机上的cookie信息public String getLanguage(){HttpServletRequest request=ServletActionContext.getRequest();Cookie[] cookies= request.getCookies();//cookie 中没有语言  默认从application取String language=ServletActionContext.getContext().getApplication().get(LANGUAGE).toString();for(Cookie ck : cookies){if(ck.getName().equals(LANGUAGE)&&ck.getValue()!=null&&!"".equals(ck.getValue())){logger.debug("cookie------->language:"+ck.getValue());language=ck.getValue();}}logger.debug("----------->language:"+language);ActionContext.getContext().setLocale(new Locale(language));return language;}

没有其它拦截器什么的!只用到了你的那两个类。登陆成功之后就会调用getlanguage()方法,跳转到主界面。还有:有什么好方法让登陆的页面也改变成cookie中语言啊!

热点排行