SpringBoot实现国际化(多语言)配置

📅 2026/7/17 14:00:43
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.properties10001\u7cfb\u7edf\u7e41\u5fd9\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff0110002\u8bf7\u52ff\u91cd\u590d\u63d0\u4ea4\uff01messages_en_US.properties10001The system is busy,pleasetryagain later!10002Pleasedonot resubmit!messages_zh_CN.properties10001\u7cfb\u7edf\u7e41\u5fd9\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff0110002\u8bf7\u52ff\u91cd\u590d\u63d0\u4ea4\uff01messages_zh_TW.properties10001\u7cfb\u7d71\u7e41\u5fd9\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66\uff0110002\u8acb\u52ff\u91cd\u8907\u63d0\u4ea4\uff012.相关配置application.ymlspring:messages:basename:i18n/messagesencoding:utf-8国际化参数解析器importorg.springframework.util.StringUtils;importorg.springframework.web.servlet.LocaleResolver;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.util.Locale;/** * 国际化参数解析器 * * author qf * date 2025-05-08 20:58:18 */publicclassHeaderLocalResolverimplementsLocaleResolver{privatestaticfinalStringACCEPT_LANGUAGElang;/** * 国际化参数解析方法 */OverridepublicLocaleresolveLocale(HttpServletRequesthttpServletRequest){LocalelocaleLocale.getDefault();StringacceptLanguageHeaderhttpServletRequest.getHeader(ACCEPT_LANGUAGE);if(StringUtils.isEmpty(acceptLanguageHeader)){//前端未传lang请求头 默认使用简体中文String[]paramsLanguageEnum.CN.getLang().split(-);returnnewLocale(params[0],params[1]);}StringlangacceptLanguageHeader.split(;)[0];String[]paramslang.split(-);if(params.length1){returnlocale;}localenewLocale(params[0],params[1]);returnlocale;}OverridepublicvoidsetLocale(HttpServletRequestrequest,HttpServletResponseresponse,Localelocale){}}/** * 多语言枚举 * author qf * date 2025-05-08 20:58:18 */publicenumLanguageEnum{// 简体中文CN(zh-CN),//繁体中文TW(zh-TW),//英文US(en-US);privateStringlang;LanguageEnum(Stringlang){this.langlang;}publicStringgetLang(){returnthis.lang;}}国际化配置类importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.support.ResourceBundleMessageSource;importorg.springframework.web.servlet.LocaleResolver;/** * 国际化配置类 * author qf * date 2025-05-08 20:58:18 */ConfigurationpublicclassI18nConfig{Value(${spring.messages.basename:i18n.messages})privateStringbaseName;Value(${spring.messages.encoding:UTF-8})privateStringencoding;/** * 注入文本解析 */Bean(namemessageSource)publicResourceBundleMessageSourcegetMessageResource(){ResourceBundleMessageSourcemessageSourcenewResourceBundleMessageSource();messageSource.setBasename(baseName);messageSource.setDefaultEncoding(encoding);returnmessageSource;}/** * 注入自定义国际化解析器 */Bean(namelocaleResolver)publicLocaleResolverlocaleResolver(){returnnewHeaderLocalResolver();}}工具类importorg.apache.commons.lang.StringUtils;importorg.springframework.context.MessageSource;importorg.springframework.context.NoSuchMessageException;importorg.springframework.context.i18n.LocaleContextHolder;importorg.springframework.stereotype.Component;importjava.util.Locale;importjava.util.Objects;ComponentpublicclassLanguageUtil{privatestaticMessageSourcemessageSource;publicLanguageUtil(MessageSourcemessageSource){this.messageSourcemessageSource;}/** * 国际化翻译工具 * * param code 国际化CODE字符 * param vars 国际化翻译参数列表 * return 国际化后字符串 */publicstaticStringget(Stringcode,Object...vars){LocalelocaleLocaleContextHolder.getLocale();if(Objects.isNull(vars)||vars.length0){varsnewObject[]{};}StringtranslateMessagenull;try{translateMessagemessageSource.getMessage(code,vars,locale);}catch(NoSuchMessageExceptione){returnnull;}returntranslateMessage;}/** * 获取当前语言 默认繁体中文 */publicstaticStringgetLocale(){StringlocaleLocaleContextHolder.getLocale().toString();if(StringUtils.isEmpty(locale)){returnLanguageEnum.TW.getLang();}returnlocale;}/** * 将语言编码 转为ics 对应的lang */publicstaticStringtransToICSLang(Stringlocate){if(StringUtils.isEmpty(locate)){returnlocate;}returnlocate.replace(-,_);}}测试效果RestControllerRequestMapping(api)publicclassTestController{/** * 通过code拿多语言下的内容 * param code * return */GetMapping(/test)publicStringtest(Stringcode){StringmessageLanguageUtil.get(code);returnmessage;}}请求头中不添加lang之前在HeaderLocalResolver.resolveLocale()中进行了配置默认使用简体中文请求头中添加lang在请求头中添加langvalue值传需要的简体中文、繁体中文或英文即可进行切换。lang en-US zh-TW zh-CN