SpringBoot国际化实现及配置⽂件路径设置避坑指南Spring Boot国际化配置过程
Spring MVC中提供了MessageSource国际化消息源机制,其主要作⽤为装载国际化消息。这⾥⼀般使⽤JDK的ResourceBundleMessageSource进⾏处理,在设置国际化时,这⾥⽆需配置。
Spring Boot中默认使⽤的国际化配置⽂件为messages.properties,该⽂件在开启国际化时必须创建,否则Spring MVC将不启⽤国际化消息机制。但该⽂件的名称可以进⾏⾃定义(后续会说明)。此外,中⽂配置⽂件和英⽂配置⽂件名如下:
messages_zh_CN.properties
messages_en_US.properties
Spring MVC中提供的国际化解析器(⽤于解析⽤户使⽤的国际区域是哪⾥)包含如下⼏个:
1. AcceptHeaderLocaleResolver:根据浏览器的请求头来确定国际化区域
2. FixedLocaleResolver:设置固定的国际化区域
3. CookieLocaleResolver:使⽤cookie设置国际化区域
4. SessionLocaleResolver :使⽤session设置国际化区域
当使⽤AcceptHeaderLocaleResolver或FixedLocaleResolver来实现国际化的时候,只需要在application.properties配置⽂件中进⾏如下的相关设置,既可以实现国际化,⽆需其他的开发⼯作:
# 指定国际化区域,可以覆盖Accept-Language请求头信息
spring.mvc.locale=
# 国际化解析器,可以选择fixed或accpet-header
# fixed代表固定的国际化区域,accept-header表⽰读取浏览器的Accept-Language请求头信息
spring.mvc.locale-resolver=accept-header
使⽤SessionLocaleResolver实现国际化
当使⽤session和cookie来实现国际化时⽐较类似,这⾥以session为例实现国际化。
1. 配置国际化消息
在application.properties配置⽂件中进⾏如下配置:
# Spring MVC国际化配置
# 设置⽂件编码
# 国际化⽂件基础名称
# 国际化消息缓存有效时间(单位为秒),超时将重新载⼊
划重点,其中ssages.basename配置项即为指定国际化配置⽂件所在的⽬录和名称,即不再使⽤默认的messages名称,⽽是使⽤international,因此相应的配置⽂件的前缀应该为international。
关于该项配置的避坑指南:例如这⾥仅设置为international,则国际化相应的配置⽂件必须在src/main/resources⽬录下(注意:不能再该⽬录的⼦⽬录下)。但如果你想把国际化的相关配置⽂件放在resources⽬录下的某个⼦⽬录下,例如放在如下⼦⽬录:
则需要修改上⾯的basename的配置为:
# 国际化⽂件基础名称
也就是basename配置的其实为国际化配置⽂件所在的⽬录和⽂件名前缀。如果上述设置出错,则会产⽣如下的错误提⽰:
springboot t.NoSuchMessageException: No message found under code 'msg' for locale 'zh_CN'.
正确完成以上配置⽂件basename的设置后,开始配置如下的三个国际化配置⽂件:
# properties/international.properties
# 中⽂:Spring MVC国际化
msg=Spring MVC\u56fd\u9645\u5316
properties/international_en_US.properties
# 英⽂Spring MVC internationalization
msg=Spring MVC internationalization
properties/international_zh_CN.properties
# 中⽂:Spring MVC国际化
msg=Spring MVC\u56fd\u9645\u5316
这样,Spring MVC就会读⼊这些配置的国际化信息。
2. 创建国际化解析器
这⾥使⽤Spring MVC 提供的LocaleChangeInterceptor,它可以在处理器前执⾏相关的逻辑,也就是的preHandle⽅法的作⽤。这个可以设置⼀个拦截的国际化参数,通过这个参数确定需要使⽤的国际化区域和相关信息,并将国际化信息保持到session 中。该的实现如下:
public class MyWebMvcConfiguration implements WebMvcConfigurer {
/**
* 国际化参数
*/
private LocaleChangeInterceptor localeChangeInterceptor;
/**
* 注册⾃定义⽅法
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册国际化参数
/
/ 这⾥将通过国家化的preHandle⽅法对请求的国际化区域参数进⾏修改
registry.addInterceptor(localeChangeInterceptor());
}
/**
* 国际化解析器BEAN,注意这个Bean的名称必须为localeResolver
*/
@Bean(name = "localeResolver")
public LocaleResolver initLocaleResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver(); // 设置默认的国际化区域
sessionLocaleResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return sessionLocaleResolver;
}
/**
* 给处理器添加国际化参数
* 拦截的参数名称为:language
*/
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
if (localeChangeInterceptor != null) {
return localeChangeInterceptor;
}
localeChangeInterceptor = new LocaleChangeInterceptor();
/
/ 设置拦截的参数名
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}
}
3. 实现国际化控制器和视图页⾯
上述过程已经完成了国际化的内容,下⾯创建⼀个controller来进⾏测试:
@RequestMapping("/international")
public class InternationalController {
/**
* 注⼊国际化消息接⼝对象
*/
@Autowired
private MessageSource messageSource;
/**
* 获取国际化信息和打开国际化视图
*/
@RequestMapping("/page")
public String page(HttpServletRequest request) {
// 后台获取国际化区域
Locale locale = Locale();
// 获取国际化配置⽂件中设置的国际化消息,使⽤msg标志进⾏寻
String msg = Message("msg", null, locale);
System.out.println("msg=" + msg);
// 返回国际化视图
return "international";
}
}
相应的国际化视图页⾯使⽤JSP实现,如下:
<%@ taglib prefix="c" uri="java.sun/jsp/jstl/core" %>
<%@taglib prefix="mvc" uri="/tags/form" %>
<%@taglib prefix="spring" uri="/tags" %>
<%--
Created by IntelliJ IDEA.
User: yitian
Date: 2020-01-29
Time: 20:40
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>session如何设置和读取
<head>
<title>Spring MVC international</title>
<link rel="stylesheet" type="text/css" href="/static/jquery-easyui-1.7.0/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="/static/jquery-easyui-1.7.0/themes/icon.css">
<script type="text/javascript" src="/static/jquery-easyui-1.7.0/jquery.min.js"></script>
<script type="text/javascript" src="/static/jquery-easyui-1.7.0/jquery.easyui.min.js"></script>
<script src="code.jquery/jquery-3.2.0.js"></script>
<script type="text/javascript">
</script>
</head>
<body>
通过HTTP请求改变国际化:<br>
<a href="./page?language=zh_CN">简体中⽂</a>
<a href="./page?language=en_US">美国英⽂</a>
<h2><spring:message code="msg" /></h2> <br>
当前的国际化区域Locale为: ${sponse.locale}
<div><a href="localhost:8080/web/index">返回⾸页</a></div>
</body>
</html>
运⾏项⽬,得到的international.jsp页⾯如下:(左侧页⾯为默认的中⽂页⾯,或者点击“简体中⽂”链接,右侧页⾯为点击“美国英⽂”得到的国际化页⾯)。
根据上图可以看到,视图的国际化已经可以通过language参数进⾏切换,但需要注意的是,此时国际化参数已经保存到session中,所以即使没有这个参数,也会从session中读取该参数设置国际化区域,⽽当3600秒后session才会失效。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论