多语言功能的支持
在一些网站中,需要提供多国语言支持的功能,这个功能的实现通常需要前后端的配合,其中一种做法是后端在设计表结构的时候设置英文字段,查询的时候提供给前端,前端设置多语言切换的按钮进行切换。如下图所示:
但是来自后端的一些常用的业务提示消息要怎么设置语言切换呢?如登录验证的时候后端返回的提示信息。
这时,可以使用Spring提供的国际化功能去实现。Spring主要通过org.springframework.web.servlet.i18n包下的AcceptHeaderLocaleResolver解析器提供对国际化的支持(i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称)。主要原理是:通过请求头的 Accept-Language 字段来判断当前请求所属的环境,进而去加载指定文件当中的内容,给出合适的响应。通过查看AcceptHeaderLocaleResolver的源码可知:
简单的示例
在resource目录下创建三个具有相同前缀messages的配置文件,创建完成后IDEA中会自动组织成如下格式:
看下Resource Bundle的官方描述:
Resource bundle is a set of properties files that have same base name with different language-specific suffixes. A resource bundle contains at least two properties files with similar base name, for example file_en.properties and file_de.properties.
简单翻译一下:Resource bundle是有着相同前缀名称但有着不同语言后缀名称的属性文件的集合,目的是为了管理繁多的资源包,在实际当中的组织方式其实没有变。
在messages_en_US.properties中添加:
argument.error=argument error,try it again later...
在messages_zh_CN.properties中添加:
argument.error=请求参数异常,请重试...
编写测试接口:
@RestController
public class TestController {
@Resource
MessageSource messageSource;
@GetMapping("/test")
@SensitiveConceal
public String hello() {
return messageSource.getMessage("argument.error", null, LocaleContextHolder.getLocale());
}
}
用Postman发送请求:可以看到,程序会根据HTTP请求头Accept-Language
的值给出不同的响应结果
探究其中的原理
SpringBoot在启动的时候已经自动为我们配置了MessageSource,所以我们程序当中可以直接注入进来。