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方法如下:

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来转发。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值