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

SpringBoot+Thymeleaf实现国际化_配置文件


SpringBoot+Thymeleaf实现国际化_spring

​Demo​​欢迎下载学习。

SpringBoot+Thymeleaf实现国际化_文件名_03


以上是关于SpringBoot+Thymeleaf实现国际化的主要内容,如果未能解决你的问题,请参考以下文章

springboot2.0国际化

SpringBoot--页面国际化

SpringBoot--页面国际化

SpringBoot--thymeleaf使用和页面国际化

SpringBoot实现国际化

[Java中实现国际化] - 配合thymeleaf实现中英文自动切换(多语言)