SpringMVC的国际化

SpringMVC的国际化

WebMVC的核心LocaleResolver,MessageSource。

WebMvcAutoConfiguration 是SpringBoot中的 Web方面的自动配置类。

在MVC的配置类里面,如果没有自定义的LocaleResolver,那么就会使用默认的。并且自定义的名称是"localeResolver",才不会加载默认的。

默认使用的是AcceptHeaderLocaleResolver,这个类会从请求头里面获取Locale,如果没有,就使用默认的。

java 复制代码
@Override
@Bean
@ConditionalOnMissingBean(name = DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME)
public LocaleResolver localeResolver() {
    if (this.webProperties.getLocaleResolver() == WebProperties.LocaleResolver.FIXED) {
        return new FixedLocaleResolver(this.webProperties.getLocale());
    }
    AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
    localeResolver.setDefaultLocale(this.webProperties.getLocale());
    return localeResolver;
}

@ConfigurationProperties("spring.web")
public class WebProperties {
    private Locale locale;

    private LocaleResolver localeResolver = LocaleResolver.ACCEPT_HEADER;

    private final Resources resources = new Resources();
}
  1. 默认的LocaleResolver

    不需要更改,需要在请求头里面添加的Accept-Language属性。

  2. 自定义的LocaleResolver

    需要从自定义的报文里面获取对应属性,就需要自定义LocaleResolver,获取报文属性里面的特定字段。

自定义实现国际化

  1. 自定义的LocaleResolver、MessageSource、Validator添加国际化功能
java 复制代码
@Configuration
public class LocaleWebMvcConfigurer implements WebMvcConfigurer {

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

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource =
                new ReloadableResourceBundleMessageSource();
        List<String> baseNames = new ArrayList<>();
        baseNames.add("classpath:i18n/validation/messages");
        Optional.ofNullable(basename).ifPresent(path -> {
            baseNames.addAll(Arrays.asList(path));
        });
        messageSource.setBasenames(baseNames.toArray(new String[0]));
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
        return messageSource;
    }

    @Override
    public Validator getValidator() {
        return validator();
    }

    @Bean
    public Validator validator() {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource());
        return validator;
    }

    @Bean
    public LocaleResolver localeResolver() {
        return new CustomLocaleResolver();
    }

    private static class CustomLocaleResolver implements LocaleResolver {
        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            String[] locales = Optional.ofNullable((String) FlowRuntimeContext.getTechProperty("LOCALE")).orElse(Locale.getDefault().toString()).split("_");
            return new Locale(locales[0], locales[1]);
        }

        @Override
        public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
        }
    }
}
  1. 指定类路径下添加语言包message.properties,message_zh_CN.properties,message_en_US.properties,message_zh_TW.properties

  2. 使用MessageSource获取对应的message

    messageSource.getMessage(String code, @Nullable Object[] args, Locale locale);

相关推荐
张3蜂4 小时前
深入理解 Python 的 frozenset:为什么要有“不可变集合”?
前端·python·spring
Coder_Boy_5 小时前
基于Spring AI的分布式在线考试系统-事件处理架构实现方案
人工智能·spring boot·分布式·spring
7哥♡ۣۖᝰꫛꫀꪝۣℋ6 小时前
Spring-cloud\Eureka
java·spring·微服务·eureka
一灰灰blog7 小时前
Spring AI中的多轮对话艺术:让大模型主动提问获取明确需求
数据库·人工智能·spring
Java水解8 小时前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
暮色妖娆丶8 小时前
Spring 源码分析 BeanFactoryPostProcessor
spring boot·spring·源码
暮色妖娆丶10 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
Coder_Boy_10 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
雨中飘荡的记忆10 小时前
Spring Batch实战
java·spring
callJJ12 小时前
Spring AI 文本聊天模型完全指南:ChatModel 与 ChatClient
java·大数据·人工智能·spring·spring ai·聊天模型