spring源码-国际化-3.5
一、国际化在实际代码中是非常常见的一中方式。为了结合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);