【SpringBoot】国际化配置

简介: 【SpringBoot】国际化配置

1.SpringBoot 中 localeResolver 的实现原理

WebMvcAutoConfiguration 类中

1、WebMvcAutoConfiguration 是SpringBoot中的 Web方面的自动配置类。
2、当用户没有创建自己的 localeResolver
时,这个配置方法就会生效,从而产生一个localeResolver。(配置自己的localeResolver时,Bean名必须为localeResolver)。
3、spring.web.locale-resolver、spring.mvc.locale-resolver
的配置属性都有两个值可供选择。(fixed、accept_header)。
4、选择属性值 fixed,表示 Locale 区域对象是 固定的。
5、当属性值为fixed,应该搭配spring.web.locale、spring.mvc.locale 这两个配置属性一起使用,给出固定的Locale
区域对象。
6、假如属性值为fixed,又没有搭配上面两个属性之一,则因为上面两个属性没有默认值,则Locale
区域对象将会使用运行主机的默认语言环境生成一个Locale 区域对象。
6、从以下的方法的执行流程可以看出,spring.web.locale-resolver 优先级比 spring.mvc.locale-resolver
高一些。
7、因为spring.web.locale-resolver、spring.mvc.locale-resolver 它们的 默认值 都为
accept_header
,所以,只要不更改配置,默认就不是固定的Locale 区域对象。就会继续执行最下面的部分。

8、此时spring.web.locale、spring.mvc.locale
这两个配置属性,假如存在,就会成为AcceptHeaderLocaleResolver 的默认的Locale 区域对象。
并在请求响应的请求头中没有Accept-Language这个属性时,成为AcceptHeaderLocaleResolver返回的Locale 区域对象。

 @Bean
        @ConditionalOnMissingBean(
            name = {"localeResolver"}            //假如SpringBoot中没有这个 localeResolver Bean,就加载这个自动配置Bean
        )
        public LocaleResolver localeResolver() {
        //假如配置文件中有 spring.web.locale-resolver=fixed,就表示是固定的 Locale 配置
        //(这个属性默认值为 ACCEPT_HEADER,WebProperties 类中)
            if (this.webProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.WebProperties.LocaleResolver.FIXED) {  
                return new FixedLocaleResolver(this.webProperties.getLocale());
         //假如配置文件中有 spring.mvc.locale-resolver=fixed,就表示是固定的 Locale 配置
        //(这个属性默认值为 ACCEPT_HEADER,WebMvcProperties 类中)        
            } else if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
                return new FixedLocaleResolver(this.mvcProperties.getLocale());
            } else {
                //使用请求对象的请求头中的Accept-Language属性来生成Locale 
                AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
                Locale locale = this.webProperties.getLocale() != null ? this.webProperties.getLocale() : this.mvcProperties.getLocale();
                localeResolver.setDefaultLocale(locale);
                return localeResolver;
            }
        }

FixedLocaleResolver 类中的resolveLocale 方法

   public Locale resolveLocale(HttpServletRequest request) {
        Locale locale = this.getDefaultLocale();  //获取默认的配置的 Locale 
        if (locale == null) {
            locale = Locale.getDefault();       //根据主机的语言环境生成一个 Locale 
        }
        return locale;
    }

AcceptHeaderLocaleResolver 类中的resolveLocale方法

  public Locale resolveLocale(HttpServletRequest request) {
        Locale defaultLocale = this.getDefaultLocale();     //获取默认的配置的 Locale 
        if (defaultLocale != null && request.getHeader("Accept-Language") == null) { //默认配置的Locale 不为空,且请求头中没有Accept-Language 属性
            return defaultLocale;
        } else {
            Locale requestLocale = request.getLocale();      //根据 Accept-Language 标头,返回客户端将接受内容的首选。如果客户端请求未提供 Accept-Language 标头,则此方法返回服务器的默认语言环境 
            List<Locale> supportedLocales = this.getSupportedLocales();  //获取支持的Locale 队列
            if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) { //Locale 不为空,且不包含请求对象中获取的Locale 
                Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);
                if (supportedLocale != null) {
                    return supportedLocale;
                } else {
                    return defaultLocale != null ? defaultLocale : requestLocale;
                }
            } else {
                return requestLocale;
            }
        }
    }

2.两种国际化方式

1.什么都不用配置,使用默认的 LocaleResolver 的实现逻辑

从上面的AcceptHeaderLocaleResolver 方法,返回的LocaleResolver
的逻辑可知,我们最终会得到AcceptHeaderLocaleResolver,这样根据请求对象中的请求头中的Accept-
Language属性,来返回Locale 区域对象的 LocaleResolver 。

