struts2 通过下拉框来手动切换国际化

之前使用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方法如下:

扫描二维码关注公众号,回复: 799906 查看本文章
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来转发。

猜你喜欢

转载自rainbow702.iteye.com/blog/2226804