Spring Boot “国际化“ 探究

多语言功能的支持

在一些网站中,需要提供多国语言支持的功能,这个功能的实现通常需要前后端的配合,其中一种做法是后端在设计表结构的时候设置英文字段,查询的时候提供给前端,前端设置多语言切换的按钮进行切换。如下图所示:

但是来自后端的一些常用的业务提示消息要怎么设置语言切换呢?如登录验证的时候后端返回的提示信息。

这时,可以使用Spring提供的国际化功能去实现。Spring主要通过org.springframework.web.servlet.i18n包下的AcceptHeaderLocaleResolver解析器提供对国际化的支持(i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称)。主要原理是:通过请求头的 Accept-Language 字段来判断当前请求所属的环境,进而去加载指定文件当中的内容,给出合适的响应。通过查看AcceptHeaderLocaleResolver的源码可知:

简单的示例

在resource目录下创建三个具有相同前缀messages的配置文件,创建完成后IDEA中会自动组织成如下格式:
Spring Boot “国际化“ 探究_第1张图片
看下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的值给出不同的响应结果
Spring Boot “国际化“ 探究_第2张图片
Spring Boot “国际化“ 探究_第3张图片

探究其中的原理

SpringBoot在启动的时候已经自动为我们配置了MessageSource,所以我们程序当中可以直接注入进来。
Spring Boot “国际化“ 探究_第4张图片

你可能感兴趣的:(JavaWeb开发,spring,boot,java,后端)