之前做项目的时候用到了国际化,可能不是最优的方法,但还是总结一下,供自己以后参考!
主要包含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
原文地址:http://zhanghongchao.blog.51cto.com/3777224/1566023