原文: https://howtodoinjava.com/spring-mvc/spring-mvc-internationalization-i18n-and-localization-i10n-example/

国际化是设计软件应用程序的过程,这样它可以潜在地适应各种语言和地区而无需进行工程更改。 本地化是通过添加特定于语言环境的组件并翻原文本来使国际化软件适应特定区域或语言的过程(Wiki)。 Spring 框架随LocaleResolver一起提供,以支持国际化和本地化。 本教程将帮助您学习如何在基于 Spring MVC 的 Web 应用程序中添加国际化支持。

  1. 目录
  2. 1)添加特定于语言环境的消息资源
  3. 2)在 Spring 上下文中添加 LocaleResolver 配置
  4. 3)更改 JSP 以显示特定于语言环境的消息
  5. 4)项目结构
  6. 5)测试应用程序
  7. 6)其他项目文件

让我们开始分析为在 Spring Web 应用程序中添加 i18n 支持而需要进行的更改。

1)添加特定于语言环境的消息资源

如果要支持多个语言环境,那么第一步显然就是让每个特定于语言环境的属性文件都具有该语言环境特定语言的文本。 在我们的示例中,我支持两种语言环境。 第一个是使用英语的美国语言,第二个是中文。

messages.properties

  1. lbl.Id=Employee Id
  2. lbl.firstName=First Name
  3. lbl.lastName=First Name
  4. lbl.page=All Employees in System

messages_zh_CN.properties

  1. lbl.Id=\u5458\u5DE5ID
  2. lbl.firstName=\u540D\u5B57
  3. lbl.lastName=\u59D3
  4. lbl.page=\u7CFB\u7EDF\u4E2D\u7684\u6240\u6709\u5458\u5DE5

请注意这些属性文件的命名约定。 特定于语言环境的文件的名称后附加了语言环境短代码。

2)在 Spring 上下文中添加LocaleResolver配置

为了使 Spring MVC 应用程序支持国际化,您将需要注册两个 bean。

1. SessionLocaleResolver

SessionLocaleResolver 通过检查用户会话中的预定义属性来解析语言环境。 如果会话属性不存在,则此语言环境解析器将从accept-language HTTP 标头中确定默认语言环境。

  1. <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
  2. <property name="defaultLocale" value="en" />
  3. </bean>

2. LocaleChangeInterceptor

LocaleChangeInterceptor监听器检测当前 HTTP 请求中是否存在特殊参数。 可以使用此拦截器的paramName属性自定义参数名称。 如果当前请求中存在此类参数,则此拦截器会根据参数值更改用户的语言环境。

  1. <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
  2. <property name="paramName" value="lang" />
  3. </bean>
  4. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  5. <property name="interceptors">
  6. <list>
  7. <ref bean="localeChangeInterceptor" />
  8. </list>
  9. </property>
  10. </bean>

该应用程序的完整应用程序上下文文件如下所示:

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  6. http://www.springframework.org/schema/context/
  7. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  8. <context:component-scan base-package="com.howtodoinjava.demo" />
  9. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
  10. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  11. <property name="prefix" value="/WEB-INF/views/" />
  12. <property name="suffix" value=".jsp" />
  13. </bean>
  14. <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  15. <property name="basename" value="messages" />
  16. </bean>
  17. <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
  18. <property name="defaultLocale" value="en" />
  19. </bean>
  20. <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
  21. <property name="paramName" value="lang" />
  22. </bean>
  23. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  24. <property name="interceptors">
  25. <list>
  26. <ref bean="localeChangeInterceptor" />
  27. </list>
  28. </property>
  29. </bean>
  30. </beans>

3)更改 JSP 以显示特定于语言环境的消息

下一步是进行视图更改,以支持显示特定于区域设置的文本消息。 可以通过以下方式使用 Spring TLD 来完成此操作。

  1. <%@ page contentType="text/html;charset=UTF-8" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  3. <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
  4. <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
  5. <html>
  6. <head>
  7. <title>Spring MVC Hello World</title>
  8. </head>
  9. <body>
  10. <h2><spring:message code="lbl.page" text="All Employees in System" /></h2>
  11. <table border="1">
  12. <tr>
  13. <th><spring:message code="lbl.Id" text="Employee Id" /></th>
  14. <th><spring:message code="lbl.firstName" text="First Name" /></th>
  15. <th><spring:message code="lbl.lastName" text="Last Name" /></th>
  16. </tr>
  17. <c:forEach items="${employees}" var="employee">
  18. <tr>
  19. <td>${employee.id}</td>
  20. <td>${employee.firstName}</td>
  21. <td>${employee.lastName}</td>
  22. </tr>
  23. </c:forEach>
  24. </table>
  25. </body>
  26. </html>

4)项目结构

此应用程序的完整结构是这样的:

Spring MVC 国际化(i18n)和本地化(i10n)示例 - 图1

