目录
国际化支持机制概述
1. 资源束(Resource Bundle)
2. MessageSource
3. LocaleResolver
4. LocaleChangeInterceptor
场景示例
1. 创建资源束文件
2. 配置 MessageSource
3. 配置 LocaleResolver
4. 配置 LocaleChangeInterceptor
5. 创建控制器和视图
解释
Spring MVC 的国际化支持主要基于以下几个核心组件和概念:
资源束是一组包含本地化信息的属性文件,文件名遵循特定的命名规则,格式为 basename_locale.properties
。其中,basename
是资源束的基本名称,locale
是语言和地区代码,例如 messages_en_US.properties
表示美国英语的资源文件,messages_zh_CN.properties
表示中国中文的资源文件。如果没有指定 locale
,则使用默认的资源文件,如 messages.properties
。
MessageSource
MessageSource
是 Spring 框架中用于管理和解析资源束的接口。它可以根据指定的 locale
从相应的资源束中获取本地化消息。Spring 提供了多个 MessageSource
的实现类,常用的是 ResourceBundleMessageSource
。
LocaleResolver
LocaleResolver
用于确定当前请求的 locale
。它可以根据请求的参数、会话信息或客户端的浏览器设置等方式来解析 locale
。Spring 提供了多种 LocaleResolver
的实现类,如 AcceptHeaderLocaleResolver
、CookieLocaleResolver
、SessionLocaleResolver
等。
LocaleChangeInterceptor
LocaleChangeInterceptor
是一个拦截器,用于拦截请求并根据请求参数动态改变当前的 locale
。通过在请求 URL 中添加特定的参数,用户可以在不重新启动应用程序的情况下切换语言。
在 src/main/resources
目录下创建以下资源束文件:
messages.properties
(默认资源文件)welcome.message=Welcome to our application!
messages_en_US.properties
(美国英语资源文件)welcome.message=Welcome to our application!
messages_zh_CN.properties
(中国中文资源文件)welcome.message=欢迎使用我们的应用程序!
MessageSource
在 Spring 配置文件(如 dispatcher-servlet.xml
或 Java 配置类)中配置 MessageSource
:
如果使用 Java 配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
@Configuration
public class AppConfig {
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
}
LocaleResolver
可以选择不同的 LocaleResolver
实现,这里以 SessionLocaleResolver
为例:
Java 配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;
@Configuration
public class AppConfig {
// ... 其他配置
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.US);
return sessionLocaleResolver;
}
}
LocaleChangeInterceptor
Java 配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;
@Configuration
public class AppConfig implements WebMvcConfigurer {
// ... 其他配置
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.US);
return sessionLocaleResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang");
return interceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home(Model model) {
return "home";
}
}
在 JSP 视图 home.jsp
中使用 spring:message
标签获取本地化消息:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
国际化示例
English
中文
locale
选择合适的资源束文件来获取消息。MessageSource
:负责加载和解析资源束文件,通过 messageSource.getMessage()
方法可以根据键和 locale
获取相应的消息。LocaleResolver
:确定当前请求的 locale
,SessionLocaleResolver
将 locale
信息存储在会话中,方便在多个请求之间保持语言设置。LocaleChangeInterceptor
:拦截请求,根据请求参数 lang
的值动态改变当前的 locale
,用户可以通过点击链接切换语言。spring:message
标签:在 JSP 视图中使用该标签可以方便地获取本地化消息,根据当前的 locale
显示相应的文本。通过以上步骤,就可以在 Spring MVC 应用程序中实现基本的国际化支持,为不同语言和地区的用户提供本地化的内容。