1、国际化默认的自动装配配置(基本原理介绍)
国际化涉及对象: Locale
(区域信息对象) 、LocaleResolve
(获取区域信息对象) ;
在 WebMvcAutoConfiguration
类中 LocaleResolver
方法:
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
public LocaleResolver localeResolver() {
//判断是否指定哪个语言
if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED){
//使用指定语言
return new FixedLocaleResolver(this.mvcProperties.getLocale());
}
//根据浏览器的请求头信息来匹配语言(没有配置该语言会使用默认语言)
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
return localeResolver;
}
结论: 默认SpringBoot (底层是springMvc实现) 只会根据浏览器的语言选对应的语言,没有则使用默认语言,这样做以来无法实现用户的对语言的自由切换;
2、实现超链接自由切换语言
- 编写国际化配置文件:
- 使用ResourceBundleMessageSource管理国际化资源文件
- 在页面使用
fmt:message
取出国际化的内容
实现步骤:
- 编写国际化配置文件,抽取页面要显示的国际化消息;
-
SpringBoot已经自动配置好了管理国际化资源文件的组件,直接使用即可;
-
(推荐)在springBoot中指定自定义的国际化配置 文件夹+基础名
(基础名就是只留配置文件名的开头,不需要国家的代码和文件类型);
-
spring: messages: basename: i18m.login
-
-
(不推荐)我们的国际化配置也可以直接配在类路径下 message.properties
-
-
编写根据超链接切换语言的组件(将默认自动装配的配置替换掉)
-
自定义一个区域信息切换解析类
//自定义国际化类,需要实现LocaleResolver接口; public class MyLocaleResolve implements LocaleResolver { //拦截所有请求,检查是否有点击切换语言的超链接,有则解析并切换语言,无则使用系统语言; @Override public Locale resolveLocale(HttpServletRequest request) { String l = request.getParameter("l");//获取超链接请求的包含l参数 Locale locale = Locale.getDefault() ;//默认使用系统语言 //判断是否为空 if (!StringUtils.isEmpty(l)){ //截取请求的语言中的:区域、国家代码 String[] s = l.split("_"); //new 新的区域信息对象并给定区域信息 locale = new Locale(s[0],s[1]); } return locale; } @Override public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { } }
-
将自定义的区域信息解析类加入到容器中(添加容器中默认的配置不会生效,只使用自定义的):
//Mvc的扩展配置类 //@EnableWebMvc //全面接管SpringMvc的注解 @Configuration public class MyMvcConfig implements WebMvcConfigurer { //将自定义的区域信息解析器加入到容器中 @Bean public LocaleResolver localeResolver(){ return new MyLocaleResolve(); } }
-
-
渲染的模板(Thymeleaf模板引擎 )
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body class="text-center">
<form class="form-signin" action="dashboard.html">
<h1 th:text="#{login.tip}">Please sign in</h1>
<input type="text" placeholder="Username" th:placeholder="#{login.UserName}">
<input type="password" placeholder="Password" th:placeholder="#{login.password}">
<input type="checkbox"> [[#{login.Remember}]]
<button type="submit" th:text="#{login.btn}">Sign in</button>
<a href="?l=zh_CN">中文</a>
<a href="?l=en_US">English</a>
</form>
</body>
</html>
5.效果图
- 1、
- 2、