項目國際化實踐

  1. 在struts.properties裏面添加配置
    struts.custom.i18n.resources=Resources
    Resources 可以自己定義

  2. 新建資源文件
    在sirmapp/src/下新建文件
    Resources_en_US.properties
    Resources_zh_CN.properties
    文件開頭Resources 對應第一步struts.custom.i18n.resources的屬性

  3. 增加中英文切換功能

3.1 增加實現中英文切換的action

package com.xxx.framework.web.action;

import com.opensymphony.xwork2.ActionContext;
import com.xxx.common.web.RequestContext;
import com.xxx.common.web.XxxAction;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;

import java.util.Locale;

public class LanguageAction extends XxxAction {

    private String language;

    public void setLanguage(String language) {
        this.language = language;
    }

    public String changeToChinese() {
        Locale locale=new Locale("zh","CN");//(這個能根據你傳來的值動態改變)
        ActionContext.getContext().setLocale(locale);
        this.request.getSession().setAttribute("WW_TRANS_I18N_LOCALE", locale);
        return "success";
    }
    public String changeToEnglish() {
        Locale locale=new Locale("en","US");//(這個能根據你傳來的值動態改變)
        ActionContext.getContext().setLocale(locale);
        this.request.getSession().setAttribute("WW_TRANS_I18N_LOCALE", locale);
        return "success";
    }
}

3.2 在struts-XXX.xml

/first.jsp


/first.jsp

在first.jsp 中添加中英文切換鏈接

<b class="split">|</b>
<a href="${contextPath}/chinese.action?request_locale=zh_CN"><s:text name="chinese" /></a>
<a href="${contextPath}/english.action?request_locale=en_US"><s:text name="english" /></a>
  1. 添加過濾器。
    由於程序始終是隻會讀取瀏覽器發送過來的區域信息,其他頁面沒有獲取session的WW_TRANS_I18N_LOCALE值。因此要通過過濾器從session裏獲得區域對象,並修改請求報頭,從而實現了自定義國際化切換。
    增加I18nFilter.java, I18nRequestWrapper.java,代碼來自於網絡
package com.xxx.common.web;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class I18nFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
                         FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest r = (HttpServletRequest) req;
        I18nRequestWrapper request = new I18nRequestWrapper(r);
        filterChain.doFilter(request, resp);
    }
}


package com.xxx.common.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;
import java.util.Locale;

public class I18nRequestWrapper extends HttpServletRequestWrapper {

    private Locale locale = null;

    public I18nRequestWrapper(HttpServletRequest request) {
        super(request);
        HttpSession session = request.getSession();
        locale = (Locale) session.getAttribute("WW_TRANS_I18N_LOCALE");
    }
/**
 * struts2的BUG,如果重定向的話,國際化默認取HTTP請求頭中的參數 替換HTTP請求參數
 **/
    @Override
    public String getHeader(String name) {
        String value = super.getHeader(name);
        if ("Accept-Language".equals(name) && locale != null) {
            value = locale.getLanguage() + "_" + locale.getCountry()
                    + value.substring(6, value.length());
        }
        return value;
    }

    @Override
    public Locale getLocale() {
        if (locale != null) {
            return locale;
        }
        return super.getLocale();
    }

}
  1. 過濾器配置
在web.xml中
<!-- 國際化-->
<filter>
    <filter-name>i18nFilter</filter-name>
    <filter-class>com.xxx.common.web.I18nFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>i18nFilter</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>
  1. 在head.jsp 中添加
    <%@ taglib prefix=”s” uri=”/struts-tags” %>
    這樣就可以通過訪問國際化資源啦。

過濾器實現代碼來源於
http://showtime520.iteye.com/blog/1042585

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章