一、主要参考:
SpringMVC简单实现国际化/多语言 - CSDN博客
https://blog.csdn.net/u013360850/article/details/70860144/
二、总结:
实际操作和原文有出入,以自己的实操为主。实操主要内容都可以参考对应的GtHub的提交记录: https://github.com/NullTommy/hello/commit/13cbaa23f61d5a83845c4030e1bfe877d06864b4
- 对于项目的整体构建不做过多描述,只说多语言部分;
- 配置Spring MVC 相关的多语言配置:
- messageSource主要用于配置多语言资源化文件的路径
- localeResolver好像是必须的,不然会出错
- interceptors,拦截器,用于拦截请求中的语言相关信息,
<!-- 配置国际化资源文件路径 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n/messages" />
<property name="useCodeAsDefaultMessage" value="true"/>
</bean>
<!-- 本地化资源处理器 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
</bean>
<!-- 国际化拦截器 -->
<mvc:interceptors>
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
</mvc:interceptors>
3.项目中构建多语言相关文件,并保存不同语言的信息;
4.页面中使用多语言,页面中的文字部分,全部使用多语言文件中的资源代码 key,而不是写死。
5.页面切换多语言:在请求中携带对应的语言字段即可,和拦截器中的配置保持一致。
三、实操中的问题及注意事项:
- 多语言文件的路径问题:实际路径是文件路径+文件名前面的公共部分(除后面的语言信息)
- useCodeAsDefaultMessage 的配置是当页面无法加载多语言信息时,使用页面上配置的Code。
- id="messageSource" 的具体类,原教程中是:ReloadableResourceBundleMessageSource 但我使用有问题,后来改为ResourceBundleMessageSource,问题解决;
- interceptors中的配置和请求中的语言字段key需要对应
- JSP页面中需要引入spring标签,然后才能在JSP页面中使用多语言的标签,页面才可以自动切换。
- 实操中遇到如下报错:
Cannot change HTTP accept header - use a different locale resolution strategy
主要原因是多语言化配置的beanId名称有问题,具体解决可以参考如下两文:
6.1 java - Cannot change HTTP accept header - use a different locale resolution strategy - Stack Overflow https://stackoverflow.com/questions/23766446/cannot-change-http-accept-header-use-a-different-locale-resolution-strategy
6.2 Spring 的MVC I18N-国际化相关配置出现的问题 - CSDN博客 https://blog.csdn.net/shenzhen_mydream/article/details/2514405
四、扩展:
Cannot change HTTP accept header - use a different locale resolution strategy
主要原因是多语言化配置的beanId名称有问题,具体解决可以参考如下两文:
6.1 java - Cannot change HTTP accept header - use a different locale resolution strategy - Stack Overflow https://stackoverflow.com/questions/23766446/cannot-change-http-accept-header-use-a-different-locale-resolution-strategy
6.2 Spring 的MVC I18N-国际化相关配置出现的问题 - CSDN博客 https://blog.csdn.net/shenzhen_mydream/article/details/2514405
自行测试的原因是因为项目中需要多语言化,这只是一个小 Demo ,项目实际中遇到如下问题,做对应记录;
- 该Demo是基于请求中的语言信息来实现语言切换,而实际项目中大多是基于Cookie来保存语言信息。所以在后台,需要从Cookie中获取语言信息,同时注意实现获取不到的情况。
主要实现就是自行继承拦截器,然后拦截器中做自己需要的逻辑处理即可。 - 实际项目使用的 FreeMaker ,页面是ftl后缀文件。在FreeMaker中使用多语言的化需要额外的一个配置,即将对应的宏进行配置
可参考教程: spring+freemarker 国际化i18n - CSDN博客 https://blog.csdn.net/rongku/article/details/12844473
同时页面使用多语言标签Demo如下:
<@spring.message "common.problem" />
五、附录:
- SpringMVC简单实现国际化/多语言 - CSDN博客
https://blog.csdn.net/u013360850/article/details/70860144/
注:本文参考的主要教程,所有一切都始于这篇教程。
- SpringMVC 资源国际化实现以及常见问题 - LionheartCGJ - 博客园 https://www.cnblogs.com/LionheartCGJ/p/7819688.html
注:这也是一个很重要的文件,对于配置中的内容以及使用做了很详细的解释说明。上面的教程只是如何做,这篇是告诉你为什么要这么做,以及这么做有什么用。
- 其他不做详细描述了,可参考原文。
- SpringMVC简单实现国际化/多语言 - CSDN博客
https://blog.csdn.net/u013360850/article/details/70860144/
注:本文参考的主要教程,所有一切都始于这篇教程。 - SpringMVC 资源国际化实现以及常见问题 - LionheartCGJ - 博客园 https://www.cnblogs.com/LionheartCGJ/p/7819688.html
注:这也是一个很重要的文件,对于配置中的内容以及使用做了很详细的解释说明。上面的教程只是如何做,这篇是告诉你为什么要这么做,以及这么做有什么用。 - 其他不做详细描述了,可参考原文。