SpringBoot+Thymeleaf实现国际化
Posted SamDlex
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot+Thymeleaf实现国际化相关的知识,希望对你有一定的参考价值。
概述
国际化大概分三步走:
第一步:准备国际化文件
国际化文件名组成:文件名+下划线+区域语言代号+".properties",如login_zh_CN.properties
第二步:配置国际化文件位置
在application.yml配置文件中配置spring.messages.basename的值,它可以指定国际化文件的位置,默认值是messages,可以指定多个不同的国际化文件,文件名之间用逗号分隔开。
第三步:获取国际化文件中的值
根据语言环境获取值。具体详情请继续阅读本文。
1.在pom.xml中添加Thymeleaf依赖
<properties>
<thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.4.1</thymeleaf-layout-dialect.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2.#…消息表达式
外部化文本就是从模板文件中提取的模板代码片段,它们可以分开保存。最典型的就是保存在.properties文件中。因此它们可以被轻易地用对应的其他语言文本来代替,这就是国际化的处理。外部化文本片段通常被称为“message”消息。消息都有一个key来识别它们。Thymeleaf允许我们用#…指定text对应的消息。
Thymeleaf的standard message resolver会根据我们提供的key帮我们从src/main/resources
目录下与模板同名的.properties文件中把值取回来。
3.举例
注意:整个项目所有国际化部分的内容都添加到语言配置文件中!
注意:整个项目所有国际化部分的内容都添加到语言配置文件中!
注意:整个项目所有国际化部分的内容都添加到语言配置文件中!
3.1语言配置文件
在src/main/resources
目录下添加messages.properties
默认语言配置文件,文件名称可以自定义。然后创建各个语言对应的配置文件,文件名= 默认配置的文件名+下划线+区域简称,如英文配置文件messages_en.properties
、中文配置文件messages_zh.properties
,依次类推。
messages.properties(默认)
home.title=Application title
home.language.chinese=Chinese
home.language.english=English
home.welcome=Welcome here!
messages_zh.properties(中文)
home.title=国际化示例
home.language.chinese=中文(简体)
home.language.english=英语
home.welcome=欢迎到来!
messages_en.properties(英文)
home.title=Application title
home.language.chinese=Chinese
home.language.english=English
home.welcome=Welcome here!
3.2指定国际化文件
在application.yml配置文件中指定国际化文件:
spring:
messages:
basename:
spring.messages.basename
的默认值是messages,可以指定多个不同的国际化文件,文件名之间用逗号分隔开。本例的国际化文件是messages,所以上面的配置完全可以不写。除了messages国际化文件外,如果你还有其他的国际化文件,如home.properties、home_en.properties、home_zh.properties、detail.properties、detail_en.properties、detail_zh.properties。spring.messages.basename
应该这样配置:
spring:
messages:
basename: messages,home,detail
如果这些国际文件都放在src/resources/i18n
目录下(目录名可以随意取),配置就该这样写:
spring:
messages:
basename: i18n.messages,i18n.home,i18n.detail
如果不加上目录的路径,那么springboot将会直接在src/ resources
目录下寻找这些文件。
3.3添加模板
Spring Boot默认存放页面模板的路径在src/main/resources/templates
或者src/main/view/templates
,Thymeleaf默认的页面文件后缀是.html。
home.html(模板)
<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:text="#home.title">Insert title here</title>
</head>
<body>
<div>
<a data-th-href="@/locale(lang=zh_CN)" th:text="#home.language.chinese">中文</a>
<a data-th-href="@/locale(lang=en_US)" th:text="#home.language.english">英语</a>
</div>
<h1 data-th-text="#home.welcome">Fluid jumbotron</h1>
</body>
</html>
模板中通过#…消息表达式获取.properties
文件中的消息。
3.4配置类
配置区域信息解析器实现程序国际化。当拦截到请求中有lang参数,就会触发语言切换。
package com.wong.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;
@Configuration// 当系统启动时,就会来配置WebConfig
public class WebConfig implements WebMvcConfigurer
@Bean//为了让区域信息解析器生效,将区域信息解析器注册在容器中,配置加入到SpringBoot的容器中
public LocaleResolver localeResolver()
/**
* 通过定义区域信息解析器实现程序国际化
*/
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
// 设置默认语言为中文即使用_zh.properties的文件
localeResolver.setDefaultLocale(new Locale("zh","CN"));
return localeResolver;
@Bean
public LocaleChangeInterceptor localeChangeInterceptor()
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
// 设置参数,只要拦截到有lang参数的就会触发语言切换
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry)
// 拦截请求,注册区域信息拦截器
registry.addInterceptor(localeChangeInterceptor());
@Override
public void addViewControllers(ViewControllerRegistry registry)
// 添加视图控制器,做简单地跳转
registry.addViewController("/").setViewName("index");
3.5控制器代码
首页控制器HomeController.java:
可以通过http://ip:port/index、http://ip:port/home、http://ip:port/三种方式来访问home.html模板。
package com.wong.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Locale;
@Controller
public class HomeController
@Autowired
private MessageSource messageSource;
@RequestMapping(value = "/index","/home","/",method = RequestMethod.GET)
public String getHomePage(Model model, Locale locale)
return "home";
语言域控制器控制语言切换的LocaleController.java:
语言切换时,进行转发,触发语言切换。事实上,我们的上面配置类注册了一个拦截器,只要拦截到有lang参数的就会触发语言切换。LocaleController.java其实也只是这样的作用而已。
package com.wong.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@Controller
public class LocaleController
@GetMapping("/locale")
public String localeHandler(HttpServletRequest request)
String lastUrl = request.getHeader("referer");
// 向界面返回这个字符串
return "redirect:"+lastUrl;
4.运行项目
~/Desktop/WInternationalization$ mvn clean spring-boot:run
Demo欢迎下载学习。
以上是关于SpringBoot+Thymeleaf实现国际化的主要内容,如果未能解决你的问题,请参考以下文章