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

作者:云天 时间:2023-11-24 06:01:01 

前言

开发传统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.运行效果分别如下

默认为中文语言环境

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

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

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

资料

  • Spring Cloud Feign 示例源码

  • Spring Boot、Spring Cloud示例学习

总结

来源:https://www.cnblogs.com/tqlin/p/11612546.html

标签:springboot,国际化,thymeleaf
0
投稿

猜你喜欢

  • 关于Object中equals方法和hashCode方法判断的分析

    2023-12-23 19:41:53
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    2023-06-08 11:32:26
  • Android实现自定义的卫星式菜单(弧形菜单)详解

    2023-03-03 14:16:51
  • c#动态加载卸载DLL的方法

    2023-06-08 08:18:08
  • android仿微信通讯录搜索示例(匹配拼音,字母,索引位置)

    2023-02-22 16:18:35
  • C++实现扫雷游戏示例讲解

    2022-05-03 18:49:05
  • Android 6.0指纹识别App开发案例

    2021-06-05 10:30:07
  • Android实现可拖动层叠卡片布局

    2023-03-25 03:28:06
  • Java结构型设计模式之享元模式示例详解

    2022-05-16 21:41:10
  • 深入了解Java Synchronized锁升级过程

    2021-12-12 08:13:45
  • java编译器和JVM的区别

    2023-07-18 20:34:48
  • Android中ListView如何分页加载数据

    2023-09-08 18:44:35
  • JAVA多线程知识汇总

    2021-08-03 09:04:47
  • java 进制转换实例详解

    2023-07-05 11:53:45
  • Mybatis 动态SQL的几种实现方法

    2023-11-10 12:15:15
  • 解析在内部循环中Continue外部循环的使用详解

    2023-09-24 08:03:50
  • C#实现一键换IP、重置DNS、网关及掩码的方法

    2021-10-03 00:32:33
  • Apache和Tomcat有什么区别_动力节点Java学院整理

    2023-08-15 08:49:44
  • 浅谈Java多线程编程中Boolean常量的同步问题

    2021-06-20 16:36:26
  • 利用Spring Boot和JPA创建GraphQL API

    2023-04-01 07:11:41
  • asp之家 软件编程 m.aspxhome.com