Spring Boot系列之项目国际化

670 阅读2分钟

PS:原文首发于微信公众号:躬行之(jzman-blog)

前面几篇文章尝试了接口开发、Thymeleaf 模板、常用语法及模板布局,阅读本文之前可以阅读前面几篇:

Spring Boot 项目的国际化实现起来非常简单,为了保证 Spring Boot 系列的连续性,其项目的国际化化也单独为一篇文章,主要内容如下:

  1. 区域解析器
  2. 创建国际化配置文件
  3. 创建配置类
  4. 测试效果

区域解析器

Spring 中提供区域解析器来识别用户区域,依次来实现 Web 应用程序的国际化,区域解析器必须实现 LocalResolver 接口,也可以实现实现该接口创建自己的区域解析器

  • AcceptHeaderLocaleResolver:默认区域解析器,通过 HTTP 请求的 accept-language 参数来解析区域;
  • SessionLocaleResolver:在当前会话有效,否则还原为默认状态;
  • CookieLocaleResolver:在当前 Cookie 有效期内有效,否则还原为默认状态;
  • FixedLocaleResolver:设置固定的 Local,不便于动态改变 Local;
  • 使用 LocaleChangeInterceptor 拦截器解析用户区域。

下面将以 LocaleChangeInterceptor 拦截器和 SessionLocaleResolver 为例实现 Spring Boot 项目的国际化。

创建国际化配置文件

Spring Boot 是支持国际化的,使用起来也比较方便,创建 Spring Boot 项目,在 resources 下创建一个名称为 i18n 的文件夹,然后右击依次选择 New->Resourc Bundle 创建于个语言对应的配置文件 home.properties 文件,如下:

躬行之

然后在配置文件 application.properties 文件中配置 Message 路径,如下:

# Message路径
spring.messages.basename=i18n.home

home.properties 属性文件中的值如何获取呢,如下:

mMessageSource.getMessage("home.title", null, LocaleContextHolder.getLocale());

创建配置类

使用 LocaleChangeInterceptor 拦截器和 SessionLocaleResolver,其设置的参数就是对应的 Local ,如下:

/**
 * I18nConfig
 */
@Configuration
public class I18nConfig {

    @Bean
    public LocaleResolver localeResolver (){
        return new SessionLocaleResolver();
    }

    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                LocaleChangeInterceptor changeInterceptor = new LocaleChangeInterceptor();
                changeInterceptor.setParamName("lang");
                registry.addInterceptor(changeInterceptor);
            }
        };
    }
}

案例代码

I18nController 如下:

@Controller
public class I18nController {
    
    @GetMapping(value = "/i18n")
    public String il8n() {
        return "i18n";
    }
}

模板文件如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
	<head>
		<meta charset="UTF-8">
		<title>Spring Boot I18n Sample.</title>

		<script>
			/**
			 * 页面加载完成后调用
			 */
			onload = function() {
				let href = window.location.toString();
				let suffix = href.substring(href.length - 2, href.length);
				let lang = document.getElementsByClassName("lang");
				console.log("--suffix--" + suffix);
				switch (suffix) {
					case "CN":
						setStatus(lang[0], lang[1], lang[2]);
						break;
					case "TW":
						setStatus(lang[1], lang[0], lang[2]);
						break;
					case "US":
						setStatus(lang[2], lang[1], lang[0]);
						break;
					default:
						setStatus(lang[0], lang[1], lang[2]);
				}
			};

			/**
			 * 设置语言标签状态
			 * @param show 已选择的语言标签
			 * @param def1 未选择的语言标签
			 * @param def2 未选择的语言标签
			 */
			function setStatus(show, def1, def2) {
				show.style.color = "rgb(0,0,255)";
				def1.style.color = "rgb(0,0,0)";
				def2.style.color = "rgb(0,0,0)";
			}
		</script>
	</head>
	<body>
		<h3 th:text="#{home.title}">default</h3>
		<p style="font-size: 12px">
			<a class="lang" href="i18n?lang=zh_CN"> 简体中文 </a>|
			<a class="lang" href="i18n?lang=zh_TW"> 繁体中文 </a>|
			<a class="lang" href="i18n?lang=en_US"> English</a>
		</p>
	</body>
</html>

测试效果

运行效果如下:

可关注公众号【躬行之】交流学习,回复关键字【Spring Boot】获取对应案例源码链接。