SpringBoot实现国际化(多语言)配置的详细步骤
作者:齐 飞
SpringBoot 国际化配置是实现应用程序支持多语言的功能,这对于全球化的网站和应用来说至关重要,SpringBoot 提供了简洁的机制来实现这一目标,本文通过代码示例和图文介绍的非常详细,需要的朋友可以参考下
核心原理
SpringBoot国际化的核心是 MessageSource 接口,其默认实现是 ResourceBundleMessageSource。它会根据当前用户的区域(Locale)信息,从配置的资源文件(.properties 文件)中加载对应的文本信息。
整个过程可以分解为:
- 识别区域(Locale): 通过拦截器解析请求,获取用户的语言环境(如从请求头、会话、参数等)。
- 加载资源: 根据识别到的 Locale,找到对应的 .properties 文件。
- 获取文本: 在代码或模板中,通过唯一的消息键(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国际化(多语言)配置的资料请关注脚本之家其它相关文章!