最近 js中需要用国际化的方式,但是在单独的js中使用struts国际化标签有问题,于是找到一种认为还不错的处理方式:就是定义多个国际化js文件。 [color=red]注: 多个js文件中里面只需要定义js中需要的国际化的字符。其余在页面中需要国际化的,还是照样在properties文件中,使用struts2的国际化标签获取就可以[/color]
1.在拦截器里获取当前的语言,并保存至session中, //语言 String request_locale = request.getParameter("request_locale"); logger.debug("---------request_locale:"+request_locale); Locale locale = (Locale) request.getSession().getAttribute("i18_local"); if(null !=request_locale) { if(request_locale.equalsIgnoreCase("en_US")) { locale = Locale.US; } else if(request_locale.equalsIgnoreCase("zh_TW")) { locale = Locale.TAIWAN; } else { locale = Locale.CHINA; } } if(locale==null) { locale = Locale.CHINA; } request.getSession().setAttribute("i18_local", locale.toString()); request.getSession().setAttribute("timeStampForJS", System.currentTimeMillis()); ai.getInvocationContext().setLocale(locale);
2.页面中根据获取当前的语言获取所引用的js文件,防止缓存加上时间戳 <s:if test='#session.i18_local == "en_US"'> <script src="/lang/lang_en_US.js?<s:property value='#session.timeStampForJS'/>" type="text/javascript"></script> </s:if> <s:elseif test='#session.i18_local == "zh_TW"'> <script src="/lang/lang_zh_TW.js?<s:property value='#session.timeStampForJS'/>" type="text/javascript"></script> </s:elseif> <s:else> <script src="/lang/lang_zh_CN.js?<s:property value='#session.timeStampForJS'/>" type="text/javascript"></script> </s:else>
3.建立3个国际化的js文件 lang_en_US.js: var js_edittag = "Edit tag"; lang_zh_CN.js: var js_edittag = "编辑标签"; lang_zh_TW.js: var js_edittag = "編輯標籤";
在js中直接使用js_edittag 这个全局变量就可以了。