SpringBoot实现国际化(多语言)配置
文章目录
- 核心原理
- 详细实现步骤
- 1.在resources文件下新建i18n文件,并新建国际化资源文件
- 2.相关配置
- application.yml
- 国际化参数解析器
- 国际化配置类
- 测试效果
- 请求头中不添加lang
- 请求头中添加lang
核心原理
Spring Boot 国际化的核心是 MessageSource 接口,其默认实现是 ResourceBundleMessageSource。它会根据当前用户的区域(Locale)信息,从配置的资源文件(.properties 文件)中加载对应的文本信息。
整个过程可以分解为:
- 识别区域(Locale): 通过拦截器解析请求,获取用户的语言环境(如从请求头、会话、参数等)。
- 加载资源: 根据识别到的 Locale,找到对应的 .properties 文件。
- 获取文本: 在代码或模板中,通过唯一的消息键(key) 获取对应的本地化文本。
详细实现步骤
1.在resources文件下新建i18n文件,并新建国际化资源文件
输入messages,添加简体中文、繁体中文、英文
出现以下文件,表示创建成功。
messages.properties文件中添加多语言信息
中文转为UNICODE编码,可以找一个在线 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/messagesencoding: 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";/*** 国际化参数解析方法*/@Overridepublic 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;}@Overridepublic 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