Spring Boot Thymeleaf实现国际化的方法详解

 更新时间:2019年10月01日 08:34:01   作者:云天  
这篇文章主要给大家介绍了关于Spring Boot Thymeleaf实现国际化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

开发传统Java WEB工程时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用了。SpringBoot支持如下页面模板语言

  • Thymeleaf
  • FreeMarker
  • Velocity
  • Groovy
  • JSP

上面并没有列举所有SpringBoot支持的页面模板技术。其中Thymeleaf是SpringBoot官方所推荐使用的,下面来谈谈Thymeleaf实现应用国际化方法。

ps:当然现在开发基本上是前后端分离了,但是难免需要维护遗留项目或没有条件前后端分离的团队还是有很多的,这时候学会必要的前端技能,能达到事半功倍的效果。

添加Thymeleaf依赖

要想使用Thhymeleaf,首先要在pom.xml文件中单独添加Thymeleaf依赖。

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Spring Boot默认存放模板页面的路径在src/main/resources/templates或者src/main/view/templates,这个无论是使用什么模板语言都一样,当然默认路径是可以自定义的,不过一般不推荐这样做。另外Thymeleaf默认的页面文件后缀是.html

什么是国际化

国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式。它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素。换言之,应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。

Spring Boot Thymeleaf 代码实现国际化

1.配置文件代码WebConfiguration.java

package com.easy.templateThymeleaf.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
public class WebConfiguration implements WebMvcConfigurer {

 @Bean
 public LocaleResolver localeResolver() {

  SessionLocaleResolver localeResolver = new SessionLocaleResolver();
  localeResolver.setDefaultLocale(new Locale("es", "ES"));
  return localeResolver;
 }

 @Bean
 public LocaleChangeInterceptor localeChangeInterceptor() {

  LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
  localeChangeInterceptor.setParamName("lang");
  return localeChangeInterceptor;
 }

 @Override
 public void addInterceptors(InterceptorRegistry registry) {

  registry.addInterceptor(localeChangeInterceptor());
 }
}

2.控制器代码IndexController.java、LocaleController.java

package com.easy.templateThymeleaf.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 IndexController {

 @Autowired
 private MessageSource messageSource;

 @RequestMapping(value = {"/index", "/"}, method = RequestMethod.GET)
 public String index(Model model, Locale locale) {

  model.addAttribute("title", messageSource.getMessage("text.title", null, locale));
  return "index";
 }
}
package com.easy.templateThymeleaf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class LocaleController {

 @GetMapping(value = "/locale")
 public String localeHandler(HttpServletRequest request) {

  String lastUrl = request.getHeader("referer");
  return "redirect:" + lastUrl;
 }
}

3.静态页面代码index.html

<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
 <meta charset="UTF-8">
 <title th:text="${title}">Insert title here</title>

 <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}">
</head>
<body>

<nav class="navbar navbar-expand-lg navbar-dark bg-danger">
 <a class="navbar-brand" th:href="@{'/'}">I18N Demo</a>
 <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
   aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
  <span class="navbar-toggler-icon"></span>
 </button>
 <div class="collapse navbar-collapse" id="navbarNav">
  <ul class="navbar-nav mr-auto">
   <li class="nav-item active">
    <a class="nav-link" th:href="@{'/'}" th:text="#{text.home}">Home</a>
   </li>
  </ul>
  <ul class="navbar-nav navbar-right">
   <li class="dropdown">
    <button th:text="#{text.language}" class="btn btn-danger dropdown-toggle" type="button"
      id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    </button>
    <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton">
     <a class="dropdown-item" th:href="@{/locale(lang=es_ES)}"
      th:text="#{text.language.chinese}">中文</a>
     <a class="dropdown-item" th:href="@{/locale(lang=en_US)}"
      th:text="#{text.language.english}">英语</a>
    </div>
   </li>
  </ul>
 </div>
</nav>

<div class="container" style="margin-top:50px">

 <div class="jumbotron jumbotron-fluid">
  <div class="container">
   <h1 class="display-4" th:text="#{text.home.message}">Fluid jumbotron</h1>
   <p class="lead" th:text="#{text.description}">This is a modified jumbotron that occupies the entire
    horizontal space of its parent.</p>
  </div>
 </div>

