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


    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();
    }
    重启项目即可

  • 相关阅读:
    基于小程序制作一个猜拳小游戏
    用VS开发一款“飞机大战“单机游戏<C++>
    了解3dmax坐标系
    安卓讲课笔记1.2 测试开发环境
    python 娣卞害绁炵粡缃戠粶,python 缃戠粶鍒嗘瀽
    Linux 常用工具(yum、vim、gcc、gdb、git)
    Linux:gcc编译器
    python sklearn 多输出回归
    把C#的model转成excel的table信息
    高速公路智能管理系统:构建安全畅通的数字大动脉
  • 原文地址:https://blog.csdn.net/yooppa/article/details/126494966