最近 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 这个全局变量就可以了。