在经济全球化的时代,我们的产品也要走向语言全球化,所以我们不得不考虑让一款产品支持多种语言。
在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");
@Bean
public 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
*/
@Override
public 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;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
2)、在容器中注册区域信息解析器
//使用WebMvcConfigurerAdapter可以扩展SpringMVC的功能
@Configuration
public 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公司
拉你进学习交流群
对你有帮助,点个在看!
让更多人受益~