SpringBoot实现国际化(多语言)配置的详细步骤

 更新时间:2025年09月05日 10:28:36   作者:齐 飞  
SpringBoot 国际化配置是实现应用程序支持多语言的功能,这对于全球化的网站和应用来说至关重要,SpringBoot 提供了简洁的机制来实现这一目标,本文通过代码示例和图文介绍的非常详细,需要的朋友可以参考下

核心原理

SpringBoot国际化的核心是 MessageSource 接口,其默认实现是 ResourceBundleMessageSource。它会根据当前用户的区域(Locale)信息,从配置的资源文件(.properties 文件)中加载对应的文本信息。

整个过程可以分解为:

  1. 识别区域(Locale): 通过拦截器解析请求,获取用户的语言环境(如从请求头、会话、参数等)。
  2. 加载资源: 根据识别到的 Locale,找到对应的 .properties 文件。
  3. 获取文本: 在代码或模板中,通过唯一的消息键(key) 获取对应的本地化文本。

详细实现步骤

1.在resources文件下新建i18n文件,并新建国际化资源文件

输入messages,添加简体中文、繁体中文、英文

出现以下文件,表示创建成功。

messages.properties文件中添加多语言信息

中文转为UNICODE编码,可以找一个在线 Unicode 编码转换

messages.properties

10001=\u7cfb\u7edf\u7e41\u5fd9\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01
10002=\u8bf7\u52ff\u91cd\u590d\u63d0\u4ea4\uff01

messages_en_US.properties

10001=The system is busy, please try again later!
10002=Please do not resubmit!

messages_zh_CN.properties

10001=\u7cfb\u7edf\u7e41\u5fd9\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01
10002=\u8bf7\u52ff\u91cd\u590d\u63d0\u4ea4\uff01

messages_zh_TW.properties

10001=\u7cfb\u7d71\u7e41\u5fd9\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66\uff01
10002=\u8acb\u52ff\u91cd\u8907\u63d0\u4ea4\uff01

2.相关配置

application.yml

spring:
  messages:
    basename: i18n/messages
    encoding: utf-8

国际化参数解析器

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;

/**
 * 国际化参数解析器
 *
 * @author qf
 * @date 2025-05-08 20:58:18
 */
public class HeaderLocalResolver implements LocaleResolver {
    private static final String ACCEPT_LANGUAGE = "lang";

    /**
     * 国际化参数解析方法
     */
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        Locale locale = Locale.getDefault();
        String acceptLanguageHeader = httpServletRequest.getHeader(ACCEPT_LANGUAGE);
        if (StringUtils.isEmpty(acceptLanguageHeader)) {
            //前端未传lang请求头 默认使用简体中文
            String[] params = LanguageEnum.CN.getLang().split("-");
            return new Locale(params[0], params[1]);
        }
        String lang = acceptLanguageHeader.split(";")[0];
        String[] params = lang.split("-");
        if (params.length == 1) {
            return locale;
        }
        locale = new Locale(params[0], params[1]);
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
    }
}
/**
 * 多语言枚举
 * @author qf
 * @date 2025-05-08 20:58:18
 */
public enum LanguageEnum {
    // 简体中文
    CN("zh-CN"),
    //繁体中文
    TW("zh-TW"),
    //英文
    US("en-US");

    private String lang;
    LanguageEnum(String lang) {
        this.lang = lang;
    }


    public String getLang(){
        return this.lang;
    }
}

国际化配置类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;

/**
 * 国际化配置类
 * @author qf
 * @date 2025-05-08 20:58:18
 */
@Configuration
public class I18nConfig {
    @Value("${spring.messages.basename:i18n.messages}")
    private String baseName;
    @Value("${spring.messages.encoding:UTF-8}")
    private String encoding;

    /**
     * 注入文本解析
     */
    @Bean(name = "messageSource")
    public ResourceBundleMessageSource getMessageResource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename(baseName);
        messageSource.setDefaultEncoding(encoding);
        return messageSource;
    }

    /**
     * 注入自定义国际化解析器
     */
    @Bean(name = "localeResolver")
    public LocaleResolver localeResolver(){
        return new HeaderLocalResolver();
    }
}

测试效果

@RestController
@RequestMapping("api")
public class TestController {
    /**
     * 通过code拿多语言下的内容
     * @param code
     * @return
     */
    @GetMapping("/test")
    public String test(String code) {
        String message = LanguageUtil.get(code);
        return message;
    }
}

请求头中不添加lang

之前在HeaderLocalResolver.resolveLocale()中进行了配置,默认使用简体中文

请求头中添加lang

在请求头中添加lang,value值传需要的简体中文、繁体中文或英文,即可进行切换。

lang = en-US zh-TW zh-CN

以上就是SpringBoot实现国际化(多语言)配置的详细步骤的详细内容,更多关于SpringBoot国际化(多语言)配置的资料请关注脚本之家其它相关文章!

相关文章

  • 解决SpringBoot使用devtools导致的类型转换异常问题

    解决SpringBoot使用devtools导致的类型转换异常问题

    这篇文章主要介绍了解决SpringBoot使用devtools导致的类型转换异常问题,具有很好的参考价值,希望对大家有所帮助。 一起跟随小编过来看看吧
    2020-08-08
  • Mybatis中的延迟加载案例解析

    Mybatis中的延迟加载案例解析

    这篇文章主要介绍了Mybatis中的延迟加载,场景结合案例分析非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • MyBatis如何通过xml方式实现SaveOrUpdate

    MyBatis如何通过xml方式实现SaveOrUpdate

    这篇文章主要讲如何通过xml方式实现SaveOrUpdate,但是仍然建议在Service中实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-06-06
  • Java中5种输出换行方式小结

    Java中5种输出换行方式小结

    在Java中,输出换行符是一项非常基本的操作,它在控制台中输出文本时非常常见,本文主要介绍了Java中5种输出换行方式小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java实现图片上文字内容的动态修改的操作步骤

    Java实现图片上文字内容的动态修改的操作步骤

    在数字图像处理领域,Java提供了强大的库来处理图片,包括读取、修改和写入图片,如果你需要在Java应用程序中修改图片上的文字内容,可以通过图像处理技术来实现,这篇博文将介绍如何使用Java实现图片上文字内容的动态修改,需要的朋友可以参考下
    2024-07-07
  • Java列出2到100之间所有素数的方法

    Java列出2到100之间所有素数的方法

    这篇文章主要介绍了Java列出2到100之间所有素数的方法,涉及java数值运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Spring Data JPA中的Specification动态查询详解

    Spring Data JPA中的Specification动态查询详解

    Specification是一个设计模式,用于企业级应用开发中,其主要目的是将业务规则从业务逻辑中分离出来,在数据查询方面,Specification可以定义复杂的查询,使其更易于重用和测试,这篇文章主要介绍了Spring Data JPA中的Specification动态查询详解,需要的朋友可以参考下
    2023-07-07
  • Java深入理解代码块的使用细节

    Java深入理解代码块的使用细节

    所谓代码块是指用"{}"括起来的一段代码,根据其位置和声明的不同,可以分为普通代码块、构造块、静态块、和同步代码块。如果在代码块前加上 synchronized关键字,则此代码块就成为同步代码块
    2022-05-05
  • Java cglib动态代理原理分析

    Java cglib动态代理原理分析

    这篇文章主要介绍了Java cglib动态代理的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-05-05
  • SpringSecurity Oauth2访问令牌续期问题

    SpringSecurity Oauth2访问令牌续期问题

    这篇文章主要介绍了SpringSecurity Oauth2访问令牌续期问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论