前言

什么是国际化改造?就是说,代码中存在的各种输出(日志、异常或是业务上)的内容,都可以提取出来做国际化改造,把这些内容按照一定的规定,提取成一个key,前端发送请求的时候,来判断究竟需要获取哪个语言的内容。


国际化改造

首先,要确保自己有web依赖,向maven中添加下面的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

创建WebConfig定义拦截器和初始语言

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        interceptor.setParamName("lang");
        registry.addInterceptor(interceptor);
    }

    @Bean
    LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
        return localeResolver;
    }
}
通过实现WebMvcConfigurer接口的addInterceptors方法
即可添加一个"lang"的拦截器,当访问接口后面带上lang=?即可触发相应的语言
localeResolver定义了默认的语言

resource下建立 i18n 文件夹,并按照相应格式创建对应的文件
i18n-Study-1

server.properties中,需要配置国际化内容的路径以及一些其他配置
接下来随便写一个Controller,在里面注入 MessageSource 内容

@Resource
MessageSource messageSource;

@GetMapping("/message")
public String message() {
    return messageSource.getMessage("user.name", null, LocaleContextHolder.getLocale());
}

我分别将 messages.properties的user.name=1
messages_zh_CH.properties的user.name=2
messages_en_US.properties的user.name=3

当我对 GET http://localhost:8088/message?lang=en_US 进行访问时,返回的结果是3
访问后缀为zh_CH时,会变为2
只需要访问一次,项目便会记录下来你的Cookie,以后不需要带后面的lang,就可以访问对应的结果

额外说明

所以说为什么要用messageSource的getMessage?而不是直接用原生的server.properties,我在起初要做国际化改造的时候也有同样的疑问。因为当我们拦截器获取到一次路径上的lang时,就会记录下来,并且指向对应的properties,也就是说,在代码中你不需要对其进行任何修改,以后可以“无痛”扩容各种国家的语言,在代码中依旧使用一样的路径。
i18n-Study-2

像这样,Idea会自动解析你的messages们,把他们变成可读的内容。

为什么我说只需要获取路径上一次lang?因为在他第一次获取的时候,就已经把你的语言状态记录了下来,以后再怎么访问其他内容,系统会默认把你设置为刚才访问的语言对象。我们经常可以看到,当访问外国网站,切换成中文时,链接路径上会出现zh的字样,这便是获取出来的语言设定。
当我们点击页面的切换其他语言,就会重新对lang进行设定,也会把之前的对象替换成你现在刷新的lang对象。

最后修改:2023 年 01 月 09 日
如果觉得我的文章对你有用,请随意赞赏