
在经济全球化的时代,我们的产品也要走向语言全球化,所以我们不得不考虑让一款产品支持多种语言。
在SpringMVC中实现国际化的步骤一般分为以下几步:
1)、编写国际化配置文件;
2)、使用ResourceBundleMessageSource管理国际化资源文件;
3)、在页面使用fmt:message取出国际化内容。
SpringBoot已经自动帮助我们装配好国际化的组件,我们只需要进行简单的配置和取值即可。这也是小睿同学为什么热衷于SpringBoot的原因之一。
接下来我就细致的给大家实战演练一番,各位同学你细听分说。
Step1、编写国际化配置文件
在resource文件夹中创建i18n文件夹,在i18n文件夹中创建login.properties和login_zh_CN.properties文件,随后idea后自动识别该目录下是国际化配置文件,会为我们切换为国际化视图。

国际化文件命名规则:由国家语言代码和国家代码构成。下图为在idea中创建英文国际化文件,不会创建的同学可以收藏以下,也可打开电脑实操一下。



点击ok,创建完毕。
我们已经创建完毕当前项目需要支持的语言,然后点击ResourceBundle。
点击+号,添加属性(我们需要在HTML页面显示值的变量名)

依次填写不同语言下显示的值

Step2、在springboot配置文件application.properties中指定国际化资源文件位置。
#配置国际化资源文件基础名spring.messages.basename=i18n.login
有同学就会迷惑,为什么上面这段代码就可以指定项目中国际化资源文件的位置呢?我们可以打开源码,查看MessageSourceAutoConfiguration(信息源自动配置类),小睿已经把源码中的的方法功能进行了注释,方便同学们的阅读。
SpringBoot自动配置好了管理国际化资源文件的组件。@EnableConfigurationProperties
public class MessageSourceAutoConfiguration {@Bean@ConfigurationProperties(prefix = "spring.messages")//我们的配置文件可以直接放在类路径下叫messages.properties,就可以直接使用国际化功能。//也可以自定义String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");
@Beanpublic MessageSource messageSource(MessageSourceProperties properties) {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();if (StringUtils.hasText(properties.getBasename())) {//设置国际化资源文件的基础名(去掉语言国家代码)messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));}if (properties.getEncoding() != null) {messageSource.setDefaultEncoding(properties.getEncoding().name());}messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());Duration cacheDuration = properties.getCacheDuration();if (cacheDuration != null) {messageSource.setCacheMillis(cacheDuration.toMillis());}messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());return messageSource;}
Step3、取页面获取国际化的值
1、导入thymeleaf的名称空间。
<html lang="en" xmlns:th="http://www.thymeleaf.org">
2、使用thymeleaf中提供的标签库
<p>国际化测试</p><p th:text="#{login.tip}"></p><input/> [[#{login.tip}]]
目前有两种实现程序国际化的方法。
方法1、通过浏览器语言设置显示不同的语言信息。
我们可以通过调整浏览器当前的语言,进行语言的切换。

原理:国际化Locale(区域信息对象);LocalResolver(获取区域信息对象)
SpringBoot中:WebMvcAutoConfiguration自动配置类中localeResolver方法获取浏览器request(请求头)信息。
@Bean@ConditionalOnMissingBean@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")public LocaleResolver localeResolver() {if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {return new FixedLocaleResolver(this.mvcProperties.getLocale());}AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();localeResolver.setDefaultLocale(this.mvcProperties.getLocale());return localeResolver;}
方法2、点击链接切换国际化
实现方式:通过定义区域信息解析器实现程序国际化
步骤如下:
1)、定义区域信息解析器
/** * 在链接上携带区域信息 * 区域信息解析器*/public class MyLocaleResolver implements LocaleResolver {/*** 解析区域信息** @param request 请求头* @return Locale*/@Overridepublic Locale resolveLocale(HttpServletRequest request) {String l = request.getParameter("l");Locale locale = Locale.getDefault();//操作系统默认的值if (!StringUtils.isEmpty(l)) {//请求头中l参数如果不为空String[] split = l.split("_");locale = new Locale(split[0], split[1]);}return locale;}@Overridepublic void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {}}
2)、在容器中注册区域信息解析器
//使用WebMvcConfigurerAdapter可以扩展SpringMVC的功能@Configurationpublic class MyMvcConfig extends WebMvcConfigurerAdapter {@Bean//为了让区域信息解析器生效,将区域信息解析器注册在容器中public LocaleResolver localeResolver(){return new MyLocaleResolver();}}
3)、HTML内设置超链接
<a th:href="@{/index.html?(l='zh_CN')}">中文</a><a th:href="@{/index.html?(l='en_US')}">English</a>
启动项目,访问/index,效果图如下。


综上所述,以上两种实现方法,第二种略显得人性化一些,我们可以随时切换网页中的语言种类。这也是平常在项目中用的最多的一种方法。
精彩文章推荐:
我是 郭小睿同学
欢迎加我微信
备注 姓名+技术or方向+学习or公司
拉你进学习交流群


对你有帮助,点个在看!
让更多人受益~
本文详细介绍如何在SpringBoot项目中实现国际化,包括配置国际化资源文件、使用ResourceBundleMessageSource管理和页面中取出国际化内容的方法。同时,提供了两种实现程序国际化的途径:通过浏览器语言设置和点击链接切换语言。
1831

被折叠的 条评论
为什么被折叠?