2.使用自己创建的 LocaleResolver 来创建自己的逻辑,去实现国际化

实现逻辑

逻辑为:我们将根据请求中的 lang参数,进而形成不同区域的
Locale对象,来判断页面中的数据,究竟是显示(zh_CN)中文还是(en_US)英文。

3.具体实现步骤

新建一个名叫“i18n”的包,我们用来存放国际化配置,然后在这个包下,我们再创建几个properties的配置文件(文件名语言区域.properties),用来配置语言:

点击login_en_US.properties 的配置文件,然后点击下边如图所示的Resource Bundle按钮

注:新版IDEA可能需要安装Resource Bundle Editor插件才可以使用Resource Bundle按钮

接下来填写相应的配置,添加login.tip 并将个文件中对应的tip内容填写完整

使用ResourceBundleMessageSource管理国际化资源文件

在 application.properties (也可以是application.yaml)中添加如下代码

spring:
  messages:
    basename: i18n.login

thymeleaf中获取property的内容语法:

Message Expressions: #{...}

<!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>Login</title>
</head>

<body class="text-center">
<form class="form-signin" action="dashboard.html">
    <h1 th:text="#{login.tip}"  class="h3 mb-3 font-weight-normal">Please sign in</h1>
    <input type="text" class="form-control" th:placeholder="#{login.username}" required="" autofocus="">
    <input type="password" class="form-control" th:placeholder="#{login.password}" required="">
    <div class="checkbox mb-3">
        <input  type="checkbox" value="remember-me"> [[#{login.remeber}]]
    </div>
    <button class="btn btn-lg btn-primary btn-block" type="submit">[[#{login.btn} ]]</button>
    <p class="mt-5 mb-3 text-muted">© 2017-2018</p>
    <a class="btn btn-sm" th:href="@{/index(l='zh_CN')}">中文</a>
    <a class="btn btn-sm" th:href="@{/index(l='en_US')}">English</a>
</form>

</body>

</html>

注意 :input输入框不能使用th:text取值,text是标签里面的内容,input输入框是字节数,没有标签体

可使用thymleaf行内表达式,双括号添加表达式

<p>Hello, [[${session.user.name}]]!</p>

可能会出现乱码问题,需要在settings->Editor->File Encodings->将properties的编码格式改成utf-8

实现自定义LocaleResolver

/**
 * @Description: 可以在链接上面携带区域信息
 * @Author: zhangxy
 *
 */
public class MyLocaleResolver implements LocaleResolver {

    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String l = httpServletRequest.getParameter("l");
        // 获取系统默认的
        Locale locale = Locale.getDefault();
        // 如果参数带了区域信息,则使用参数的
        if (!StringUtils.isEmpty(l)) {
            String[] s = l.split("_");
            locale = new Locale(s[0], s[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                          Locale locale) {

    }

}

然后向mvc配置类中注入LocaleResolver

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    //这个方法是用来实现页面跳转控制的 就比如你@RequestMapping("/") 然后方法返回的就是setviewname的值
    //这里配置后就不用再去@Controller实现跳转了
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
        registry.addViewController("/index").setViewName("index");
    }

    @Bean
    public LocaleResolver localeResolver() {
        return new MyLocaleResolver();
    }
}

展示:

目录
相关文章
|
1月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
6天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
21 4
|
11天前
|
Java 数据库连接 Maven
springBoot:项目建立&配置修改&yaml的使用&resource 文件夹(二)
本文档介绍了如何创建一个基于Maven的项目,并配置阿里云仓库、数据库连接、端口号、自定义启动横幅及多环境配置等。同时,详细说明了如何使用YAML格式进行配置,以及如何处理静态资源和模板文件。文档还涵盖了Spring Boot项目的`application.properties`和`application.yaml`文件的配置方法,包括设置数据库驱动、URL、用户名、密码等关键信息,以及如何通过配置文件管理不同环境下的应用设置。
|
3天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
9 0
|
2天前
|
druid Java Maven
|
14天前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
47 2
|
18天前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
37 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
9天前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
44 0
|
11天前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。
|
11天前
|
NoSQL Java 数据库连接
springBoot:整合其他框架&condition&切换web配置 (五)
本文档介绍了如何在Spring Boot项目中整合JUnit、Redis和MyBatis等框架,并提供了相应的依赖配置示例。同时,还展示了如何通过条件注解实现Bean的条件创建,以及如何切换Web服务器配置,从默认的Tomcat切换到Jetty。