项目国际化实践

  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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值