一、什么是国际化

我们在浏览网站的时候,好比 Nacos :https://nacos.io/zh-cn/docs/quick-start.html

我们不难发现网站上面会有一个语言转换

springboot nacos2 springboot nacos2.0 9948_springboot国际化

通过点击语言,我们可以在这个 Nacos 网站上进行中英文转换

springboot nacos2 springboot nacos2.0 9948_国际化_02

这个就是国际化

二、SpringBoot 对国际化的支持

SpringBoot 对这个国际化其实也是有支持的,而且支持的也不错,我们来写一个例子

1. 配置文件

我们需要几个配置文件,一个是默认的语言配置文件,然后还需要几个其他语言的配置文件。

先在 resource 下面创建一个文件:messages.properties (固定名称,不要乱修改,这个是默认的语言配置文件)

我们在里面写一个配置

springboot nacos2 springboot nacos2.0 9948_国际化_03

写好之后,我们再来在同级目录下创建两个文件:messages_en_US.properties 和 messages_zh_CN.properties(这两个是其他语言的配置文件)

在 US 中我们再来配置一些内容

springboot nacos2 springboot nacos2.0 9948_国际化_04

CN 中也来配置一下

springboot nacos2 springboot nacos2.0 9948_spring boot_05

配置完成之后 IDEA 这个工具就会变成这样

springboot nacos2 springboot nacos2.0 9948_springboot nacos2_06

这个是没有关系的

2. 拦截器

光有上面的语言支持还没有什么屌用,我们还需要通过拦截器进行语言识别,每次请求的时候我们需要知道他语言的类型。

拦截器我们就直接写在 MyWebMvcConfigurer 里面。

springboot nacos2 springboot nacos2.0 9948_springboot nacos2_07

我们 setParamName 中传递的这个 lang 是一会我们请求头中带的参数的名称,可以自定义,没有必要是 lang。

当然哈,我们上一篇也说了这个拦截器了,我们还需要将这个拦截器放入到我们的项目中。

springboot nacos2 springboot nacos2.0 9948_springboot国际化_08

3. 设置默认语言

上面的拦截器设置之后,我们还需要配置一下默认语言,因为第一次请求一般是不带着语言的。

springboot nacos2 springboot nacos2.0 9948_spring boot_09

默认语言是 US,也就是英语

完整的配置

@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {

    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        // 参数名,用于区别语言种类
        lci.setParamName("lang");
        return lci;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        String[] ignorePaths = {
                "/hello"
        };
        registry.addInterceptor(localeChangeInterceptor());
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns(ignorePaths);
    }

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        // 设置默认语言
        slr.setDefaultLocale(Locale.US);
        return slr;
    }
}

4. Controller

我们在控制层写一个 locale 的请求

我们这里需要引入 MessageSource,它是用于支持信息的国际化和包含参数的信息的替换的。

完整请求如下:

@GetMapping("/locale")
public String locale(HttpServletRequest request) throws Exception {
    Locale locale = LocaleContextHolder.getLocale();
    request.setAttribute("message", messageSource.getMessage("message", null, locale));
    return "hello";
}

springboot nacos2 springboot nacos2.0 9948_spring boot_10

这里的这个 getMessage 中的 message 是我们配置文件中的那个 message。第二个参数 null 是动态参数,我们这里因为没有这个东西,所以不需要传递,最后一个 locale 是本地化参数。

写好之后,自己再去页面加一个 message 的显示。

5. 测试

springboot nacos2 springboot nacos2.0 9948_spring boot_11

然后我们在请求地址后面加一段 ?lang=zh_CN

刷新页面

springboot nacos2 springboot nacos2.0 9948_springboot国际化_12

这个乱码我们先不管,这个证明我们的国际化是可以使用的。

三、乱码问题

乱码问题我们可以进行编码格式的修改,我们将中文进行转码,转换成 UniCode 码。

文字转码:https://www.bejson.com/convert/unicode_chinese/

springboot nacos2 springboot nacos2.0 9948_国际化_13

我们修改 CN 还有默认的这两个配置文件。

从新启动服务,再来请求

springboot nacos2 springboot nacos2.0 9948_国际化_14

是没有问题的

 

这一篇东西不多,自己练习一下