一、國際化在實際代碼中是非常常見的一中方式。為了結合web做一下語言上面的切換,而達到展示的目的。
二、這裡呢,主要是介紹spring中對于國際化做了哪些處理。
三、實作方式
1)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"
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">
<property name="basenames">
<list>
<value>message.test</value>
</list>
</property>
</bean>
</beans>
備注:<!--這裡id必須是messageSource,後續會說為什麼-->
2)語言檔案

寫法:
testtest=\u6d4b\u8bd5{0}
testtest=test{0}
3)應用過程:
ApplicationContext context = new ClassPathXmlApplicationContext("spring-message.xml");
ResourceBundleMessageSource messageSource = context.getBean("messageSource", ResourceBundleMessageSource.class);
String messageZh = messageSource.getMessage("testtest", new Object[]{"資料"}, Locale.CHINESE);
String messageEn = messageSource.getMessage("testtest", new Object[]{"data"}, Locale.ENGLISH);
System.out.println(messageZh);
System.out.println(messageEn);
4)效果
四、當然這裡隻是背景的實作方式,因為是國際化嗎。肯定是和web端密切相關的。傳遞方式
1)request:設定消息頭等。通過攔截請求設定擷取目前語言。然後在後端處理國際化。
2)cookie:這種方式通過請求的方式修改語言。
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieMaxAge" value="1800000"/>
<property name="defaultLocale" value="zh_CN"/>
<property name="cookieName" value="Language"/>
</bean>
3)session:這個方式的好處是在于會話處理。相對于cookie,會話可以根據session的時間而保持。
<bean id="sessionLocaleResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="zh"/>
</bean>
五、spring部分
1)refresh()方法中的this.initMessageSource();
2)實作:
protected voidinitMessageSource() {
//擷取beanfactory
ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
//判斷是否包含messageSource的bean
if (beanFactory.containsLocalBean("messageSource")) {
this.messageSource = (MessageSource)beanFactory.getBean("messageSource", MessageSource.class);
//如果父類存在,設定父類
if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
HierarchicalMessageSource hms = (HierarchicalMessageSource)this.messageSource;
if (hms.getParentMessageSource() == null) {
hms.setParentMessageSource(this.getInternalParentMessageSource());
}
}
if (this.logger.isDebugEnabled()) {
this.logger.debug("Using MessageSource [" + this.messageSource + "]");
}
} else {
//spring預設的國際化使用方式
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(this.getInternalParentMessageSource());
this.messageSource = dms;
beanFactory.registerSingleton("messageSource", this.messageSource);
if (this.logger.isDebugEnabled()) {
this.logger.debug("Unable to locate MessageSource with name 'messageSource': using default [" + this.messageSource + "]");
}
}
}
3)從代碼中可以看出:這裡預設通路的是messageSource,如果配置成其他名稱。在使用的時候會抛類型異常。
六、簡易版國際化實作過程
ResourceBundle resourceBundle = ResourceBundle.getBundle("message.test", Locale.US);
String testest = resourceBundle.getString("testtest");
String format = MessageFormat.format(testest, new Object[]{"data"});
System.out.println(format);