</div>

<footer>

 <script th:src="@{/js/jquery-3.3.1.min.js}"></script>
 <script th:src="@{/js/popper.min.js}"></script>
 <script th:src="@{/js/bootstrap.min.js}"></script>

</footer>

</body>
</html>

4.语言配置文件

中文简体语言配置文件messages.properties

text.title=国际化示例
text.home=首页
text.language=语言
text.language.chinese=中文(简体)
text.language.english=英语
text.home.message=你好,欢迎你
text.description=这是个国际化模板示例

英文语言配置文件messages.properties

text.title=Application title
text.home=Home
text.language=Language
text.language.chinese=Chinese
text.language.english=English
text.home.message=Hi, welcome!
text.description=It is a i18n demo

5.最后贴上maven配置文件pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.1.7.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.easy</groupId>
 <artifactId>template-thymeleaf</artifactId>
 <version>0.0.1</version>
 <name>template-thymeleaf</name>
 <description>Demo project for Spring Boot</description>

 <properties>
  <java.version>1.8</java.version>
  <encoding>UTF-8</encoding>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 </properties>

 <dependencies>
  
  <dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <scope>runtime</scope>
  </dependency>

  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>

  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
  </dependency>

  <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <optional>true</optional>
  </dependency>

 </dependencies>

 <build>
  <plugins>
   <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
   </plugin>
  </plugins>
 </build>

</project>

运行示例

1.找到TemplateThymeleafApplication.java文件运行示例

地址栏输入: http://localhost:8080/

2.运行效果分别如下

默认为中文语言环境

切换到英文环境后,界面效果如下

资料

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • Java 获取服务器环境的实例详解

    Java 获取服务器环境的实例详解

    这篇文章主要介绍了Java 获取服务器环境的实例详解的相关资料,这里提供实例和输出结果,希望能帮助大家理解,需要的朋友可以参考下
    2017-07-07
  • MybatisPlus 不修改全局策略和字段注解如何将字段更新为null

    MybatisPlus 不修改全局策略和字段注解如何将字段更新为null

    这篇文章主要介绍了MybatisPlus 不修改全局策略和字段注解如何将字段更新为null,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Opencv实现身份证OCR识别的示例详解

    Opencv实现身份证OCR识别的示例详解

    这篇文章主要为大家详细介绍了如何使用Opencv实现身份证OCR识别功能,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2024-03-03
  • 使用Java实现验证码程序

    使用Java实现验证码程序

    这篇文章主要为大家详细介绍了使用Java实现验证码程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java java.lang.InstantiationException异常案例详解

    Java java.lang.InstantiationException异常案例详解

    这篇文章主要介绍了Java java.lang.InstantiationException异常案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • IDEA一键生成方法的序列图神操作

    IDEA一键生成方法的序列图神操作

    为了能够更快更清晰地搞清对象之间的调用关系,我经常需要用到序列图。手动画序列图还是很麻烦费时的,不过 IDEA 提供了一个叫做SequenceDiagram 的插件帮助我们解决这个问题。通SequenceDiagram 这个插件,我们一键可以生成时序图
    2022-01-01
  • java设计模式之工厂模式实例详解

    java设计模式之工厂模式实例详解

    这篇文章主要介绍了java设计模式之工厂模式,结合具有实例形式分析了java工厂模式的概念、原理、实现与使用方法,需要的朋友可以参考下
    2017-09-09
  • 使用jxls自定义命令设置动态行高

    使用jxls自定义命令设置动态行高

    这篇文章主要介绍了使用jxls自定义命令设置动态行高,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • java实现百度坐标的摩卡托坐标与火星坐标转换的示例

    java实现百度坐标的摩卡托坐标与火星坐标转换的示例

    这篇文章主要介绍了java实现百度坐标的摩卡托坐标与火星坐标转换的示例,需要的朋友可以参考下
    2014-03-03
  • springcloud微服务基于redis集群的单点登录实现解析

    springcloud微服务基于redis集群的单点登录实现解析

    这篇文章主要介绍了springcloud微服务基于redis集群的单点登录实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论