springboot国际化_SpringBoot国际化踩坑指南
springboot中文
国际化,也叫 i18n,为啥叫这个名字呢?因为国际化英⽂是 internationalization ,在 i 和 n 之间有 18 个字母,所以叫 i18n。我们的应⽤如果做了国际化就可以在不同的语⾔环境下,⽅便的进⾏切换,最常见的就是中⽂和英⽂之间的切换,国际化这个功能也是相当的常见。
在 Spring 中,就通过 AcceptHeaderLocaleResolver 对国际化提供了⽀持,开发者通过简单配置,就可以在项⽬中直接使⽤国际化功能了。
这⼀⽀持,在 Spring Boot 中得到进⼀步的简化,在 Spring Boot 中,我们也可以通过寥寥数⾏代码就能⽅便的实现国际化功能,接下来松哥就来和⼤家说⼀说 Spring Boot 中的国际化。
⾸先,需要给⼤家先说明⼀点,项⽬中的国际化我们往往需要多⽅⾯的⽀持,例如后端做国际化、前端页⾯也要做国际化,共同搭配,才能真正实现国际化的功能。本⽂我先来和各位⼩伙伴们介绍 Spring Boot 中的国际化,后⾯我们再来介绍 Vue 的国际化,最后,再把这两个结合应⽤到我们的 vhr 项⽬中,所以前后⼀共可能有三篇⽂章,本⽂是第⼀篇。
1.基本使⽤
Spring Boot 和 Spring ⼀脉相承,对于国际化的⽀持,默认是通过 AcceptHeaderLocaleResolver 解析
器来完成的,这个解析器,默认是通过请求头的 Accept-Language 字段来判断当前请求所属的环境的,进⽽给出合适的响应。
所以在 Spring Boot 中做国际化,这⼀块我们可以不⽤配置,直接就开搞。
⾸先创建⼀个普通的 Spring Boot 项⽬,添加 web 依赖即可。项⽬创建成功后,默认的国际化配置⽂件放在 resources ⽬录下,所以我们直接在该⽬录下创建四个测试⽂件,如下:
我们的 message ⽂件是直接创建在 resources ⽬录下的,IDEA 在展⽰的时候,会多出⼀个 Resource Bundle,这个⼤家不⽤管,千万别⼿动去创建这个⽬录。
messages.properties 这个是默认的配置,其他的则是不同语⾔环境下的配置,en_US 是英语(美国),zh_CN 是中⽂简体,zh_TW 是中⽂繁体(⽂末附录⾥边有⼀个完整的语⾔简称表格)。
四个⽂件创建好之后,第⼀个默认的我们可以先空着,另外三个分别填⼊以下内容:
messages_zh_CN.properties
user.name=江南⼀点⾬
messages_zh_TW.properties
user.name=江南壹點⾬
messages_en_US.properties
user.name=javaboy
配置完成后,我们就可以直接开始使⽤了。在需要使⽤值的地⽅,直接注⼊ MessageSource 实例即
可。
❝ 在 Spring 中需要配置的 MessageSource 现在不⽤配置了,Spring Boot 会通过
org.springframework.t.MessageSourceAutoConfiguration ⾃动帮我们配置⼀个 MessageSource 实例。
创建⼀个 HelloController ,内容如下:
@RestController
public class HelloController {
@Autowired
MessageSource messageSource;
@GetMapping("/hello")
public String hello() {
Message("user.name", null, Locale());
}
}
在 HelloController 中我们可以直接注⼊ MessageSource 实例,然后调⽤该实例中的 getMessage ⽅法去获取变量的值,第⼀个参数是要获取变量的 key,第⼆个参数是如果 value 中有占位符,可以从这⾥传递参数进去,第三个参数传递⼀个 Locale 实例即可,这相当于当前的语⾔环境。
接下来我们就可以直接去调⽤这个接⼝了。
默认情况下,在接⼝调⽤时,通过请求头的 Accept-Language 来配置当前的环境,我这⾥通过 POSTMAN 来进⾏测试,结果如下:
⼩伙伴们看到,我在请求头中设置了 Accept-Language 为 zh-CN,所以拿到的就是简体中⽂;如果我设置了 zh-TW,就会拿到繁体中⽂:
是不是很 Easy?
2.⾃定义切换
有的⼩伙伴觉得切换参数放在请求头⾥边好像不太⽅便,那么也可以⾃定义解析⽅式。例如参数可以当成普通参数放在地址栏上,通过如下配置可以实现我们的需求。
@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;
}
}
在这段配置中,我们⾸先提供了⼀个 SessionLocaleResolver 实例,这个实例会替换掉默认的 AcceptHeaderLocaleResolver,不同于AcceptHeaderLocaleResolver 通过请求头来判断当前的环境信息,SessionLocaleResolver 将客户端的 Locale 保存到 HttpSession 对象中,并且可以进⾏修改(这意味着当前环境信息,前端给浏览器发送⼀次即可记住,只要 session 有效,浏览器就不必再次告诉服务端当前的环境信息)。
另外我们还配置了⼀个,这个会拦截请求中 key 为 lang 的参数(不配置的话是 locale),这个参数则指定了当前的环境信息。
好了,配置完成后,启动项⽬,访问⽅式如下:
我们通过在请求中添加 lang 来指定当前环境信息。这个指定只需要⼀次即可,也就是说,在 session 不变的情况下,下次请求可以不必带上 lang 参数,服务端已经知道当前的环境信息了。
3.其他⾃定义
默认情况下,我们的配置⽂件放在 resources ⽬录下,如果⼤家想⾃定义,也是可以的,例如定义在 resources/i18n ⽬录下:
但是这种定义⽅式系统就不知道去哪⾥加载配置⽂件了,此时还需要 application.properties 中进⾏额外配置(注意这是⼀个相对路径):ssages.basename=i18n/messages
另外还有⼀些编码格式的配置等,内容如下:
这个属性的作⽤在 t.support.AbstractResourceBasedMessageSource#getDefaultLocale ⽅法中⽣效:
protected Locale getDefaultLocale() {
if (this.defaultLocale != null) {
return this.defaultLocale;
}
if (this.fallbackToSystemLocale) {
Default();
}
return null;
}
从这段代码可以看出,在不到当前系统对应的资源⽂件时,如果该属性为 true,则会默认查当前系统对应的资源⽂件,否则就返回null,返回 null 之后,最终⼜会调⽤到系统默认的 messages.properties ⽂件。
4.附录
搜刮了⼀个语⾔简称表,分享给各位⼩伙伴:
语⾔简称
简体中⽂(中国)zh_CN
繁体中⽂()zh_TW
繁体中⽂(中国⾹港)zh_HK
英语(中国⾹港)en_HK
英语(美国)en_US
英语(英国)en_GB
英语(全球)en_WW
英语(加拿⼤)en_CA
英语(澳⼤利亚)en_AU
英语(爱尔兰)en_IE
英语(芬兰)en_FI
芬兰语(芬兰)fi_FI
英语(丹麦)en_DK
丹麦语(丹麦)da_DK
英语(以⾊列)en_IL
希伯来语(以⾊列)he_IL
英语(南⾮)en_ZA
英语(印度)en_IN
英语(挪威)en_NO
英语(新加坡)en_SG
英语(新西兰)en_NZ
英语(印度尼西亚)en_ID
英语(菲律宾)en_PH

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。