7.4.3 ApplicationContext的国际化支持

7.4.3 ApplicationContext的国际化支持

ApplicationContext接口继承了MessageSource接口,因此具有国际化功能。

MessageSource接口中用于国际化的方法

下面是MessageSource接口中定义的两个用于国际化的方法。

  • String getMessage(String code,Object[] args, Locale locale)
  • String getMessage(String code,Object[] args,String default,Locale locale)

ApplicationContext正是通过这两个方法来完成国际化的,当程序创建ApplicationContext容器时Spring自动查找配置文件中名为messageSourceBean实例,

  • 一旦找到这个Bean实例,上述两个方法的调用就被委托给该messageSource Bean
  • 如果没有该Bean,ApplicationContex会查找其父容器中的messageSource Bean;如果找到,它将被作为messageSource Bean使用。
  • 如果无法找到messageSource Bean,系统将会创建一个空的StaticMessageSourceBean,该Bean能接受上述两个方法的调用。

Spring中配置messageSource bean时通常使用ResourceBundleMessageSource类。

程序示例

项目结构

1
2
3
4
5
6
7
E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\I18N
└─src\
├─beans.xml
├─lee\
│ └─SpringTest.java
├─message_en_US.properties
└─message_zh_CN.properties

beans.xml

看下面的配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 驱动Spring调用messageSource Bean的setBasenames()方法, 该方法需要一个数组参数,使用list元素配置多个数组元素 -->
<property name="basenames">
<list>
<value>message</value>
<!-- 如果有多个资源文件,全部列在此处 -->
</list>
</property>
<!-- 设置国际化文件编码 -->
<property name="defaultEncoding" value="UTF-8" />
</bean>
</beans>

上面文件的粗体字代码定义了一个idmessageSourceBean,该Bean实例只指定了一份国际化资源文件,其baseNamemessage.
然后给出如下两份资源文件。

message_en_US.properties

第一份为美式英语的资源文件:

1
2
hello=welcome,{0}
now=now is :{0}

message_zh_CN.properties

第二份为简体中文的资源文件:

1
2
hello=欢迎你,{0}
now=现在时间是:{0}

由于Java9支持使用UTF-8字符集保存国际化资源文件,这种国际化资源文件可以包含非西欧字符,因此只要将这份文件以UTF-8字符集保存即可。此时,程序拥有了两份资源文件,可以自适应美式英语和简体中文的环境。主程序部分如下。

SpringTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package lee;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.*;

public class SpringTest
{
public static void main(String[] args) throws Exception
{
// 实例化ApplicationContext
@SuppressWarnings("resource")
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"beans.xml");
// 使用getMessage()方法获取本地化消息。
// Locale的getDefault方法返回计算机环境的默认Locale
String hello = ctx.getMessage("hello", new String[]{"孙悟空"},
Locale.getDefault(Locale.Category.FORMAT));
String now = ctx.getMessage("now", new Object[]{new Date()},
Locale.getDefault(Locale.Category.FORMAT));
// 打印出两条本地化消息
System.out.println(hello);
System.out.println(now);
}
}

上面的两行粗体字代码是Spring容器提供的获取国际化消息的方法,这两个方法由MessageSource接口提供。
上面程序的执行结果会随环境不同而改变,在简体中文的环境下,执行结果如下:

1
2
欢迎你,孙悟空
现在时间是:19-8-25 下午11:29

注意
Spring的国际化支持,其实是建立在Java程序国际化的基础之上的。其核心思路都是将程序中需要实现国际化的信息写入资源文件,而代码中仅仅使用相应的各信息的Key