一、说明
最近接到的需求是项目国际化,然后对这个国际化进行初步调研,以下是对调研的内容做整理。
前后端分离的国际化方案,如果每个接口都增加参数,代码会变成冗余,所以最好把语言变量加到请求头。除了请求头,也可以通过cookie实现,但是有些客户端不支持cookie,而且cookie存在被篡改的危险,因此更建议使用标准的请求头。
具体过程如下:
1,客户端增加请求头 Accept-Language。
2,服务端配置国际化资源文件。
3,服务端通过当前请求的Accept-Language对应值,决定使用哪一个区域的语言,找到相应的资源文件,格式化处理,然后返回给客户端。
二、基本使用
相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置Resouce bundle messages
测试代码
@RestController
public class LanguageController {
@Autowired
private MessageSource messageSource;
@GetMapping("/ping")
public String ping(){
return "pong";
}
@GetMapping("/currentLanguage")
public String currentLanguage(){
return LanguageUtil.getCurrentLang();
}
@GetMapping("/i18n")
public String i18n(){
return messageSource.getMessage("title", new Object[]{"A","B"}, LocaleContextHolder.getLocale());
}
}
三、基本原理解析
SpringBoot 对于国际化的支持,默认是通过 AcceptHeaderLocal