spring定义了MessageSource接口来实现国际化,它引入了java.util.Locale,并用getMessage方法加载国际化信息。也就是说,spring国际化的原理还是引用了java的那一套,不过把它引入到了spring容器中。
新建文件和xml
文件内容如下:
xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<bean id="myResource1" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>in18/resource</value>
</list>
</property>
</bean>
</beans>
properties:
appName=test
greeting.common=How are you!
greeting.morning = Good morning!
greeting.afternoon =Good Afternoon\!
appName=测试
greeting.common=\u60A8\u597D\uFF01
greeting.morning=\u65E9\u4E0A\u597D\uFF01
greeting.afternoon=\u4E0B\u5348\u597D\uFF01
启动容器后需要执行的代码如下:
String[] configs = {"spring/beans.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(configs);
//步骤1:获取MessageSource实例化对象
MessageSource ms = (MessageSource)ctx.getBean("myResource1");
//步骤2:定义格式化串
Object[] params = {"John", new GregorianCalendar().getTime()};
//步骤3:调用getMessage方法啊
String str1 = ms.getMessage("greeting.common",params,Locale.US);
String str2 = ms.getMessage("greeting.morning",params,Locale.US);
String str3 = ms.getMessage("greeting.afternoon",params,Locale.US);
String str11 = ms.getMessage("greeting.common",params,Locale.CHINA);
String str22 = ms.getMessage("greeting.morning",params,Locale.CHINA);
String str33 = ms.getMessage("greeting.afternoon",params,Locale.CHINA);
System.out.println(str1);
System.out.println(str11);
System.out.println(str2);
System.out.println(str22);
System.out.println(str3);
System.out.println(str33);
总结:
国际化信息又称为本地化信息,由语言类型(如zh)和国家/地区类型来限定(如CN)。
java.util.Locale是创建国际化的基础类。
NumberFormat(对数字转换成特定格式)、DateFormat(对日期输出为特定格式)、MessageFormat(使用占位符)等是操作国际化的工具类。
使用ResourceBundle类处理针对国际化的properties文件(命名规则有限定,如resource_en_US.properties)。
spring管理国际化定义了MessageSource接口。
ResourceBundleMessageSource实现了MessageSource接口。
ReloadableResourceBundleMessageSource实现了MessageSource接口,多了定时更新国际化信息的功能。
ApplicationContext实现了MessageSource接口,把国际化信息上升到了容器级。
生成工具类:
import java.util.Locale;
import org.springframework.context.MessageSource;
public class MessageUtil {
public static String getMessage(String code, String language) {
MessageSource messageSource = (org.springframework.context.MessageSource) SpringContextUtil.getBean("customSource");
if("zh_CN".equalsIgnoreCase(language)) {
return messageSource.getMessage(code, null, Locale.SIMPLIFIED_CHINESE);
}else if(...){
}
}
}
SpringContextUtil:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return SpringContextUtil.applicationContext;
}
public static Object getBean(String name) throws BeansException {
return SpringContextUtil.applicationContext.getBean(name);
}
}