struts2 通过下拉框来手动切换国际化 博客分类: Struts2 struts2i18n国际化手动直接访问jsp
之前使用struts2实现过国际化,但当时都是以用户的浏览器的locale为主去加载相应的资源文件的。
但是,现在要求,在页面上加上一个下拉框,供用户手动选择一个语言。
本以为这是一个比较简单的需求,没想到做起来还是费了一番周折。
网上也查过,但是抄来抄去的,都差不多。所以还是自己新手做一下比较靠谱。
首先,HTML,就是一个简单的下拉框,里面两种语言,中文和英文
<form id="langForm" method="post"> <span id="langChoose"><s:text name="page.login.item.language" /></span> <select id="lang" name="localeVal"> <option value="1" <s:if test="#session.WW_TRANS_I18N_LOCALE.toString().equalsIgnoreCase('zh_CN')">selected</s:if>><s:text name="page.login.item.language.zh" /></option> <option value="2" <s:if test="#session.WW_TRANS_I18N_LOCALE.toString().equalsIgnoreCase('en_US')">selected</s:if>><s:text name="page.login.item.language.en" /></option> </select> </form>
如果有对“WW_TRANS_I18N_LOCALE”这个字符串不明白的,建议去看下struts2中“com.opensymphony.xwork2.interceptor.I18nInterceptor”这个类的源码,就知道了。
上面的下拉框的change事件:
$("#lang").change(function() { $("#langForm").attr("action", contextPath + "/locale!chgLocale").submit(); });
chgLocale方法如下:
public String chgLocale() { LOG.debug("chgLocale() start."); Locale locale = null; if (localeVal == Const.LOCALE_US) { locale = Locale.US; } else { locale = Locale.SIMPLIFIED_CHINESE; } session.put(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE, locale); LOG.debug("chgLocale() end."); return "jumpToLogin"; }
看到这,可能大家都明白了,就是通过这个action,往session中增加一个键值对,其中:
键为: I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE, 即上面提到的“WW_TRANS_I18N_LOCALE”
值为:Locale.US,代表英文;或者 Locale.SIMPLIFIED_CHINESE, 代表简体中文。
以上即为国际化实现过程。
下面提醒一个问题点,可能大家会遇到:
如果某个jsp页面,是直接被访问的,如:
http://127.0.0.1:8080/test/login.jsp
那么,国际化将失效,它将始终采用浏览器的locale去加载国际化资源。为什么呢?因为这种方式是不会走struts2的拦截器的,具体地说,应该是“com.opensymphony.xwork2.interceptor.I18nInterceptor”这个拦截器。
那么,要怎么来处理这种情况呢?建议就是:所有的页面都通过action来转发。