一个简单的示例在spring boot中实现国际化

简介: 一个简单的示例在spring boot中实现国际化

最近在网上找了一个有关账单管理的spring boot项目,其中有一部分是涉及显示国际化信息的,即将页面上的中英文进行转换。因为在这之前这部分内容没有接触过,所以在这记录下过程。

中文效果图如下所示:

英文效果图如下所示:

从上面两幅图可以看出在切换中英文时有五个部分的内容发送改变。分别是:用户名(Username)、密码(Password)、记住我(Remember Me)、登录(Sign)、重置(Rest)。

第一部分、先在resources目录下新建一个i18n文件夹,并在该文件夹下新建一个Resource Bundle.如下图所示:

并在跳出的弹框内写入以下信息:

点击“OK”后就会在i18n目录下生成3个后缀名为“.properties”的文件。如下所示:

第二部分、分别在这三个文件中填入相应信息。

login.properties表示默认显示的信息。login.password、login.remember、login.reset、login.submit、login.username是自己设置的key值,用于在HTML中显示。后面的是将要显示的内容。

1 login.password=密码

2 login.remember=记住我

3 login.reset=重置

4 login.submit=登录

5 login.username=用户名

login_en_US.properties

1 login.password=Password

2 login.remember=Remember Me

3 login.reset=Rest

4 login.submit=Sign

5 login.username=Username

login_zh_CN.properties

1 login.password=密码

2 login.remember=记住我

3 login.reset=重置

4 login.submit=登录

5 login.username=用户名

第三部分、在HTML相应位置填入key值,并在点击“中文”或“English”发出不同请求信息。

注意:在这个项目中使用的模板是thymeleaf,因此需要现在开始的html标签内引入该模板的标签。

根据thymeleaf的文档

显示国际化信息时用到的“#{}”而不是"${}"。

