【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;
            }
        }
AI 代码解读

FixedLocaleResolver 类中的resolveLocale 方法

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

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;
            }
        }
    }
AI 代码解读

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
AI 代码解读

thymeleaf中获取property的内容语法:

Message Expressions: #{...}
AI 代码解读

<!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>
AI 代码解读

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

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

<p>Hello, [[${session.user.name}]]!</p>
AI 代码解读

可能会出现乱码问题,需要在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) {

    }

}
AI 代码解读

然后向mvc配置类中注入LocaleResolver

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
AI 代码解读

    //这个方法是用来实现页面跳转控制的 就比如你@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();
    }
}
AI 代码解读

展示:

目录
打赏
0
0
0
0
6
分享
相关文章
|
4月前
|
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
136 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
189 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
65 0
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
237 0
springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
通过本文,我们详细介绍了如何在 Spring Cloud 和 Spring Boot 中集成 Nacos 进行服务注册和配置管理,并对 Nacos 的源码进行了初步分析。Nacos 作为一个强大的服务注册和配置管理平台,为微服务架构提供
1166 14
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
204 12
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
201 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——依赖导入和Thymeleaf相关配置
在Spring Boot中使用Thymeleaf模板,需引入依赖`spring-boot-starter-thymeleaf`,并在HTML页面标签中声明`xmlns:th=&quot;http://www.thymeleaf.org&quot;`。此外,Thymeleaf默认开启页面缓存,开发时建议关闭缓存以实时查看更新效果,配置方式为`spring.thymeleaf.cache: false`。这可避免因缓存导致页面未及时刷新的问题。
100 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
111 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
63 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问