Spring MVC 多语言化的实践和学习

一、主要参考:

SpringMVC简单实现国际化/多语言 - CSDN博客
https://blog.csdn.net/u013360850/article/details/70860144/

二、总结:

实际操作和原文有出入,以自己的实操为主。实操主要内容都可以参考对应的GtHub的提交记录: https://github.com/NullTommy/hello/commit/13cbaa23f61d5a83845c4030e1bfe877d06864b4

  1. 对于项目的整体构建不做过多描述,只说多语言部分;
  2. 配置Spring MVC 相关的多语言配置:
    1. messageSource主要用于配置多语言资源化文件的路径
    2. localeResolver好像是必须的,不然会出错
    3. 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.页面切换多语言:在请求中携带对应的语言字段即可,和拦截器中的配置保持一致。

三、实操中的问题及注意事项:

  1. 多语言文件的路径问题:实际路径是文件路径+文件名前面的公共部分(除后面的语言信息)
  2. useCodeAsDefaultMessage 的配置是当页面无法加载多语言信息时,使用页面上配置的Code。
  3. id="messageSource" 的具体类,原教程中是:ReloadableResourceBundleMessageSource 但我使用有问题,后来改为ResourceBundleMessageSource,问题解决;
  4. interceptors中的配置和请求中的语言字段key需要对应
  5. JSP页面中需要引入spring标签,然后才能在JSP页面中使用多语言的标签,页面才可以自动切换。
  6. 实操中遇到如下报错: 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 ,项目实际中遇到如下问题,做对应记录;

  1. 该Demo是基于请求中的语言信息来实现语言切换,而实际项目中大多是基于Cookie来保存语言信息。所以在后台,需要从Cookie中获取语言信息,同时注意实现获取不到的情况。
    主要实现就是自行继承拦截器,然后拦截器中做自己需要的逻辑处理即可。
  2. 实际项目使用的 FreeMaker ,页面是ftl后缀文件。在FreeMaker中使用多语言的化需要额外的一个配置,即将对应的宏进行配置
    可参考教程: spring+freemarker 国际化i18n - CSDN博客 https://blog.csdn.net/rongku/article/details/12844473
    同时页面使用多语言标签Demo如下:
    <@spring.message "common.problem" />

五、附录:

  1. SpringMVC简单实现国际化/多语言 - CSDN博客
    https://blog.csdn.net/u013360850/article/details/70860144/
    注:本文参考的主要教程,所有一切都始于这篇教程。
  2. SpringMVC 资源国际化实现以及常见问题 - LionheartCGJ - 博客园 https://www.cnblogs.com/LionheartCGJ/p/7819688.html
    注:这也是一个很重要的文件,对于配置中的内容以及使用做了很详细的解释说明。上面的教程只是如何做,这篇是告诉你为什么要这么做,以及这么做有什么用。
  3. 其他不做详细描述了,可参考原文。

猜你喜欢

转载自www.cnblogs.com/buwuliao/p/9258698.html