• SpringBoot-15-模块开发-页面国际化


    5.6.3 页面国际化
    • 先确保项目的file encodings都是utf-8

    在这里插入图片描述

    • 先建立这3个国际化配置文件

    在这里插入图片描述

    • login.properties
    login.password=密码
    login.tip=请登陆
    login.btn=登陆
    login.username=用户名
    login.rememberme=记住我
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • login_en_US.properties
    login.password=password
    login.tip=Please sign in
    login.btn=sign in
    login.username=username
    login.rememberme=Rememberme
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • login_zh_CN.properties
    login.password=密码
    login.tip=请登陆
    login.btn=登陆
    login.username=用户名
    login.rememberme=记住我
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 在根据MessageSourceAutoConfiguration消息转换类的源码去配置spring.messages属性
    @AutoConfiguration
    @ConditionalOnMissingBean(name = AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME, search = SearchStrategy.CURRENT)
    @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
    @Conditional(ResourceBundleCondition.class)
    @EnableConfigurationProperties
    public class MessageSourceAutoConfiguration {
    
       private static final Resource[] NO_RESOURCES = {};
    
       @Bean
       @ConfigurationProperties(prefix = "spring.messages")
       public MessageSourceProperties messageSourceProperties() {
          return new MessageSourceProperties();
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    spring:
        messages:
          basename: i18n.login   #消息转换配置
    
    • 1
    • 2
    • 3
    • 之后在用国际化标签#{}修改index.html页面,并修改国际化:链接、参数
    
    
       
          
          
          
          
          Signin Template for Bootstrap
          
          
          
          
       
    
       
          
    
       
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 之后阅读WebMvcAutoConfiguration源码分析地区国际化解析器的原理,发现自定义了LocaleResolver就不会走默认自动装配的国际化了
    @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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 所以要实现自定义地区国际化解析器,实现此接口,重写方法然后注册bean到config中即可生效.如LocaleResolver接口AcceptHeaderLocaleResolver实现类中的resolveLocale实现
    public class AcceptHeaderLocaleResolver implements LocaleResolver{
    @Override
    	public Locale resolveLocale(HttpServletRequest request) {
    		Locale defaultLocale = getDefaultLocale();
    		if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
    			return defaultLocale;
    		}
    		Locale requestLocale = request.getLocale();
    		List supportedLocales = getSupportedLocales();
    		if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {
    			return requestLocale;
    		}
    		Locale supportedLocale = findSupportedLocale(request, supportedLocales);
    		if (supportedLocale != null) {
    			return supportedLocale;
    		}
    		return (defaultLocale != null ? defaultLocale : requestLocale);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 自定义国际化组件
    package com.zk.config;
    
    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;
    
    /**
     * @author CNCLUKZK
     * @create 2022/8/2-1:29
     */
    public class MyLocaleResolver implements LocaleResolver {
    
        //自定义地区国际化解析
        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            //获取请求的语言参数
            String l = request.getParameter("l");
            Locale locale = Locale.getDefault(); //如果没有就使用默认的国际化
            //若请求携带了国际化参数
            if (StringUtils.hasText(l)) {
                //国家、地区
                locale = new Locale(l.split("_")[0], l.split("_")[1]);
            }
            return locale;
        }
    
        @Override
        public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 记得将自己写的组件配置到spring容器`@Bean,注意请求地址,注意@Bean的方法名
    • SpringMVC中约定自定义LocaleResolver Bean的名称必须是localeResolver
     /**
          * @Bean相当于beans中的单个的bean标签,注册到容器中
          * 方法名字相当于bean标签的id
          * 方法返回值相当于bean标签的Class属性
          * 返回要注入的bean对象
         * */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    package com.zk.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.LocaleResolver;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    /**
     * @author CNCLUKZK
     * @create 2022/7/31-20:19
     */
    //扩展springmvc
    //如果。你想diy一些定制化的功能,只要写这个组件,然后将它交给springboot,springboot就会帮我们自动装魔!
    //应为类型要求为WebMvcConfigurer,所以我们实现其接口
    //可以使用自定义类扩展springmvc的功能
    @Configuration
    public class MyMvcConfiguration implements WebMvcConfigurer {
    
        //视图跳转
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            //浏览器发送特殊请求,就会跳转到特定页面
            registry.addViewController("/").setViewName("index");
            registry.addViewController("/index").setViewName("index");
            registry.addViewController("/index.html").setViewName("index");
        }
    
        //注册自定义的国际化解析bean
        @Bean
        public LocaleResolver localeResolver(){
            return new MyLocaleResolver();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 然后访问http://127.0.0.1:8081/zk/index.html?l=zh_CN进行测试,中英文效果:
      在这里插入图片描述
      在这里插入图片描述
    • 下一篇:SpringBoot-16-模块开发-首页登陆并权限拦截
  • 相关阅读:
    JavaScript 68 JavaScript Browser BOM 68.7 JavaScript Timing 事件
    鸿蒙服务卡片开发总结
    react 18新特性 了解一下
    Tomcat是如何打破“双亲委派“机制的
    蓝桥杯:后缀表达式
    【软件工程之美 - 专栏笔记】33 | 测试工具:为什么不应该通过QQ/微信/邮件报Bug?
    java-php-python-ssm志愿者网上服务平台的设计与实现计算机毕业设计
    微服务架构转型
    【cf】CodeForces Round 905(Div.3)题解
    【案例】分页符el-pagination
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/126445892