SpringBoot+thymeleaf快速实现国际化语言切换

在经济全球化的时代,我们的产品也要走向语言全球化,所以我们不得不考虑让一款产品支持多种语言。

SpringMVC中实现国际化的步骤一般分为以下几步:

    1)、编写国际化配置文件

    2)、使用ResourceBundleMessageSource管理国际化资源文件;

    3)、在页面使用fmt:message取出国际化内容。

 

SpringBoot已经自动帮助我们装配好国际化的组件,我们只需要进行简单的配置取值即可。这也是小睿同学为什么热衷于SpringBoot的原因之一。

接下来我就细致的给大家实战演练一番,各位同学你细听分说。

 

Step1、编写国际化配置文件

resource文件夹中创建i18n文件夹,在i18n文件夹中创建login.propertieslogin_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的功能@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,效果图如下。

 

 

 

综上所述,以上两种实现方法,第二种略显得人性化一些,我们可以随时切换网页中的语言种类。这也是平常在项目中用的最多的一种方法。

 

精彩文章推荐:

掌握内网穿透,家里废弃的手机也可以变成服务器

今天我嫖了阿里云700多元的服务器!

 


 

我是 郭小睿同学

欢迎加我微信

备注 姓名+技术or方向+学习or公司

拉你进学习交流群

 


 

对你有帮助,点个在看!

让更多人受益~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值