Spring的MVC模式I18N的配置及使用方法
某个加载xml配置文件配置,如bean.xml。
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>messages</value>
</list>
</property>
</bean>
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>messages</value>
</list>
</property>
</bean>
通过上下文可以调用getMessage来实现I18N。(一种直接加载message上下文的方法:ApplicationContext ctx=new FileSystemXmlApplicationContext("bean.xml");)
Object[] arg = new Object[]{};
//以系统默认Locale加载信息(对于中文WinXP而言,默认为zh_CN)
String msg = ctx.getMessage("userinfo", arg, Locale.zh_CN);
System.out.println("Message is ===> "+msg);
//以系统默认Locale加载信息(对于中文WinXP而言,默认为zh_CN)
String msg = ctx.getMessage("userinfo", arg, Locale.zh_CN);
System.out.println("Message is ===> "+msg);
代码中,我们将一个Object数组arg作为参数传递给ApplicationContext.getMessage方法,这个
参数中包含了出现在最终文字信息中的可变内容,ApplicationContext将根据参数中的Locale信息对其进
行处理(如针对不同Locale设定日期输出格式),并用其替换配置文件中的{n}标识(n代表参数数组中的
索引,从1开始)。
注意转码过程中产生的编码问题,一种比较简单的解决办法是通过JDK提供的转码工具native2ascii.exe进行转换。执行:
native2ascii messages_zh_CN.properties msg.txt
再用msg.txt文件替换Messages_zh_CN.properties文件。我们可以看到现在的
Messages_zh_CN.properties变成了如下形式:
userinfo=\u5f53\u524d\u767b\u5f55\u7528\u6237: [{0}]\u767b\u5f55\u65f6\u95f4:[{1}]
(通过在native2ascii命令后追加-reverse参数,可以将文件转回本地格式)
实际开发中,我们可以通过Apache Ant的Native2Ascii任务进行批量转码。如:
<native2ascii encoding="GBK" src="${src}" dest="${build}"/>
getMessage方法还有一个无需Locale参数的版本,JVM会根据当前系统的Locale设定进行相应处
理。可以通过在JVM启动参数中追加“-Duser.language=en”来设定当前JVM语言类型,通过JVM级的
设定,结合国际化支持功能,我们可以较为简单的实现多国语言系统的自动部署切换。
也可以通过资源访问的方式来实现对属性设置的访问。ApplicationContext.getResource方法提供了对资源文件访问支持,如:
Resource rs = ctx.getResource("classpath:config.properties");
File file = rs.getFile();
上例从CLASSPATH根路径中查找config.properties文件并获取其文件句柄。
getResource方法的参数为一个资源访问地址,如:
file:C:/config.properties
/config.properties
classpath:config.properties
注意getResource返回的Resource并不一定实际存在,可以通过Resource.exists()方法对其进行判断。
而在页面处理中,也可以用到i18n的信息串。
jsp中使用i18n的message:
<spring:message code="msg_code"/>
本文转自 dannyy1026 51CTO博客,原文链接:http://blog.51cto.com/dannyyuan/160495