Spring i18n 项目结构和文件

5)测试应用程序

点击网址:http://localhost:8080/springmvcexample/employee-module/getAllEmployees

如您所见,所有标签均以英语显示。

Spring MVC 国际化(i18n)和本地化(i10n)示例 - 图2

Spring i18n – En 语言环境

点击网址:http://localhost:8080/springmvcexample/employee-module/getAllEmployees?lang=zh_CN

现在,语言环境已更改为中文,并且所有标签都以中文显示。

Spring MVC 国际化(i18n)和本地化(i10n)示例 - 图3

Spring i18n – CN 语言环境

6)其他项目文件

让我们列出该应用程序涉及的其他文件。

web.xml

  1. <web-app id="WebApp_ID" version="2.4"
  2. xmlns="http://java.sun.com/xml/ns/j2ee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  5. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  6. <display-name>Spring Web MVC Hello World Application</display-name>
  7. <servlet>
  8. <servlet-name>spring</servlet-name>
  9. <servlet-class>
  10. org.springframework.web.servlet.DispatcherServlet
  11. </servlet-class>
  12. <load-on-startup>1</load-on-startup>
  13. </servlet>
  14. <servlet-mapping>
  15. <servlet-name>spring</servlet-name>
  16. <url-pattern>/</url-pattern>
  17. </servlet-mapping>
  18. </web-app>

EmployeeController.java

  1. package com.howtodoinjava.demo.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import com.howtodoinjava.demo.service.EmployeeManager;
  8. @Controller
  9. @RequestMapping("/employee-module")
  10. public class EmployeeController
  11. {
  12. @Autowired
  13. EmployeeManager manager;
  14. @RequestMapping(value="/getAllEmployees", method = RequestMethod.GET)
  15. public String welcome(Model model)
  16. {
  17. model.addAttribute("employees",manager.getAllEmployees());
  18. return "employeesListDisplay";
  19. }
  20. }

EmployeeDAO.java

  1. package com.howtodoinjava.demo.dao;
  2. import java.util.List;
  3. import com.howtodoinjava.demo.model.EmployeeVO;
  4. public interface EmployeeDAO
  5. {
  6. public List<EmployeeVO> getAllEmployees();
  7. }

EmployeeDAOImpl.java

  1. package com.howtodoinjava.demo.dao;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.springframework.stereotype.Repository;
  5. import com.howtodoinjava.demo.model.EmployeeVO;
  6. @Repository
  7. public class EmployeeDAOImpl implements EmployeeDAO {
  8. public List<EmployeeVO> getAllEmployees()
  9. {
  10. List<EmployeeVO> employees = new ArrayList<EmployeeVO>();
  11. EmployeeVO vo1 = new EmployeeVO();
  12. vo1.setId(1);
  13. vo1.setFirstName("Lokesh");
  14. vo1.setLastName("Gupta");
  15. employees.add(vo1);
  16. EmployeeVO vo2 = new EmployeeVO();
  17. vo2.setId(2);
  18. vo2.setFirstName("Raj");
  19. vo2.setLastName("Kishore");
  20. employees.add(vo2);
  21. return employees;
  22. }
  23. }

EmployeeManager.java

  1. import java.util.List;
  2. import com.howtodoinjava.demo.model.EmployeeVO;
  3. public interface EmployeeManager
  4. {
  5. public List<EmployeeVO> getAllEmployees();
  6. }

EmployeeManagerImpl.java

  1. import java.util.List;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Service;
  4. import com.howtodoinjava.demo.dao.EmployeeDAO;
  5. import com.howtodoinjava.demo.model.EmployeeVO;
  6. @Service
  7. public class EmployeeManagerImpl implements EmployeeManager {
  8. @Autowired
  9. EmployeeDAO dao;
  10. public List<EmployeeVO> getAllEmployees()
  11. {
  12. return dao.getAllEmployees();
  13. }
  14. }

EmployeeVO.java

  1. package com.howtodoinjava.demo.model;
  2. import java.io.Serializable;
  3. public class EmployeeVO implements Serializable
  4. {
  5. private static final long serialVersionUID = 1L;
  6. private Integer id;
  7. private String firstName;
  8. private String lastName;
  9. public Integer getId() {
  10. return id;
  11. }
  12. public void setId(Integer id) {
  13. this.id = id;
  14. }
  15. public String getFirstName() {
  16. return firstName;
  17. }
  18. public void setFirstName(String firstName) {
  19. this.firstName = firstName;
  20. }
  21. public String getLastName() {
  22. return lastName;
  23. }
  24. public void setLastName(String lastName) {
  25. this.lastName = lastName;
  26. }
  27. @Override
  28. public String toString() {
  29. return "EmployeeVO [id=" + id + ", firstName=" + firstName
  30. + ", lastName=" + lastName + "]";
  31. }
  32. }

请让我知道是否有任何疑问或想法。

祝您学习愉快!