• boot页面国际化


    准备工作

    先在IDEA中统一设置properties的编码问题!

     此处我设置的是GBK,不过别人设置的都是UTF-8

    配置文件的编写

    1、我们在resources资源文件下新建一个i18n目录,存放国际化配置文件

    2、建立一个login.properties文件,还有一个login_zh_CN.properties;发现IDEA自动识别了我们要做国际化操作;文件夹变了!

     快捷方式:

     3.配置文件内容

    login.properties :默认

    login.btn=登录
    login.password=密码
    login.remember=记住我
    login.tip=请登录
    login.username=用户名

    login_en_US.properties: 英文

    login.btn=Sign in
    login.password=Password
    login.remember=Remember me
    login.tip=Please sign in
    login.username=Username

    login_zh_CN.properties: 中文

    login.btn=登录
    login.password=密码
    login.remember=记住我
    login.tip=请登录
    login.username=用户名

    配置文件生效探究

    我们去看一下SpringBoot对国际化的自动配置!这里又涉及到一个类:MessageSourceAutoConfiguration

    里面有一个方法,这里发现SpringBoot已经自动配置好了管理我们国际化资源文件的组件 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; }

    我们真实 的情况是放在了i18n目录下,所以我们要去配置这个messages的路径;

    在application.yaml中设置

    spring:
      # 我们的配置文件的真实位置
      messages:
        basename: i18n/login
        # 设置编码
        encoding: GBK 

    配置页面国际化

    index.html代码:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
            <meta name="description" content="">
            <meta name="author" content="">
            <title>Signin Template for Bootstrap</title>
            <!-- Bootstrap core CSS -->
            <link th:href="@{/asserts/css/bootstrap.min.css}" rel="stylesheet">
            <!-- Custom styles for this template -->
            <link th:href="@{/asserts/css/signin.css}" rel="stylesheet">
        </head>
    
        <body class="text-center">
            <form class="form-signin" action="dashboard.html">
                <img class="mb-4" th:src="@{/asserts/img/bootstrap-solid.svg}" alt="" width="72" height="72">
                <h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>
                <label class="sr-only">Username</label>
                <input type="text" class="form-control" th:placeholder="#{login.username}" required="" autofocus="">
                <label class="sr-only">Password</label>
                <input type="password" class="form-control" th:placeholder="#{login.password}" required="">
                <div class="checkbox mb-3">
                    <label>
              <input type="checkbox" value="remember-me"> [[#{login.remember}]]
            </label>
                </div>
                <button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.btn}">Sign in</button>
                <p class="mt-5 mb-3 text-muted">© 2017-2018</p>
                <a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
                <a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
            </form>
    
        </body>
    
    </html>

    配置国际化解析

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

    WebMvcAutoConfiguration 这个类中,看到SpringBoot默认配置:

            @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; }

    AcceptHeaderLocaleResolver 这个类中有一个方法

      @Override
        public Locale resolveLocale(HttpServletRequest request) {
            Locale defaultLocale = getDefaultLocale();
         //默认的就是根据请求头带来的区域信息获取Locale进行国际化
    if (defaultLocale != null && request.getHeader("Accept-Language") == null) { return defaultLocale; } Locale requestLocale = request.getLocale(); List<Locale> 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); }

    那假如我们现在想点击链接让我们的国际化资源生效,就需要让我们自己的Locale生效!

    我们去自己写一个自己的LocaleResolver,可以在链接上携带区域信息!

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

    <a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
    <a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>

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

    package com.kuang.config;
    
    import org.springframework.web.servlet.LocaleResolver;
    import org.thymeleaf.util.StringUtils;
    
    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)) {
                //zh_CN
                String[] split = language.split("_");
                //语言,国家
                locale = new Locale(split[0], split[1]);
            }
            return locale;
        }
    
        @Override
        public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
    
        }
    }

    为了让我们的区域化信息能够生效,我们需要再配置一下这个组件!在我们自己的MvcConofig下添加bean;

    package com.kuang.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.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
        //配置首页访问地址
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("index");
            registry.addViewController("/index.html").setViewName("index");
        }
    
        //自定义的国际化组件就生效啦
        @Bean
        public LocaleResolver localeResolver() {
            return new MyLocaleResolver();
        }
    }

    效果图:

     

     原文:https://mp.weixin.qq.com/s?__biz=Mzg2NTAzMTExNg==&mid=2247483834&idx=1&sn=e28706bf0c3ded1884452adf6630d43b&scene=19#wechat_redirect

    努力向狂神学习,加油!

  • 相关阅读:
    Linux C编程之二十一 Linux高并发web服务器开发
    Linux C编程之二十 xml-json
    Linux C编程之十九(2) libevent
    Linux C编程之十九(1) libevent基本概念
    Linux C编程之八 文件操作相关函数
    Linux C编程之七(2) 系统IO函数
    Linux C编程之六 makefile项目管理
    Linux C编程之四 动态库(共享库)的制作
    Linux C编程之五 gdb调试
    .net core 3.1 mvc string接收为null解决方案
  • 原文地址:https://www.cnblogs.com/LEPENGYANG/p/15622451.html
Copyright © 2020-2023  润新知