在 Spring 项目里实现国际化(i18n),通常要借助 Spring 提供的 MessageSource
接口和 LocaleResolver
接口。下面详细阐述实现步骤与示例代码。
1. 添加国际化资源文件
在 src/main/resources
目录下创建 messages.properties
以及其他语言对应的资源文件,像 messages_en_US.properties
、messages_zh_CN.properties
等。
messages.properties
(默认语言)
welcome.message=Welcome to our application!
messages_zh_CN.properties
(中文)
welcome.message=欢迎来到我们的应用程序!
messages_en_US.properties
(英文)
welcome.message=Welcome to our application!
2. 配置 MessageSource
在 Spring 配置类里配置 MessageSource
来加载国际化资源文件。
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");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
3. 配置 LocaleResolver
LocaleResolver
用于解析用户的语言环境。Spring 提供了多种 LocaleResolver
实现,常见的有 SessionLocaleResolver
和 CookieLocaleResolver
。下面以 SessionLocaleResolver
为例:
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 WebConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.US);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
4. 在控制器中使用国际化消息
在控制器里注入 MessageSource
,并根据用户的语言环境获取相应的国际化消息。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.Locale;
@Controller
public class HomeController {
@Autowired
private MessageSource messageSource;
@GetMapping("/")
public String home(Model model, Locale locale) {
String welcomeMessage = messageSource.getMessage("welcome.message", null, locale);
model.addAttribute("welcomeMessage", welcomeMessage);
return "home";
}
}
5. 在视图中显示国际化消息
如果你使用的是 Thymeleaf 模板引擎,可以在 HTML 页面中显示国际化消息:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>国际化示例</title>
</head>
<body>
<h1 th:text="${welcomeMessage}"></h1>
<a href="?lang=en_US">English</a>
<a href="?lang=zh_CN">中文</a>
</body>
</html>
代码解释
- 资源文件:
messages.properties
及其语言变体文件存储了不同语言的文本消息。 - MessageSource:负责加载和管理国际化资源文件。
- LocaleResolver:用于解析用户的语言环境。
- LocaleChangeInterceptor:允许用户通过请求参数(如
lang
)来切换语言。 - 控制器:注入
MessageSource
并根据用户的语言环境获取相应的国际化消息。 - 视图:使用 Thymeleaf 模板引擎显示国际化消息,并提供切换语言的链接。
通过以上步骤,你就能够在 Spring 项目中实现国际化功能了。