7、springboot使用MessageSource国际化提示

发布时间 2023-09-27 11:08:35作者: 站着说话不腰疼

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框架配置
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工具类简化使用

package com.ss.ifrs.datamgr.util;

import com.ss.platform.util.SpringContextUtil;
import org.springframework.context.MessageSource;

import java.util.Locale;

public class MessagesUtils {

    public static String getMessages(String code, Object[] args,String language){
       	//通过上下文获取bean
        MessageSource messageSource = (MessageSource) SpringContextUtil.getBean("messageSource");
        //通过对应的code,语言获取国际化翻译
        String messageStr = messageSource.getMessage(code,args, new Locale(language));
        return messageStr;
    }

    public static String getMessages(String code, String language){
        MessageSource messageSource = (MessageSource) SpringContextUtil.getBean("messageSource");
        String messageStr = messageSource.getMessage(code,null, new Locale(language));
        return messageStr;
    }

}

使用:

String mess = MessagesUtils.getMessages("messages.operation.success","zh");
//带动态参数
String mess = MessagesUtils.getMessages("messages.operation.success.arg",new Object[]{"我操作的"},"zh");