Jie
发布于 2026-04-07 / 1 阅读
0
0

【Java】SpringBoot I18n与validation适配

1.配置类 I18nConfig.java

/**
 * 国际化配置
 *
 * @author oyj
 * @since 2025-04-21
 */
@Configuration
public class I18nConfig implements WebMvcConfigurer {

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

    /**
     * 自定义语言解析器,根据请求头 Lang 获取语言
     */
    @Bean
    public LocaleResolver localeResolver() {
        return new CustomHeaderLocaleResolver();
    }

    /**
     * 配置消息源,加载多语言配置文件
     * - messages_*.properties 自定义消息
     * - ValidationMessages_*.properties Bean 校验提示
     */
    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames(
                "classpath:" + messageBeanName,       // e.g., messages_zh.properties
                "classpath:ValidationMessages"        // e.g., ValidationMessages_zh.properties
        );
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    /**
     * 让 Spring Validator 使用上面配置的 messageSource 进行国际化
     */
    @Bean
    public LocalValidatorFactoryBean getValidator(MessageSource messageSource) {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource);
        return validator;
    }

    /**
     * 显式指定 Spring MVC 使用我们的 validator
     */
    @Override
    public Validator getValidator() {
        return getValidator(messageSource());
    }
}

2.请求头处理 CustomHeaderLocaleResolver.java


/**
 * 根据请求头配置当前语言
 *
 * @author oyj
 * @since 2025-04-21 10:22:14
 */
public class CustomHeaderLocaleResolver extends AcceptHeaderLocaleResolver {

    // 语言请求头
    private static final String LANG_HEAD = "Lang";

    // 系统支持的语言
    private static final List<Locale> SUPPORTED_LOCALES = ListUtil.of(
            Locale.US,
            Locale.SIMPLIFIED_CHINESE
    );

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String lang = request.getHeader(LANG_HEAD);
        if (lang == null || lang.isEmpty()) {
            return Locale.SIMPLIFIED_CHINESE; // 默认中文
        }
        Locale requestLocale = Locale.forLanguageTag(lang);
        // 如果是支持的语言就返回,否则默认中文
        return SUPPORTED_LOCALES.contains(requestLocale)
                ? requestLocale
                : Locale.SIMPLIFIED_CHINESE;
    }
}

3.application.yaml

spring:
  # 资源信息
  messages:
    # 国际化资源文件路径
    basename: i18n/messages

4.resources/i18n 目录新增文件

messages.properties 默认

messages_en.properties 英文

messages_zh.properties 中文


评论