1. 概述

本教程将演示如何在 Spring Boot 应用中实现国际化功能,让应用支持多语言切换。

2. Maven 依赖

开发时需要添加以下核心依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>

最新版 spring-boot-starter-thymeleaf 可在 Maven Central 获取。

3. LocaleResolver 配置

需要配置 LocaleResolver Bean 来识别当前使用的语言环境:

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver slr = new SessionLocaleResolver();
    slr.setDefaultLocale(Locale.US);
    return slr;
}

LocaleResolver 接口有多种实现方式:

  • 基于会话(Session)
  • 基于Cookie
  • 基于 Accept-Language 请求头
  • 固定值

✅ 这里使用 SessionLocaleResolver 并设置默认语言为美式英语。

4. LocaleChangeInterceptor 拦截器

添加拦截器实现语言切换功能:

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

⚠️ 关键步骤:必须将拦截器注册到应用中:

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

5. 定义消息源

Spring Boot 默认在 src/main/resources 目录下查找国际化文件:

  • 命名规则:messages_XX.properties(XX为语言代码)
  • 默认回退文件:messages.properties

❌ 注意:默认语言和回退文件是两个独立概念:

  • 默认语言:当请求的语言不存在时使用
  • 回退文件:当特定语言文件中找不到键值时使用

示例文件结构:

默认文件 messages.properties(英语)

greeting=Hello! Welcome to our website!
lang.change=Change the language
lang.eng=English
lang.fr=French

**法语文件 messages_fr.properties**:

greeting=Bonjour! Bienvenue sur notre site!
lang.change=Changez la langue
lang.eng=Anglais
lang.fr=Francais

6. 控制器与HTML页面

创建控制器返回国际化页面:

@Controller
public class PageController {

    @GetMapping("/international")
    public String getInternationalPage() {
        return "international";
    }
}

Thymeleaf 模板中使用国际化键值:

<h1 th:text="#{greeting}"></h1>

JSP 中的语法(对比参考):

<h1><spring:message code="greeting" text="default"/></h1>

语言切换实现:

  1. URL 参数格式:/international?lang=fr

  2. 添加语言选择下拉框:

    <span th:text="#{lang.change}"></span>:
    <select id="locales">
     <option value=""></option>
     <option value="en" th:text="#{lang.eng}"></option>
     <option value="fr" th:text="#{lang.fr}"></option>
    </select>
    
  3. jQuery 切换逻辑:

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js">
    </script>
    <script type="text/javascript">
    $(document).ready(function() {
     $("#locales").change(function () {
         var selectedOption = $('#locales').val();
         if (selectedOption != ''){
             window.location.replace('international?lang=' + selectedOption);
         }
     });
    });
    </script>
    

7. 运行应用

添加启动类:

@SpringBootApplication
public class InternationalizationApp {
    
    public static void main(String[] args) {
        SpringApplication.run(InternationalizationApp.class, args);
    }
}

运行效果:

  • 英语版本: English Version
  • 法语版本: French Version

8. 总结

本文完整展示了 Spring Boot 国际化的实现方案,核心要点包括:

  1. 配置 LocaleResolver 确定语言环境
  2. 使用 LocaleChangeInterceptor 实现动态切换
  3. 规范化组织多语言资源文件
  4. 前端模板集成国际化键值

完整源码可在 GitHub 获取。


原始标题:Guide to Internationalization in Spring Boot