spring对国际化的支持,需要3步:
1. 配置bean,增加spring对国际化的支持 ReloadableResourceBundleMessageSource
2. 资源文件 messages_zh_CN.properties
3. 使用国际化 <s:message code=”hello”/> context.getMessage(“hello”);
spring-service.xml,之前在spring-web.xml,导致获取不到bean
<bean id=”messageSource”
class=”org.springframework.context.support.ReloadableResourceBundleMessageSource”>
<property name=”basenames”>
<list>
<value>classpath:/messages</value>
</list>
</property>
<property name=”defaultEncoding” value=”UTF-8″ />
<property name=”useCodeAsDefaultMessage” value=”true”></property>
</bean>
<bean id=”localeResolver” class=”org.springframework.web.servlet.i18n.SessionLocaleResolver”>
<property name=”defaultLocale” value=”zh_CN”></property>
</bean>
spring-web.xml 语言切换的时候拦截
<mvc:interceptors>
<bean id=”localeChangeInterceptor”
class=”org.springframework.web.servlet.i18n.LocaleChangeInterceptor”>
<property name=”paramName” value=”lang” />
</bean>
</mvc:interceptors>
资源文件在resources目录下,直接在classpath下
使用:jsp:标签使用,java:上下文.getMessage()
错误分析:
1. 加载资源文件的时候,会去判断beanFactory中有没有包含bean id=”messageSource”的bean,这也是为什么ReloadableResourceBundleMessageSource类的bean的id一定要为“messageSource”。这个时候可以通过beanFactory.getBeanDefinition(“messageSource”),如果没有包含,则不走if语句,spring就没有加载资源文件,那么当你在使用<s:message code=”hello”/>
将会报错:No message found under code ‘title’ for locale ‘zh_CN’, 换句话说此错误是没有加载到bean messageSource。
2. 语言切换无效。通过地址栏http://localhost:8080/page/index.jsp?lang=en
地址栏请求是*.jsp,参照tomcat home/conf/web.xml截图
所有的*.jsp 会被tomcat容器拦截,根据servlet匹配原则,就不会走DispatcherServlet,就不会走拦截器LocaleChangeInterceptor,所以设置语言无效。
方案:
现在将切换语言的功能通过访问controller
http://localhost:8080/page/index?lang=en
让拦截LocaleChangeInterceptor去设置语言