欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

struts2 通过下拉框来手动切换国际化 博客分类: Struts2 struts2i18n国际化手动直接访问jsp 

程序员文章站 2024-03-12 18:26:44
...

之前使用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来转发。