在 Spring 项目里实现国际化(i18n),通常要借助 Spring 提供的 MessageSource 接口和 LocaleResolver 接口。下面详细阐述实现步骤与示例代码。

1. 添加国际化资源文件

src/main/resources 目录下创建 messages.properties 以及其他语言对应的资源文件,像 messages_en_US.propertiesmessages_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 实现,常见的有 SessionLocaleResolverCookieLocaleResolver。下面以 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 项目中实现国际化功能了。