1 创建properties文件

在resources文件下新建i18n文件夹, 创建文件 messages_zh_CN.properties messages_en_US.properties

校验相关的配置 ValidationMessages_zh_CN.properties ValidationMessages_en_US.properties

hello=你好
hello=hi
import.file.not_null=Import file cannot be empty
import.file.not_null=导入文件不能为空

2 添加配置

spring:
  messages:
    basename: i18n/messages
    encoding: UTF-8          # 编码格式

2 添加配置类

校验相关国际化

@Configuration
public class ValidatorConfig {

    @Bean
    @Primary                                 // 关键:标记为首选 Bean
    @ConditionalOnMissingBean(LocalValidatorFactoryBean.class)  // 关键:如果已经有就不创建
    public LocalValidatorFactoryBean getValidator() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();

        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        // 同时加载你的通用消息 + 校验专用消息(支持你所有 key)
        messageSource.setBasenames(
                "classpath:i18n/messages",
                "classpath:i18n/ValidationMessages"
        );
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(3600);
        messageSource.setUseCodeAsDefaultMessage(true); // 找不到 key 时不抛异常

        bean.setValidationMessageSource(messageSource);
        return bean;
    }
}

从请求的header中获取语言的类型

@Configuration
public class DefaultLocaleResolver implements LocaleResolver {

    @Autowired
    private HttpServletRequest request;

    public Locale getLocal() {
        return resolveLocale(request);
    }

    /**
     * 从HttpServletRequest中获取Locale
     *
     * @param httpServletRequest    httpServletRequest
     * @return                      语言Local
     */
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        //获取请求中的语言参数
        String language = httpServletRequest.getParameter("lang");
        //如果没有就使用默认的(根据主机的语言环境生成一个 Locale
        Locale locale = Locale.getDefault();
        //如果请求的链接中携带了 国际化的参数
        if (!StringUtils.isEmpty(language)){
            //zh_CN
            String[] s = language.split("-");
            //国家,地区
            locale = new Locale(s[0], s[1]);
        }
        return locale;
    }

    /**
     * 用于实现Locale的切换。
     *
     * @param request               HttpServletRequest
     * @param httpServletResponse   HttpServletResponse
     * @param locale                locale
     */
    @Override
    public void setLocale(@NonNull HttpServletRequest request, @Nullable HttpServletResponse httpServletResponse, @Nullable Locale locale) {

    }

}

3 提供工具类

@Slf4j
@Component
public class I18nUtil {

    @Value("${spring.messages.basename}")
    private String basename;

    private final DefaultLocaleResolver resolver;

    private static DefaultLocaleResolver customLocaleResolver;

    private static String path;

    public I18nUtil(DefaultLocaleResolver resolver) {
        this.resolver = resolver;
    }

    @PostConstruct
    public void init() {
        setBasename(basename);
        setCustomLocaleResolver(resolver);
    }

    /**
     * 获取 国际化后内容信息
     *
     * @param code 国际化key
     * @return 国际化后内容信息
     */
    public static String getMessage(String code) {
        Locale locale = customLocaleResolver.getLocal();
        return getMessage(code, null, code, locale);
    }

    /**
     * 获取指定语言中的国际化信息,如果没有则走英文
     *
     * @param code 国际化 key
     * @param lang 语言参数
     * @return 国际化后内容信息
     */
    public static String getMessage(String code, String lang) {
        Locale locale;
        if (StringUtils.isEmpty(lang)) {
            locale = Locale.US;
        } else {
            try {
                String[] split = lang.split("-");
                locale = new Locale(split[0], split[1]);
            } catch (Exception e) {
                locale = Locale.US;
            }
        }
        return getMessage(code, null, code, locale);
    }

    /**
     * 获取站内信指定语言 目前只支持 中文与英文两类 默认英文
     *
     * @param code 国际化 key
     * @param lang 语言参数
     * @return 国际化后内容信息
     */
    public static String getStationLetterMessage(String code, String lang) {
        Locale locale = Objects.equals(lang, "zh-CN") ? Locale.SIMPLIFIED_CHINESE : Locale.US;
        return getMessage(code, null, code, locale);
    }

    public static String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.toString());
        messageSource.setBasename(path);
        String content;
        try {
            content = messageSource.getMessage(code, args, locale);
        } catch (Exception e) {
            log.error("国际化参数获取失败===>{},{}", e.getMessage(), e);
            content = defaultMessage;
        }
        return content;

    }

    public static void setBasename(String basename) {
        I18nUtil.path = basename;
    }

    public static void setCustomLocaleResolver(DefaultLocaleResolver resolver) {
        I18nUtil.customLocaleResolver = resolver;
    }

}

4 调用工具类

将需要国际化的文字放到properties文件中,使用工具类调用.

I18nUtil.getMessage("operation.invitation")

校验先关的国际化