Spring Boot + Thymeleaf 国际化配置与手动切换实战

Theo
Theo
发布时间:2026-10-15| 4人浏览过
原创

在 Web 开发中提供多语言支持是提升用户体验的关键环节。本文演示如何利用 Spring Boot 内置的国际化机制,配合 Thymeleaf 模板引擎,在登录页等前端界面上实现动态语言切换。重点涵盖配置文件创建、基础名设置、自定义区域解析器(LocaleResolver)实现手动切换逻辑,以及页面中的具体应用语法。

第1步:准备国际化资源文件

在项目类路径 resources 下新建 i18n 文件夹,用于集中管理多语言配置。根据需要创建的 key-value 对通常对应 UI 上的标签、提示语或按钮文本。

  1. 默认配置:login.properties(作为 fallback)。
  2. 中文配置:login_zh_CN.properties。
  3. 英文配置:login_en_US.properties。

以下是示例内容结构:

# login.properties && login_zh_CN.properties
login.tip=请登录
login.username=用户名
login.password=密码
login.rememberme=记住我
login.button=登录
# login_en_US.properties
login.tip=Please sign in
login.username=Username
login.password=Password
login.rememberme=Remember me
login.button=Login

Spring Boot 默认扫描 messages.properties,由于我们将前缀定制为 login 并放在 i18n 目录下,后续需在主配置文件中指定基础名称。

第2步:配置全局属性

修改项目的 application.properties,指定国际化文件的基础路径和前缀名。格式要求为:i18n.前缀名。

spring.messages.basename=i18n.login

该配置确保框架在遇到 #{...} 表达式时,能正确到 i18n/login.properties 及其语言变体中查找对应的值。

第3步:编写自定义区域解析器

为了实现手动切换语言的功能(例如通过 URL 携带参数),需要覆盖默认的 `Accept-Language` 解析逻辑。创建一个配置类实现 LocaleResolver 接口。

package com.lagou.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
@Configuration
public class MyLocalResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        // 1. 尝试获取手动切换参数 l (如 zh_CN 或 en_US)
        String l = request.getParameter("l");
        Locale locale = null;
        if (!StringUtils.isEmpty(l)) {
            // 使用下划线分割,匹配 .properties 文件名格式
            String[] s = l.split("_");
            locale = new Locale(s[0], s[1]);
        } else {
            // 2. 回退到浏览器 Accept-Language 头部自动解析
            String header = request.getHeader("Accept-Language");
            String[] split = header.split(",");
            if (split.length > 0) {
                String[] split1 = split[0].split("-");
                locale = new Locale(split1[0], split1[1]);
            }
        }
        return locale != null ? locale : Locale.getDefault();
    }
    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
        // 保持空实现,不强制写入 cookie/session
    }
    // 将该实例注册为 Bean,覆盖默认实现
    @Bean
    public LocaleResolver localeResolver() {
        return new MyLocalResolver();
    }
}

核心逻辑在于优先读取参数 l,其次读取请求头。注意 URL 参数通常使用下划线 _,而 HTTP 头通常使用短横线 -,代码中需分别处理。

第4步:在 Thymeleaf 页面中应用

打开 HTML 模板(如 login.html),引入命名空间并使用消息表达式绑定文本。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
    <!-- 省略 CSS 引用 -->
</head>
<body class="text-center">
    <form class="form-signin">
        <img class="mb-4" th:src="@{/login/img/login.jpg}" width="72" height="72">
        
        <h1 th:text="#{login.tip}">请登录</h1>
        <input type="text" th:placeholder="#{login.username}" required autofocus>
        <input type="password" th:placeholder="#{login.password}" required>
        
        <div class="checkbox mb-3">
            <label>
                <input type="checkbox" value="remember-me">
                [[#{login.rememberme}]]
            </label>
        </div>
        
        <button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.button}">登录</button>
        
        <!-- 手动切换语言的链接 -->
        <a class="btn btn-sm" th:href="@{/toLoginPage(l='zh_CN')}">中文</a>
        <a class="btn btn-sm" th:href="@{/toLoginPage(l='en_US')}">English</a>
    </form>
</body>
</html>

关键点说明:

  • 块级元素(如 <h1>, <button>)使用 th:text="#{key}" 替换文本。
  • 属性值(如 placeholder)使用 th:placeholder="#{key}"。
  • 行内文本若不在标准属性中,可使用原始文本表达式 [[#{key}]]。
  • 链接携带 l=zh_CN 参数传递给 Controller,进而被自定义 LocaleResolver 捕获。

完成效果验证

部署应用后,可以通过以下两种方式验证:

  1. 手动切换:点击“English”链接,地址栏变为 ?l=en_US,页面文案立即变更为英文。
  2. 自动识别:清除参数或直接在浏览器地址栏访问,根据浏览器语言偏好自动展示对应语言。

上图展示了点击链接后的状态切换结果。只要后端 Controller 正常转发页面请求,配置好的 Resolver 即可生效,无需额外的会话存储逻辑。

以上就是 Spring Boot 与 Thymeleaf 集成实现国际化配置的详细内容,更多关于 Spring Boot 多语言开发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。