昨天接到一个新的任务,将之前的一个供货商管理系统进行国际化支持,该系统采用了Status2框架,因此对Struts2的国际化进行了一些研究,下面是关于国际化配置的一些结果,分享给大家参考:
1. 建立资源文件: 建立资源文件如:
message.properties:作为默认资源文件使用,当无法匹配其他资源文件时使用;
message_zh_CN.properties:中文语言资源文件.
因为需求目前仅需要英文语言和中文语言,因此只建立了这两个文件。
2. 配置status2指定资源目录, 在status2的配置文件status.xml中加入配置文件指定资源文件:
为了管理,资源文件都生成在src/i18n/文件夹下,并且将资源文件进行了拆分,所以最终的配置如:
<constant name=”struts.custom.i18n.resources” value=”i18n.globalResource,i18n.messages” />
在Status2的i18n资源文件配置中,如果需要引用多个资源文件,可以在多个文件之间使用英文标点”,”进行分隔。
3. 在jsp或action中引用资源文件中的数据:
在jsp页面中,一般我们可以使用struts的标签来引用资源文件中的数据,如:
<s:text name=”messages.sys001″ />
另外,在引用过程中也可以对参数进行赋值等,如local.pageno=第{0}页,在jsp中使用<s:param>标签引用:
<s:text name=”local.pageno”><s:param>${pageNo}</s:param></s:text>
jsp中还有一些其他的引用方式,在这里不一一说明了,在action中引用,一般使用getText()方法,使用该方法需要action类继承ActionSupport父类,如:
System.out.println(this.getText(“message.sys001″));
到这里的配置基本上在百度上都很容易找到了,笔者也很容易的实现了这些调用,但是这是笔者遇到了一些其他问题:在本地部署好项目后,使用浏览器方法页面,中文信息都是很正常的,但是当笔者修改了浏览器默认语言为英文或俄文后,访问页面依然返回了中文页面。
可能是不会百度吧,google也无法访问,测试了很久,才找到了问题所在:当struts在找不到浏览器指定的语言对应的资源文件的时候,并不是直接使用默认的资源文件,而是会根据项目部署的服务器的默认语言来查找资源文件,直到默认语言的资源文件依然没有找到,才会使用默认的资源文件,笔者的本地环境是中文系统,所以当笔者修改了浏览器的语言为英文的时候,因为这个时候没有en_US的资源文件,struts通过locale的默认语言(可以通过locale.getDefault查看,笔者为zh_CN)来获取相应的资源文件,这个资源文件是存在的,因此自动返回了中文信息。
为了解决这个问题,可以通过设置默认的locale来解决该问题,笔者通过servlet的listener实现了该功能,当然或许还有其他的解决方案~,笔者的代码如下:
package com.zhenpin.supplier.listener; import java.util.Locale; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class DefaultLocaleListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub } public void contextInitialized(ServletContextEvent event) { // 设置默认的localer语言为en_US,用于国际化 Locale.setDefault(Locale.ENGLISH); } }
对于问题分析,可能存在不准确的地方,欢迎大家指正~
另外,该文章转载自我的主站:http://www.smileyb.cn/?p=107,如需转载,请注明出处,谢谢。