⼀个简单的⽰例在springboot中实现国际化
最近在⽹上了⼀个有关账单管理的spring boot项⽬,其中有⼀部分是涉及显⽰国际化信息的,即将页⾯上的中英⽂进⾏转换。因为在这之前这部分内容没有接触过,所以在这记录下过程。
中⽂效果图如下所⽰:
英⽂效果图如下所⽰:
从上⾯两幅图可以看出在切换中英⽂时有五个部分的内容发送改变。分别是:⽤户名(Username)、密码(Password)、记住我(Remember Me)、登录(Sign)、重置(Rest)。
第⼀部分、先在resources⽬录下新建⼀个i18n⽂件夹,并在该⽂件夹下新建⼀个Resource Bundle.如下图所⽰:
并在跳出的弹框内写⼊以下信息:
点击“OK”后就会在i18n⽬录下⽣成3个后缀名为“.properties”的⽂件。如下所⽰:
第⼆部分、分别在这三个⽂件中填⼊相应信息。
login.properties表⽰默认显⽰的信息。login.password、ber、set、login.submit、login.username是⾃⼰设置的key值,⽤于在HTML中显⽰。后⾯的是将要显⽰的内容。
1 login.password=密码
ber=记住我
set=重置
4 login.submit=登录
5 login.username=⽤户名
login_en_US.properties
1 login.password=Password
ber=Remember Me
set=Rest
4 login.submit=Sign
5 login.username=Username
login_zh_CN.properties
1 login.password=密码
ber=记住我
set=重置
4 login.submit=登录
5 login.username=⽤户名
第三部分、在HTML相应位置填⼊key值,并在点击“中⽂”或“English”发出不同请求信息。
springboot中文
注意:在这个项⽬中使⽤的模板是thymeleaf,因此需要现在开始的html标签内引⼊该模板的标签。
根据thymeleaf的⽂档
显⽰国际化信息时⽤到的“#{}”⽽不是"${}"。
由于这个“记住我”是<input>单标签的没有标签体,根据thymeleaf⽂档发现需要使⽤"[[#{}]]"或“[(#{})]”⾏内表达式。
当点击“中⽂”时附带请求信息“zh_CN”,点击英⽂时附带请求信息“en_US”.
login.html代码如下所⽰:
1<!DOCTYPE html>
2<html xmlns:th="">
3<head lang="en" th:replace="main/public :: #public_head">
4
5</head>
6<body class="login_bg">
7<section class="loginBox">
8<header class="loginHeader">
9<h1>轻⾈万⾥账单管理系统</h1>
10</header>
11<section class="loginCont">
12<!--<div >⽤户名错误!</div>-->
13<form class="loginForm" action="../main/index.html">
14
15<div class="inputbox">
16<label for="user" th:text="#{login.username}">Username</label>
17<input id="user" type="text" name="username"  required/>
18</div>
19<div class="inputbox">
20<label for="mima" th:text="#{login.password}">Password</label>
21<input id="mima" type="password" name="password"  required/>
22</div>
23<div class="subBtn">
24<input type="checkbox"> [[#{ber}]]
25</div>
26<br/>
27<div class="subBtn">
28<input type="submit" th:value="#{login.submit}" value="Sign"/>
29<input type="reset" th:value="#{set}" value="Reset"/>
30</div>
31<br/>
32<div >
33<a href="#" th:href="@{/index.html(l='zh_CN')}">中⽂</a>
34        
35<a href="" th:href="@{/index.html(l='en_US')}">English</a>
36</div>
37</form>
38</section>
39</section>
40</body>
41</html>
login.html
第四部分、设置区域解析器
在页⾯上显⽰中⽂还是英⽂是由请求信息头中“accept-language”的决定的,默认是中⽂。我们只要将点击所附带的请求信息传递给“accept-language”就会使页⾯的中英⽂改变。
spring boot中有⼀个WebMvcAutoConfiguration类,提供了本地区域解析器。如下图所⽰:
该本地区域解析器上有个注解@ConditionalOnMissingBean表⽰如果容器中没有这个bean,就将这个bean放到容器中,如果有就使⽤已经存在的。
从下⾯的代码⽚段中可以看到有⼀个请求头本地区域解析器AcceptHeaderLocaleResolver实现了Local
eResolver接⼝。
因此我们可以在component包下新建⼀个⾃定义区域解析器MyLocaleResolver,该类需要实现接⼝LocaleResolver,重写⽅法,根据请求的参数
构造⼀个Local返回。
1package club.nipengfei.springbootponent;
2
3import org.springframework.web.servlet.LocaleResolver;
4import org.thymeleaf.util.StringUtils;
5
6import javax.servlet.http.HttpServletRequest;
7import javax.servlet.http.HttpServletResponse;
8import java.util.Locale;
9
10/**
11 * ⾃定义区域解析器
12*/
13public class MyLocaleResolver implements LocaleResolver {
14    @Override
15public Locale resolveLocale(HttpServletRequest httpServletRequest) {
16// 获取⾃定义请求头信息
17        String l = Parameter("l");
18// 获取系统默认的区域信息
19        Locale locale = Default();
20if (!StringUtils.isEmpty(l)){
21            String[] split = l.split("_");
22// 接收第⼀个参数为语⾔代码,第⼆个参数为国家代码
23            locale = new Locale(split[0],split[1]);
24        }
25return locale;
26    }
27
28    @Override
29public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
30
31    }
32 }
将其添加到容器中,在config包下新建⼀个MySpringMvcConfigure,在该类的localeResolver⽅法中返回LocaleResolver,注意使⽤注解@Bean。代码如下所⽰:
1package club.fig;
2
3import club.nipengfei.springbootponent.MyLocaleResolver;
4import t.annotation.Bean;
5import t.annotation.Configuration;
6import org.springframework.web.servlet.LocaleResolver;
7import org.springframework.fig.annotation.ViewControllerRegistry;
8import org.springframework.fig.annotation.WebMvcConfigurer;
9
10 @Configuration
11public class MySpringMvcConfigure {
12
13    @Bean
14public WebMvcConfigurer webMvcConfigurer(){
15return new WebMvcConfigurer() {
16
17// 添加视图控制器
18            @Override
19public void addViewControllers(ViewControllerRegistry registry) {
20
21                registry.addViewController("/").setViewName("/main/login");
22                registry.addViewController("/index.html").setViewName("/main/login");
23            }
24        };
25    }
26
27// 区域解析器
28    @Bean
29public LocaleResolver localeResolver(){
30return new MyLocaleResolver();
31    }
32 }
第五部分、在这过程中遇到的问题。
1. 中英⽂显⽰乱码,解决⽅法是修改properties⽂件编码,改为UTF-8。参考:
2. ⽆法访问到login页⾯,因为login.html页⾯在template/main⽬录下。解决⽅法是添加视图控制器。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。