springboot使⽤i18n进⾏国际化
1、i18n介绍
  i18n(其来源是英⽂单词 internationalization的⾸末字符i和n,18为中间的字符数)是“国际化”的简称。在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)⽆需做⼤的改变就能够适应不同的语⾔和地区的需要。对程序来说,在不修改内部代码的情况下,能根据不同语⾔及地区显⽰相应的界⾯。
2、页⾯元素国际化:
  pom⽂件引⼊thymeleaf依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  新增⼀个html⽂件hello.html:
<!DOCTYPE html>
<html xmlns="/1999/xhtml"
xmlns:th=""
<head>
<title>hello</title>
</head>
<body>
<span>
<label th:text="#{welcome}"></label>
</span>
</body>
</html>
  SpringBoot 默认⽀持国际化的,在resources/下定义国际化⽂件,名称必须以messages开头,因为 MessageSourceAutoConfiguration 类中指定了前缀。
messages.properties
welcome = 欢迎使⽤i18n(默认)
messages_zh_CN.properties
welcome = 欢迎使⽤i18n(中⽂)
messages_en_US.properties
welcome = welcome to use i18n(english)
  访问接⼝
@Controller
public class HelloController {
@RequestMapping(value = "hello")
public String hello() {
return "hello";
}
}
3、修改默认messages配置前缀
  上⾯使⽤的是messages默认的配置,即直接放在resources/⽬录下,⼀般项⽬中会使⽤⾃⼰的⽬录存放,如放在resources/i18n/⽬录下
  在application配置中添加
#i18n
spring:
messages:
encoding: UTF-8
basename: i18n/messages
  加好之后重新访问即可
4、代码中使⽤国际化
  //注⼊ MessageSource 对象,通过 getMessage ⽅法获取信息
@Autowired
private MessageSource messageSource;
//使⽤
说明:第⼀个参数是国际化⽂件的key,第⼆个参数是key对应value中的占位符数据(如welcome=欢迎使⽤{0}中的{0}就是占位符,0表⽰是第⼀个,对应数据中的第⼀个值),第三个是当前区域
5、会话区域解析器SessionLocaleResolver
 注⼊ Bean
//注⼊ Bean,会话区域解析器只针对当前会话有效
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
//设置默认区域,
slr.setDefaultLocale(Locale.ENGLISH);
return slr;
}
  接⼝控制器:
  @RequestMapping("/i18n")
public String changeSessionLanauage(HttpServletRequest request, String lang){
System.out.println(lang);
if(CommonConsts.LANG_ZH.equals(lang)){
//代码中即可通过以下⽅法进⾏语⾔设置
}else if(CommonConsts.LANG_EN.equals(lang)){
}
return "redirect:/hello";
}
其中Session().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("zh","CN"));⽤于切换当前会话区域
  前端页⾯hello.html修改:
<!DOCTYPE html>
<html xmlns="/1999/xhtml"
xmlns:th="">
<head>
<title>hello</title>
<script th:src="@{js/jquery.min.js}"></script>
<script th:src="@{js/hello.js}"></script>
</head>
<body>
<p><label th:text="#{welcome}"></label></p><br/>
<span th:text="#{lang}"></span>
<select id="locales">
<option value=""></option>
<option value="zh" th:text="zh"></option>
<option value="en" th:text="en"></option>
</select>
</body>
</html>
  hello.js⽂件
$(function () {
$("#locales").change(function() {
var lang = $("#locales").val();
if (lang != "") {
place("/i18n?lang=" + lang);
}
});
});
  需要同时作⽤于Cookie时,修改接⼝控制器:
@RequestMapping("/i18n2")
public String changeSessionLanauage2(HttpServletRequest request, HttpServletResponse response, String lang){
LocaleResolver localeResolver = LocaleResolver(request);
if(CommonConsts.LANG_ZH.equals(lang)){
localeResolver.setLocale(request, response, new Locale("zh","CN"));
}else if(CommonConsts.LANG_EN.equals(lang)){
localeResolver.setLocale(request, response, new Locale("en","US"));
}
return"redirect:/hello";
}
6、使⽤参数进⾏语⾔切换
使⽤来拦截请求接⼝中的参数来实现语⾔切换
  注⼊区域切换拦截bean
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();     //对请求路径中的参数lang进⾏拦截
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
  hello.html添加修改:
点击切换语⾔:
<a href="/hello?lang=zh_CN">简体中⽂</a>  
<a href="/hello?lang=en_US">English(US)</a><br>
thymeleaf用法项⽬启动后点击链接测试效果即可
7、访问乱码问题解决

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