• 配置国际化解析文件及生效探究


    SpringBoot对国际化的自动配置,涉及到一个类:MessageSourceAutoConfiguration。已经自动配置好了管理国际化资源文件的组件 ResourceBundleMessageSource;

    // 获取 properties 传递过来的值进行判断
    @Bean
    public MessageSource messageSource(MessageSourceProperties properties) {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        if (StringUtils.hasText(properties.getBasename())) {
            // 设置国际化文件的基础名(去掉语言国家代码的)
            messageSource.setBasenames(
                StringUtils.commaDelimitedListToStringArray(
                                           StringUtils.trimAllWhitespace(properties.getBasename())));
        }
        if (properties.getEncoding() != null) {
            messageSource.setDefaultEncoding(properties.getEncoding().name());
        }
        messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
        Duration cacheDuration = properties.getCacheDuration();
        if (cacheDuration != null) {
            messageSource.setCacheMillis(cacheDuration.toMillis());
        }
        messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
        messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
        return messageSource;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    真实 的情况是放在了i18n目录下,要去配置这个messages的路径。

    配置页面国际化值
    去页面获取国际化的值,查看Thymeleaf的文档,找到message取值操作为:#{…}。

    配置国际化解析
    在Spring中有一个国际化的Locale (区域信息对象);里面有一个叫做LocaleResolver (获取区域信息对象)的解析器!

    我们去我们webmvc自动配置文件,寻找一下!看到SpringBoot默认配置:

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(prefix = “spring.mvc”, name = “locale”)
    public LocaleResolver localeResolver() {
    // 容器中没有就自己配,有的话就用用户配置的
    if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
    return new FixedLocaleResolver(this.mvcProperties.getLocale());
    }
    // 接收头国际化分解
    AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
    localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
    return localeResolver;
    }
    AcceptHeaderLocaleResolver 这个类中有一个方法

    public Locale resolveLocale(HttpServletRequest request) {
    Locale defaultLocale = this.getDefaultLocale();
    // 默认的就是根据请求头带来的区域信息获取Locale进行国际化
    if (defaultLocale != null && request.getHeader(“Accept-Language”) == null) {
    return defaultLocale;
    } else {
    Locale requestLocale = request.getLocale();
    List supportedLocales = this.getSupportedLocales();
    if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {
    Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);
    if (supportedLocale != null) {
    return supportedLocale;
    } else {
    return defaultLocale != null ? defaultLocale : requestLocale;
    }
    } else {
    return requestLocale;
    }
    }
    }
    点击链接让我们的国际化资源生效,需要让自己的Locale生效!
    写一个自己的LocaleResolver,可以在链接上携带区域信息!

    修改一下前端页面的跳转连接:

    中文
    English
    我们去写一个处理的组件类!

    package com.kuang.component;

    import org.springframework.util.StringUtils;
    import org.springframework.web.servlet.LocaleResolver;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.Locale;

    //可以在链接上携带区域信息
    public class MyLocaleResolver implements LocaleResolver {

    //解析请求
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
    
        String language = request.getParameter("l");
        Locale locale = Locale.getDefault(); // 如果没有获取到就使用系统默认的
        //如果请求链接不为空
        if (!StringUtils.isEmpty(language)){
            //分割请求参数
            String[] split = language.split("_");
            //国家,地区
            locale = new Locale(split[0],split[1]);
        }
        return locale;
    }
    
    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    }
    为使区域化信息能够生效,再配置一下这个组件!自己的MvcConofig下添加bean;

    @Bean
    public LocaleResolver localeResolver(){
    return new MyLocaleResolver();
    }
    重启项目即可

  • 相关阅读:
    ts查缺补漏
    Java21 + SpringBoot3整合Redis,使用Lettuce连接池,推荐连接池参数配置,封装Redis操作
    圆锥药型罩采用2D、3D单层和3D三种方法侵彻结果对比(基于LS-DYNA软件平台)
    springboot实现websocket
    LeetCode周赛317场 && AcWing周赛77场总结
    Mysql数据库调优
    RLHF(从人类反馈中进行强化学习)详解(一)
    类型转换方法
    React 函数组件导出自定义方法的办法说明
    【前端】较大规模数据的网络读取与图表展示
  • 原文地址:https://blog.csdn.net/yooppa/article/details/126494966