SpringBoot国际化配置

  1. 在resource文件下添加如下文件

    image-20200809212446000
  2. 在login.properties文件下添加键值对

    image-20200809212549270
  3. 因为国际化的相关类对应的properties对应的文件中

    image-20200809212721156

    basename是国际化配置文件的真实位置

    所以在application.properties配置

    spring.messages.basename=i18n.login
    
  4. 编写页面

    注意点 国际化的值需要使用#{}

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>登录</title>
    </head>
    <body>
        <h1 th:text="#{login.tip}"></h1>
        <form method="post">
            <input type="text" th:placeholder="#{login.username}" name="username"><br>
            <input type="password" th:placeholder="#{login.password}" name="password"><br>
            <button type="submit">[[#{login.btn}]]</button><br>
            <a th:href="@{/login.html(l='zh_CN')}">中文</a>
            <a th:href="@{/login.html(l='en_US')}">English</a>
        </form>
    </body>
    </html>
    
  5. 配置解析器

    1.原理

    在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<Locale> 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,可以在链接上携带区域信息!

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

    <a th:href="@{/login.html(l='zh_CN')}">中文</a>
    <a th:href="@{/login.html(l='en_US')}">English</a>
    
    1. 编写MyLocalResolver

      public class MyLocalResolver implements LocaleResolver {
          @Override
          public Locale resolveLocale(HttpServletRequest request) {
            	//获取参数值以此来获取国家和地区值
              String language = request.getParameter("l");
      
           		//获取默认的国家和地区信息
              Locale locale = Locale.getDefault();
      
              if(!StringUtils.isEmpty(language))
              {
                  String[] array = language.split("_");
                	//封装成locale
                  locale = new Locale(array[0],array[1]);
              }
      
              return locale;
          }
      
          @Override
          public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
      
          }
      }
      
    2. 注册到Config中

      @Configuration
      //@EnableWebMvc
      public class MyMvcConfig implements WebMvcConfigurer {
          @Override
          public void addViewControllers(ViewControllerRegistry registry) {
      
          }
      
          @Bean
          public LocaleResolver localeResolver()
          {
              return new MyLocalResolver();
          }
      
      }
      
  6. 配置Controller,映射地址

    @RequestMapping({"login","login.html"})
    public String international()
    {
        return "login";
    }
    
  7. 测试

    image-20200809213724105 image-20200809213750939
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值