Spring MVC – 国际化 (i18n) 和本地化 (L10n)

Spring MVC 是一个模型-视图-控制器 (MVC) 框架,用于用 Java 构建 Web 应用程序。 Spring MVC 模式包含三个部分:

  • 模型: 模型包含需要在视图上显示的数据。一个简单的 POJO 类可以被视为一个模型。
  • 视图:视图用于呈现 UI 操作。
  • 控制器: 控制器接受用户请求并将其传递给视图进行渲染。

先决条件

  • Java 开发工具包 (JDK) 11 或更高版本
  • Spring Boot 2.7.7 或更高版本
  • 您选择的 IDE(例如 Eclipse、IntelliJ IDEA、STS(Spring Tool Suite))

Spring MVC 国际化 (i18n)
国际化是开发软件的过程,以便无需更改任何代码即可轻松适应不同的语言和地区。
Spring MVC i18n 的核心组件:

  • LocaleResolver: LocaleResolver 是一个定义解析当前语言环境策略的接口。它确定 HTTP 请求中要使用的区域设置。
  • MessageSource: MessageSource 是 Spring 中的一个接口,它提供了一种解析特定区域设置消息的方法。它支持属性、XML 和 YAML 格式。
  • ViewResolvers:ViewResolvers 确定如何根据当前区域设置渲染视图。 ContentNegotiatingViewResolver 解析区域设置的最佳匹配视图
  • LocaleChangeInterceptor:LocaleChangeInterceptor 提供了动态区域设置切换的机制。它拦截区域设置更改请求并通过 LocaleResolver 更新请求/会话中的区域设置。
  • 资源包:名为 messages_xx.properties 的属性文件,其中包含每个区域设置的本地化文本值。


使用 Spring MVC 进行本地化 (L10n)
Spring MVC 应用程序必须本地化才能在多种语言和地区运行。这允许构建可以为全球用户无缝本地化的应用程序,而无需更改代码。
Spring MVC L10n 的核心组件:

  • LocaleResolver: LocaleResolver 是一个确定用户区域设置的接口,它代表用户的语言和国家或地区。确定请求中要使用的区域设置。
  • LocaleContext:使当前区域设置在控制器和模型中可用。通常使用LocaleContextHolder。
  • MessageSource: MessageSource 是一个接口,它提供了一种根据当前区域设置解析来自资源包的消息的方法。
  • ViewResolvers: ViewResolvers 确定如何根据当前区域设置呈现视图。 ContentNegotiatingViewResolver 解析区域设置的最佳匹配视图。
  • LocaleChangeInterceptor: LocaleChangeInterceptor 是一个拦截器,允许根据请求参数或属性更改区域设置。
  • 资源包:资源包是包含特定于区域设置的键值对的文件,其中键代表消息代码< a i=3>值代表翻译的消息

国际化和本地化示例
创建消息控制器:MessageController.Java

package com.demo.controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.GetMapping; 

import com.demo.model.Message; 

@Controller
public class MessageController { 

    @GetMapping("/message"
    public String message(Model model) { 
        Message message = new Message(
"data.message"); 
        model.addAttribute(
"message", message); 
        return
"message"
    } 
}


创建消息模型:Message.java

package com.demo.model; 
public class Message { 

    private String key; 

    public Message(String key) 
    { 
    this.key = key; 
    } 

    public String getKey() 
    { 
    return key; 
    } 
}


创建视图:message.html

  • 此文件位于src/main/resources/templates,包含一条消息。

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org"
<head> 
    <meta charset=
"UTF-8"/> 
    <title>jdon.com</title> 
</head> 
<body></body> 
</html>

配置国际化:WebConfig.java

package com.demo.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.support.ResourceBundleMessageSource; 
import org.springframework.web.servlet.LocaleResolver; 
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 
import org.springframework.web.servlet.i18n.CookieLocaleResolver; 
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; 

@Configuration
public class WebConfig implements WebMvcConfigurer { 

    @Bean public LocaleResolver localeResolver() 
    { 
        return new CookieLocaleResolver(); 
    } 

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() 
    { 
        LocaleChangeInterceptor localeChangeInterceptor 
            = new LocaleChangeInterceptor(); 
        localeChangeInterceptor.setParamName("lang"); 
        return localeChangeInterceptor; 
    } 

    @Bean public ResourceBundleMessageSource messageSource() 
    { 
        ResourceBundleMessageSource messageSource 
            = new ResourceBundleMessageSource(); 
        messageSource.setBasename(
"messages/messages"); 
        messageSource.setDefaultEncoding(
"UTF-8"); 
        return messageSource; 
    } 

    @Override
    public void
    addInterceptors(InterceptorRegistry registry) 
    { 
        registry.addInterceptor(localeChangeInterceptor()); 
    } 
}

消息属性

  • 这些属性文件位于 src/main/resources/messages,包含不同语言的本地化消息。

 
  1. messages.properties:data.message=Hello and goodbye!
  2. messages_fr.properties:data.message=Bonjour et au revoir!

运行应用程序
您可以通过集成开发环境或使用 Spring Boot 提供的命令行工具运行 Spring Boot 应用程序。
mvn spring-boot:run

测试:

  • 打开浏览器,进入 http://localhost:8080/message。您应该会看到英文版的默认信息。
  • 您可以在 URL 上添加 ?lang=fr 或 ?lang=en 来切换语言。