springboot使用MessageSource国际化提示
1、MessageSource源码
MessageSource
是spring自带的一个接口,源码如下
| package org.springframework.context; |
| |
| import java.util.Locale; |
| import org.springframework.lang.Nullable; |
| |
| public interface MessageSource { |
| @Nullable |
| String getMessage(String var1, @Nullable Object[] var2, @Nullable String var3, Locale var4); |
| |
| String getMessage(String var1, @Nullable Object[] var2, Locale var3) throws NoSuchMessageException; |
| |
| String getMessage(MessageSourceResolvable var1, Locale var2) throws NoSuchMessageException; |
| } |
ApplicationContext
实现了MessageSource
的接口,所有可以直接通过@Autowired
就可以注入MessageSource
对象了,源码如下:
| package org.springframework.context; |
| |
| import org.springframework.beans.factory.HierarchicalBeanFactory; |
| import org.springframework.beans.factory.ListableBeanFactory; |
| import org.springframework.beans.factory.config.AutowireCapableBeanFactory; |
| import org.springframework.core.env.EnvironmentCapable; |
| import org.springframework.core.io.support.ResourcePatternResolver; |
| import org.springframework.lang.Nullable; |
| |
| public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver { |
| @Nullable |
| String getId(); |
| |
| String getApplicationName(); |
| |
| String getDisplayName(); |
| |
| long getStartupDate(); |
| |
| @Nullable |
| ApplicationContext getParent(); |
| |
| AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException; |
| } |
2、yml配置MessageSource
| |
| spring: |
| messages: |
| basename: i18n/messages,i18n/messages_zh,i18n/messages_zh_CN |
| encoding: UTF-8 |
spring.messages.basename
:加载国际化文件,有多个使用逗号隔开,i18n
是文件夹,messages
为资源文件messages.properties
,目录文件放在src/main/resources
下

messages.properties
| messages.operation.success=操作成功 |
| messages.operation.success.arg=操作成功{0} |
-
spring.messages.encoding
:中文编码,默认是UTF-8
-
spring.messages.cacheDuration
:文件加载到内存后缓存的时间,默认单位秒,如何没有设置默认是一次性加载,不会自动更新。这个参数在 ResourceBundleMessageSource、ReloadableResourceBundleMessageSource 稍微有些差异,会具体说下。
-
spring.messages.fallbackToSystemLocale
:一个兜底开关,默认情况下,如何系统找不到语言的值,会走beanname中默认的messages.properties中查找,如何再找不就会直接返回或抛异常。该参数设置为 true 的话,还会再走一步兜底逻辑,从当前系统语言对应配置文件中查找。该参数默认是 true;
-
spring.messages.alwaysUseMessageFormat
:MessageSource 组件通过 MessageFormat.format 函数对国际化信息格式化,如果注入参数,输出结果是经过格式化的。比如 MessageFormat.format("Hello, {0}!", "Kanshan") 输出结果是“Hello, Kanshan!”。该参数控制的是,当输入参数为空时,是否还是使用 MessageFormat.format 函数对结果进行格式化,默认是 false;
-
spring.messages.useCodeAsDefaultMessage
:当没有找到对应信息的时候,是否返回 code。也就是当找了所有能找的配置文件后,还是没有找到对应的信息,是否直接返回 code 值。默认是 false,即不返回 code,抛出 NoSuchMessageException 异常。
按需配置即可
3、创建MessagesUtils工具类简化使用
| import com.ss.platform.util.HttpRequestUtil; |
| import com.ss.platform.util.SpringContextUtil; |
| import org.springframework.context.MessageSource; |
| |
| import javax.servlet.http.HttpServletRequest; |
| import java.util.Locale; |
| |
| public class MessagesUtils { |
| |
| public static String getMessages(String code, Object[] args){ |
| String messageStr = getMessages(code,args,null); |
| return messageStr; |
| } |
| |
| public static String getMessages(String code){ |
| String messageStr = getMessages(code,null,null); |
| return messageStr; |
| } |
| |
| public static String getMessages(String code,Object[] args,Locale locale){ |
| if (locale == null){ |
| HttpServletRequest request = HttpRequestUtil.getRequest(); |
| String language = request.getHeader("ss-Language"); |
| locale = new Locale(language); |
| } |
| MessageSource messageSource = (MessageSource) SpringContextUtil.getBean("messageSource"); |
| String messageStr = messageSource.getMessage(code,args, locale); |
| return messageStr; |
| } |
| } |
使用:
| String mess = MessagesUtils.getMessages("messages.operation.success","zh"); |
| |
| String mess = MessagesUtils.getMessages("messages.operation.success.arg",new Object[]{"我操作的"},"zh"); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能