首页 > 代码库 > 国际化总结—关于Struts2

国际化总结—关于Struts2

之前做项目的时候用到了国际化,可能不是最优的方法,但还是总结一下,供自己以后参考!

主要包含struts2的国际化


struts2国际化设置步骤:

1.在struts.xml文件中添加配置:

< constant name ="struts.custom.i18n.resources" value ="message"></constant >

其中,message是国际化文件的主文件名


2.添加国际化文件:

message_en_US.properties;

message_zh_CN.properties作用于全局;

以package(替换message)为文件名,则作用于文件所在的包内;

以具体的Action名为文件名,则作用于该action类


3.获取对应的资源:

普通类中获取: 

java.util.ResourceBundle rb = java.util.ResourceBundle.getBundle("anyname", locale);
rb.getString("k1");//获取对应的key信息

在Action中获取:

 getText("username.invalid") 

页面中获取: 

<s:text name="hello"></s:text>
<message key="username.xml.invalid"></message>  
<s:textfield name="username" key="username.name"></s:textfield>   
<s:i18n name="temp"></s:i18n>

普通页面(非Struts2返回的页面)中获取(用到了jstl):

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix ="fmt"%>
<fmt:setBundle basename= "message" var ="msg"/>
<fmt:message key ="pageerror.info" bundle ="${msg} "></fmt:message >


4.添加手动变更语言:

首先在页面上添加按钮,切换中英文

然后添加js,响应点击事件:

      $(".i18n_english").click( function() {
              $.ajax({
                     type: "POST",
                     url: "i18n_ajax",
                     data:{flag: "english"},
                     dataType: "json",
                     async: true,
                     success: function(json){
                           window.location.reload();
                     },
                     error: function(json){
                           alert( "ERROR!!!..." );
           }
              });
       });
      $( ".i18n_chinese").click(function () {
              $.ajax({
                     type: "POST",
                     url: "i18n_ajax",
                     data:{flag: "chinese"},
                     dataType: "json",
                     async: false,
                     success: function(json){
                           window.location.reload();
                     },
                     error: function(json){
                           alert( "ERROR!!!" );
           }
              });
       });

再添加Action响应js:      

public String transform(){
        Locale locale = (Locale) ActionContext.getContext().getSession().get("WW_TRANS_I18N_LOCALE");
        if(null==this.flag) {
            locale = Locale.US;
        } else if("chinese".equals(this.flag)) {
            locale = Locale.CHINA;//Locale.SIMPLIFIED_CHINESE
        } else if("english".equals(this.flag)){
            locale = Locale.US;
        }
        //很重要,添加这个是设置Action的国际化信息,如果不添加,需要点击两次页面上的按钮才能正常转换
        ActionContext.getContext().getSession().put("WW_TRANS_I18N_LOCALE", locale); 
        return SUCCESS ;       
}
在struts.xml中作相关配置:
<action name="i18n_ajax" class="I18nAction" method="transform">
   <result type="json">
        <param name="includeProperties">
           flag
        </param>
   </result>
</action>

还需要写一个过滤器,在响应访问时,设置Locale信息为当前保存的信息

public class I18nFilter implements Filter {
    @Override
    public void destroy() {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        
        //Locale locale = MyLocale.getMylocale();
        Locale locale = (Locale)((HttpServletRequest)request).getSession().getAttribute("WW_TRANS_I18N_LOCALE");
        if(locale!=null){
            ((HttpServletRequest)request).getSession().setAttribute("WW_TRANS_I18N_LOCALE", locale);
        }else{
            ((HttpServletRequest)request).getSession().setAttribute("WW_TRANS_I18N_LOCALE", Locale.US);
        }
        chain.doFilter(request, response);
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}

同时不要忘记在web.xml中配置这个过滤器:        

         <!-- i18n filter -->
        <filter>
               <filter-name> i18n</ filter-name>
               <filter-class> com.proton.filter.I18nFilter</filter-class >
        </filter>
        <filter-mapping>
               <filter-name> i18n</ filter-name>
               <url-pattern> /*</ url-pattern>
        </filter-mapping>
OK 基本搞定~!


本文出自 “Demon7c技术博客” 博客,请务必保留此出处http://zhanghongchao.blog.51cto.com/3777224/1566023

国际化总结—关于Struts2