一般需要**”语言类型“和”国家/地区类型“**,才可以确定一个特定类型的本地化信息。
Locale
NumberFormat
可以对货币金额进行格式化操作
DateFormat
可以对日期进行格式化操作
MessageFormat
在NumberFormat
和DateFormat
对基础上提供了强大的占位符字符串的格式化功能
ResourceBundle
加载本地化资源国际化资源文件的命名规范:<资源名>_<语言代码>_<国家/地区代码>.properties
不同的资源文件,虽然属性值不同,但属性名却是相同的。
.
└── i18n
├── resource_en_US.properties
└── resource_zh_CN.properties
private static void resourceBoundle(){
ResourceBundle rb1 = ResourceBundle.getBundle("i18n/resource", Locale.US);
ResourceBundle rb2 = ResourceBundle.getBundle("i18n/resource", Locale.CHINA);
System.out.println("us: " + rb1.getString("greeting.afternoon"));
System.out.println("cn: " + rb2.getString("greeting.afternoon"));
}
ResourceBoundle+MessageFormat
String pattern1 = "{0}, 您好,{1} {2}";
Object[] params = {"John", new GregorianCalendar().getTime(), 1.0E3};
String format0 = MessageFormat.format(pattern1, params);
String format1 = new MessageFormat(rb1.getString("greeting.welcome"),Locale.US).format(params);
String format2 = new MessageFormat(rb2.getString("greeting.welcome"),Locale.CHINA).format(params);
MessageSource
ResourceBundleMessageSource
<bean id="myResource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>i18n/resourcevalue>
list>
property>
bean>
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MessageSource myResource = context.getBean("myResource", MessageSource.class);
Object[] params = {"John", new GregorianCalendar().getTime(), 1.0E3};
String format1 = myResource.getMessage("greeting.welcome", params, Locale.US);
String format2 = myResource.getMessage("greeting.welcome", params, Locale.CHINA);
System.out.println(format1);
System.out.println(format2);
ReloadableResourceBundleMessageSource
和ResourceBundleMessageSource
唯一的区别是可以定时刷新资源文件,以便在应用程序不重启的情况下感知资源文件的变化。
<bean id="myReloadResource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>i18n/resourcevalue>
list>
property>
<property name="cacheSeconds" value="5"/>
bean>
提示:在测试的时候,一定要确认修改后的i18n
文件保存成功了
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MessageSource myReloadResource = context.getBean("myReloadResource", MessageSource.class);
Object[] params = {"John", new GregorianCalendar().getTime(), 1.0E3};
try {
for (int i = 0; i < 10; i++) {
String format1 = myReloadResource.getMessage("greeting.welcome", params, Locale.US);
String format2 = myReloadResource.getMessage("greeting.welcome", params, Locale.CHINA);
System.out.println(format1);
System.out.println(format2);
// 模拟程序应用, 在次期间,更改资源文件
System.out.println("间隔十秒...");
Thread.currentThread().sleep(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
在MessageSource
的类结构中,发现ApplicationContext
实现了MessageSoruce
的接口。也就是说,ApplicationContext
的实现类本身也是一个MessageSource
对象。
声明容器级别的国际化信息资源:
注册资源Bean,其Bean名称只能为messageSource
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>i18n/resourcevalue>
list>
property>
bean>
如果没有声明messageSource
,通过 下面的代码将会抛出异常:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Object[] params = {"John", new GregorianCalendar().getTime(), 1.0E3};
String format1 = context.getMessage("greeting.welcome", params, Locale.US);
String format2 = context.getMessage("greeting.welcome", params, Locale.CHINA);
System.out.println(format1);
System.out.println(format2);