概述
Spring MVC对国际化的支持已经很好了,一般不需要你做太多的改造,基本拿来即用,只需要做稍许的配置即可。
读完本篇文章,你会了解到的知识如下:
- JavaWeb应用如何配置多语言
- RESTful API 如何配置多语言
- Spring MVC实现国际化的基本原理
- Spring MVC提供几种区域解析器
○ AcceptHeaderLocaleResolver(默认)
○ SessionLocaleResolver
○ CookieLocaleResolver
○ FixedLocaleResolver
JavaWeb项目如何使用多语言
我们以模板语言thymeleaf 为例:
1、新建SpiringBoot项目
可参考https://start.spring.io/,或者使用Idea工具新建,一路【下一步】,这里不再赘述。
官网生成项目,需要添加Spring-web和Thymeleaf模块,也可后续添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、配置i18n 文件
在resources 目录下新建多语言文件,格式如下
messages_语言_地区.properties
,messages
为默认前缀
默认:messages.properties
、英文:messages_en.properties
、中文:messages_zh_CN.properties
例如:
文件内容的格式为key = value的形式
例如:
messages_en.properties
welcome = Welcome
messages_zh_CN.properties
welcome = 欢迎
3、新建index.html文件
<!DOCTYPEhtml>
<htmllang="en"xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<metacharset="UTF-8">
<title>Title</title>
</head>
<body>
<h1th:text="#{welcome}"></h1>
</body>
</html>
4、新建controller
packagecom.lckoo.i18ntest;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.GetMapping;
@Controller
publicclassI18nController{
@GetMapping(value="/index")
publicStringindex(){
return"index";
}
}
5、使用postman测试
测试地址localhost:8080/index
因为是基于默认配置,SpringBoot默认使用AcceptHeaderLocaleResover,是通过http请求header中的Accept-Language
参数来区分用户的区域的,所以此处修改该参数的值
取值如:en
、zh-cn
、zh
、zh-tw
上面都是基于SpringBoot的默认配置,没有任何额外复杂的工作量
- i18n的默认路径是resources,模板文件默认路径是resources/templates
- i18n文件默认前缀是messages
- 默认的区域解析器AcceptHeaderLocaleResover
我们也可以自定义配置:
1)、i18n文件路径及文件名前缀
spring:
messages:
basename:i18n/messages
encoding:utf-8
2)、自定义language取值方式
通过url参数传值,例如:?lang=zh_CN
@Configuration
publicclassWebMvcConfigimplementsWebMvcConfigurer{
//替换默认的LocalResolver
@Bean
public LocaleResolverlocaleResolver(){
SessionLocaleResolversessionLocaleResolver=newSessionLocaleResolver();
returnsessionLocaleResolver;
}
//拦截器
@Override
public voidaddInterceptors(InterceptorRegistryregistry){
LocaleChangeInterceptorlocaleChangeInterceptor=newLocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
registry.addInterceptor(localeChangeInterceptor);
}
}
这里自定义了一个拦截器,用于接收请求url中的参数
为什么还要定义一个LocaleResolver
呢,因为默认的LocaleResolver
实现是AcceptHeaderLocaleResover
,不允许其他方法去修改当前线程的Locale,而我们的拦截器的目的就是要修改Locale对象,具体见AcceptHeaderLocaleResover
中的setLocale
方法
@Override
publicvoidsetLocale(HttpServletRequestrequest,@NullableHttpServletResponseresponse,@NullableLocalelocale){
//此处是直接抛出异常
throw new UnsupportedOperationException(
"CannotchangeHTTPacceptheader-useadifferentlocaleresolutionstrategy");
}
测试结果:
基本原理:
看到这里,大家应该了解了如何配置多语言了,下面我们一起来看下多语言实现的一个基本原理。
先来认识一些类:
- LocaleResolver 区域解析器,通过此解析器,来读取用户的区域。
未完待续。。。