当前位置: 首页 > 科技观察

SpringBoot国际化指南_0

时间:2023-03-12 21:08:22 科技观察

国际化,也叫i18n,为什么叫这个名字呢?因为国际化英文就是国际化,i和n之间有18个字母,所以叫i18n。如果我们的应用程序是国际化的,那么在不同的语言环境中可以很容易地切换。最常见的就是中英文的切换。国际化的功能也比较常见。在Spring中,通过AcceptHeaderLocaleResolver提供了对国际化的支持,开发者可以通过简单的配置直接在项目中使用国际化功能。这种支持在SpringBoot中得到了进一步简化。在SpringBoot中,我们也可以通过几行代码轻松实现国际化功能。下面宋哥给大家讲讲全球化。首先我要跟大家说明一下,在项目的国际化上,我们往往需要各方面的支持。比如后台国际化,前端页面也要国际化。只有通力合作,才能真正实现国际化功能。这篇文章我先给小伙伴们介绍一下SpringBoot中的国际化,后面再介绍Vue的国际化。最后,我将把这两者的结合应用到我们的vhr项目中,所以一共可能是三篇文章。本文为第一篇。1、基本上SpringBoot和Spring在同一行使用。对于国际化支持,默认情况下是通过AcceptHeaderLocaleResolver解析器完成的。这个解析器,默认通过请求头的Accept-Language字段来判断当前请求所属的环境,然后给出合适的响应。所以我们可以在SpringBoot中做国际化,我们可以直接做,不需要配置。首先创建一个普通的SpringBoot项目,添加web依赖。项目创建成功后,默认的国际化配置文件是放在resources目录下的,所以我们直接在这个目录下创建四个测试文件,如下:将是一个额外的ResourceBundle,你不需要担心这个,不要手动创建这个目录。messages.properties这个是默认配置,其他是不同语言环境下的配置。en_US为英语(美国),zh_CN为简体中文,zh_TW为繁体中文(文末附录中有完整的语言缩写表)。四个文件创建完成后,我们可以让第一个默认为空,其他三个填写如下内容:messages_zh_CN.propertiesuser.name=江南一点鱼messages_zh_TW.propertiesuser.name=江南一点鱼messages_en_US.propertiesusername=javaboy配置完成后,我们就可以直接开始使用了。需要使用values的地方,直接注入MessageSource实例即可。Spring中需要配置的MessageSource现在不需要配置了。SpringBoot会通过org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration自动为我们配置一个MessageSource实例。使用以下内容创建一个HelloController:@RestControllerpublicclassHelloController{@AutowiredMessageSourcemessageSource;@GetMapping("/hello")publicStringhello(){returnmessageSource.getMessage("user.name",null,LocaleContextHolder.getLocale());}}在HelloController中,我们可以直接注入MessageSource实例,然后调用实例中的getMessage方法获取变量的值。第一个参数是获取变量的key,第二个参数是如果value中有占位符,可以从这里传参,第三个参数可以传一个Locale实例,相当于当前locale。那么我们就可以直接调用这个接口了。默认情况下,接口调用时,通过请求头的Accept-Language配置当前环境。我这里通过POSTMAN测试,结果如下:可以看到,我把请求头中的Accept-Language设置为zh-CN,所以得到的是简体中文;如果我设置zh-TW,我得到繁体中文:这不是很容易吗?2.自定义切换有些朋友觉得切换参数放在请求头不方便,所以也可以自定义解析方式。比如参数可以像普通参数一样放在地址栏,我们的需求可以通过下面的配置来实现。@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){LocaleChangeInterceptor拦截器=newLocaleChangeInterceptor();拦截器.setParamName("lang");registry.addInterceptor(拦截器);}@BeanLocaleResolverlocaleResolver(){SessionLocaleResolverlocaleResolver=newSessionLocaleResolver();localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);返回localeResolver;}}在这个配置中,我们首先提供了一个SessionLocaleResolver实例,它会替代默认的AcceptHeaderLocaleResolver,区别于AcceptHeaderLocaleResolver是通过请求头来判断当前的环境信息,SessionLocaleResolver将客户端的Locale保存在HttpSession对象中,可以修改(这意味着当前环境信息只要前端发送给浏览器一次就可以记住,只要会话有效,浏览器就不需要告诉服务器当前环境信息)。另外,我们还配置了一个拦截器,会拦截请求中key为lang的参数(如果不配置就是locale),这个参数指定了当前的环境信息。ok,配置完成后,启动项目,访问方式如下:我们通过在request中加入lang来指定当前环境信息。这个规范只需要做一次,也就是说如果session不变,下次请求不需要带lang参数,服务器已经知道当前的环境信息。3.其他定制默认情况下,我们的配置文件都放在resources目录下。如果你想定制,也是可以的。例如,在resources/i18n目录中定义它们:但是系统不知道以这种方式将它们加载到哪里。配置文件准备好了,此时需要在application.properties中额外配置(注意这里是相对路径):spring.messages.basename=i18n/messages还有一些编码格式配置等,内容如下:spring.messages。cache-duration=3600spring.messages.encoding=UTF-8spring.messages.fallback-to-system-locale=truespring.messages.cache-duration表示messages文件的缓存过期时间,如果不配置,缓存永远有效。spring.messages.fallback-to-system-locale这个属性有点神奇,网上也找不到明确的答案。翻了一会儿源码,总算是看出端倪了。该属性的作用在org.springframework.context.support.AbstractResourceBasedMessageSource#getDefaultLocale方法中生效:}if(this.fallbackToSystemLocale){returnLocale.getDefault();}returnnull;}从这段代码可以看出,如果找不到当前系统对应的资源文件,如果该属性为true,则默认查找当前系统对应的资源文件,否则为返回空值。返回null后,最终会调用系统默认的messages.properties文件。4、附录搜索了语言缩写列表,分享给大家:)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英语(泰国)en_TH英语(马来西亚)en_MY英语(阿拉伯语)en_XA韩语(韩国)ko_KR日语(日本)ja_JP荷兰语(荷兰)nl_NL荷兰语(比利时)nl_BE葡萄牙语(葡萄牙)pt_PT葡萄牙语(巴西)pt_BR法语(法国)fr_FR法语(卢森堡)fr_LU法语(瑞士)fr_CH法语(比利时)fr_BE法语(加拿大)fr_CA西班牙语(拉丁美洲)es_LA西班牙语(西班牙)es_ES西班牙语(阿根廷)es_AR西班牙语(美国)es_US西班牙语(墨西哥)es_MX西班牙语(哥伦比亚)es_CO西班牙语(波多黎各)es_PR德语(德国)de_DE德语(奥地利)de_AT德语(瑞士)de_CH俄语(俄罗斯)ru_RU意大利语(意大利)it_IT希腊语(希腊)el_GR挪威语(挪威)no_NO匈牙利语(匈牙利)hu_HU土耳其语(土耳其)tr_TR捷克语(捷克共和国)cs_CZ斯洛文尼亚语sl_SL波兰语(波兰)pl_PL瑞典语(瑞典)sv_SE西班牙语(智利)es_CL