SpringMVC配置i18n

i18n是internationalization首字母i和末尾字母n以及中间18个字母的简称,意于国际化

/src/main/resources下新建messages文件夹

  1. 新增以下文件
    1. message.properties用于默认资源
    2. message_zh_CN.properties用于中文资源
    3. message_en_US.properties用于英文资源

spring-config.xml添加配置信息

1
2
3
4
5
6
7
8
9
<!-- 配置i18n资源文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  <!-- 资源文件路径 -->
  <property name="basename" value="classpath:messages/message"/>
  <!-- 默认编码 -->
  <property name="defaultEncoding" value="UTF-8"/>
  <!-- 指定默认资源文件 -->
  <property name="useCodeAsDefaultMessage" value="true"/>
</bean>

spring-mvc.xml添加配置信息

1
2
3
4
5
6
7
8
<!-- 将Locale信息存放于Session中 -->
<!-- id必须是localeResolver,否则会报cannot change HTTP Head ... -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>

<!-- 配置拦截器获取Locale信息 -->
<mvc:interceptors>
  <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>

IndexControler.java中的添加获取Locale信息方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class IndexController {
  
  @Autowired
  private MessageSource messageSource;

  @RequestMapping("")
  public String main(Model model, HttpServletRequest request, HttpServletResponse response) {
    // 设置语言格式
    setLanguage(model, request, response, Locale.getDefault());
    
    return "/index";
  }
  
  @RequestMapping("/{language}")
  public String main(Model model, HttpServletRequest request, HttpServletResponse response, @PathVariable String language) {
    // 分割参数
    String[] languages = language.split("_");
    
    // 设置系统语言
    setLanguage(model, request, response, new Locale(languages[0], languages[1]));
    
    return "/index";
  }
  
  /**
   * 设定语言格式
   */
  private void setLanguage(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) {
    // 获取LocaleResolver
    LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
    
    // 设置Locale信息
    localeResolver.setLocale(request, response, locale);
    
    // 传递正确的Locale信息到页面
    model.addAttribute("encoding", messageSource.getMessage("encoding", new Object[0], locale));
  }
  
}

页面中添加spring的tag用于使用message.properties中的标签信息

1
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>

页面上使用spring标签获取标签信息

1
<spring:message code="title" />

首页提供一个下拉框用于手动切换语言

1
2
3
4
5
6
7
8
<div class="form select-langugae-panel">
  <div class="form-group">
    <select class="select-content select-content-btn">
      <option value="zh_CN" <c:if test="${encoding eq 'zh_CN' }">selected</c:if>>中文</option>
      <option value="en_US" <c:if test="${encoding eq 'en_US' }">selected</c:if>>English</option>
    </select> <i class="select-arrow"></i>
  </div>
</div>