Spring Boot
- 前言
- 国际化
前言
在 Spring MVC:视图与视图解析器 的文章中,介绍过使用 Jstl 的 fmt 标签实现国际化,Spring MVC 会把视图由 InternalResourceViewResolver 转换为 JstlView(InternalResourceView 的子类)。下面简单介绍 Spring Boot 国际化的实现。
国际化
在软件开发中,国际化( Internationalization 简称 I18n ),是支持多种语言能够在不同的国家和地区使用,满足当地用户需求。
简单示例:
首先,在 templates 目录下创建一个页面 HelloWorld.html ,使用 a 标签进行语言环境切换
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
</head>
<body>
<a th:href="@{/HelloWorld.html(language='zh')}">中文</a> | <a th:href="@{/HelloWorld.html(language='en')}">英文</a>
<p th:text="#{I18nTest}"></p>
</body>
</html>
然后,创建 CustomComponent (自定义组件)包并在包内创建一个 CustomRegionParser (自定义区域解析器)类,通过实现 LocaleResolver 接口的 resolveLocale() 方法,来定义成一个区域解析器
package cn.edu.SpringBootInternationalizationDemo.CustomComponent;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.LocaleResolver;
import org.thymeleaf.util.StringUtils;
import java.util.Locale;
// 创建一个 CustomRegionParser 类,实现 LocaleResolver 接口的 resolveLocale() 方法,来定义成一个区域解析器
public class CustomRegionParser implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
// 接收页面上的 language 参数值
String language = request.getParameter("language");
// 如果 language 参数上没有传值,默认的是当地语言
Locale locale = Locale.getDefault();
// 如果传值,判断并将该语言设置为当地语言
if(!StringUtils.isEmpty(language)){
if("zh".equals(language)){
locale = new Locale("zh","CN");
}
if("en".equals(language)){
locale = new Locale("en","US");
}
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
接着,创建 Configuration 包并在包内创建一个 CustomRegionParserConfiguration 类,将区域解析器注入到 Spring IoC 容器当中
package cn.edu.SpringBootInternationalizationDemo.Configuration;
import cn.edu.SpringBootInternationalizationDemo.CustomComponent.CustomRegionParser;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
// 将区域解析器注入到 Spring IoC 容器当中
@Configuration
public class CustomRegionParserConfiguration {
@Bean
public LocaleResolver localeResolver(){
return new CustomRegionParser();
}
}
随之,创建 Controller 包并在包内创建一个 I18nController 类
package cn.edu.SpringBootInternationalizationDemo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class I18nController {
@GetMapping("/HelloWorld.html")
public String HelloWorld(){
return "HelloWorld";
}
}
再在 resources 目录下创建 messages.properties 、messages_zh_CN.properties 、messages_en_US.properties 国际化配置文件( 文件通常命名为 messages_语言代码.properties ),并进行相应配置
messages.properties:
I18nTest=你好世界(默认)
messages_zh_CN.properties:
I18nTest=你好世界(中文版)
messages_en_US.properties:
I18nTest=Hello World(英文版)
最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/HelloWorld.html 并按下回车键进行测试
结果如图:
1.当地语言默认为中文
2.切换为中文语言
3.切换为英文语言