由于这个“记住我”是单标签的没有标签体,根据thymeleaf文档发现需要使用"[[#{}]]"或“[(#{})]”行内表达式。

当点击“中文”时附带请求信息“zh_CN”,点击英文时附带请求信息“en_US”.

login.html代码如下所示:

 DOCTYPE html>
  <html xmlns:th="http://www.thymeleaf.org">
  <head lang="en" th:replace="main/public :: #public_head">
 
  head>
  <body class="login_bg">
      <section class="loginBox">
          <header class="loginHeader">
              <h1>轻舟万里账单管理系统h1>
         header>
         <section class="loginCont">
             
             <form class="loginForm" action="../main/index.html">
                 
                <div class="inputbox">
                     <label for="user" th:text="#{login.username}">Usernamelabel>
                     <input id="user" type="text" name="username"  required/>
                div>
                 <div class="inputbox">
                     <label for="mima" th:text="#{login.password}">Passwordlabel>
                     <input id="mima" type="password" name="password"  required/>
                 div>
                 <div class="subBtn">
                         <input type="checkbox"> [[#{login.remember}]]
                 div>
                 <br/>
                 <div class="subBtn">
                     <input type="submit" th:value="#{login.submit}" value="Sign" />
                     <input type="reset" th:value="#{login.reset}" value="Reset"/>
                 div>
                 <br/>
                 <div style="margin-left: 100px;">
                     <a href="#" th:href="@{/index.html(l='zh_CN')}">中文a>
                            
                    <a href="" th:href="@{/index.html(l='en_US')}">Englisha>
                 div>
            form>
         section>
     section>
 body>
 html>
login.html

第四部分、设置区域解析器

在页面上显示中文还是英文是由请求信息头中“accept-language”的决定的,默认是中文。我们只要将点击所附带的请求信息传递给“accept-language”就会使页面的中英文改变。

spring boot中有一个WebMvcAutoConfiguration类,提供了本地区域解析器。如下图所示:

该本地区域解析器上有个注解@ConditionalOnMissingBean表示如果容器中没有这个bean,就将这个bean放到容器中,如果有就使用已经存在的。

从下面的代码片段中可以看到有一个请求头本地区域解析器AcceptHeaderLocaleResolver实现了LocaleResolver接口。

因此我们可以在component包下新建一个自定义区域解析器MyLocaleResolver,该类需要实现接口LocaleResolver,重写方法,根据请求的参数构造一个Local返回。

package club.nipengfei.springboot.component;
 
  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 httpServletRequest) {
         // 获取自定义请求头信息
         String l = httpServletRequest.getParameter("l");
        // 获取系统默认的区域信息
         Locale locale = Locale.getDefault();
         if (!StringUtils.isEmpty(l)){
             String[] split = l.split("_");
             // 接收第一个参数为语言代码,第二个参数为国家代码
             locale = new Locale(split[0],split[1]);
         }
         return locale;
     }

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

     }
 }

将其添加到容器中,在config包下新建一个MySpringMvcConfigure,在该类的localeResolver方法中返回LocaleResolver,注意使用注解@Bean。代码如下所示:

 package club.nipengfei.springboot.config;
 
  import club.nipengfei.springboot.component.MyLocaleResolver;
  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 MySpringMvcConfigure {

     @Bean
     public WebMvcConfigurer webMvcConfigurer(){
         return new WebMvcConfigurer() {

             // 添加视图控制器
             @Override
             public void addViewControllers(ViewControllerRegistry registry) {

                 registry.addViewController("/").setViewName("/main/login");
                 registry.addViewController("/index.html").setViewName("/main/login");
             }
         };
     }

     // 区域解析器
     @Bean
     public LocaleResolver localeResolver(){
         return new MyLocaleResolver();
     }
 }

第五部分、在这过程中遇到的问题。

  1. 中英文显示乱码,解决方法是修改properties文件编码,改为UTF-8。参考:解决 IntelliJ IDEA 中 i18n国际化 中文乱码问题。
  2. 无法访问到login页面,因为login.html页面在template/main目录下。解决方法是添加视图控制器。
相关文章
|
4月前
|
缓存 NoSQL Java
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
|
1月前
|
前端开发 Java Spring
SpringBoot项目thymeleaf页面支持词条国际化切换
SpringBoot项目thymeleaf页面支持词条国际化切换
76 2
|
2月前
|
安全 Java 编译器
springboot 整合表达式计算引擎 Aviator 使用示例详解
本文详细介绍了Google Aviator 这款高性能、轻量级的 Java 表达式求值引擎
255 6
|
3月前
|
Java 测试技术 数据库
Spring事务传播机制(最全示例)
在使用Spring框架进行开发时,`service`层的方法通常带有事务。本文详细探讨了Spring事务在多个方法间的传播机制,主要包括7种传播类型:`REQUIRED`、`SUPPORTS`、`MANDATORY`、`REQUIRES_NEW`、`NOT_SUPPORTED`、`NEVER` 和 `NESTED`。通过示例代码和数据库插入测试,逐一展示了每种类型的运作方式。例如,`REQUIRED`表示如果当前存在事务则加入该事务,否则创建新事务;`SUPPORTS`表示如果当前存在事务则加入,否则以非事务方式执行;`MANDATORY`表示必须在现有事务中运行,否则抛出异常;
184 4
Spring事务传播机制(最全示例)
|
4月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
50 0
|
6月前
|
安全 Java 测试技术
Spring Security应用中的部分代码示例2
【6月更文挑战第12天】Spring Security应用中的部分代码示例2
50 5
|
6月前
|
安全 Java 数据库
Spring Security应用代码示例
【6月更文挑战第12天】Spring Security应用代码示例
48 3
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的北工国际健身俱乐部的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的北工国际健身俱乐部的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
存储 Java UED
Spring Boot中的国际化处理
Spring Boot中的国际化处理
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的北工国际健身俱乐部附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的北工国际健身俱乐部附带文章源码部署视频讲解等
26 0