SpringBoot + Freemarker国际化
关于国际化就不去解释了,直接开始
freemarker依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
资源文件配置
- 在
resources
目录下,新建文件夹:i18n
- 在文件夹里面根据需求添加N多个资源文件
message_<语言>_<国别>.properties
目录结构
i18n
|-message.properties
|-message_zh_CN.properties
|-message_en_US.properties
文件内容
key
固定为英文,如果value
是汉字,要注意使用Unicode
编码
# message_zh_CN.properties
name=\u540d\u5b57
# message_en_US.properties
name=name
yam配置
spring:
messages:
# 配置资源文件的前缀
basename: i18n/message
# freemarker配置
freemarker:
enabled: true
content-type: text/html
charset: utf-8
suffix: .ftl
request-context-attribute: request
expose-request-attributes: true
expose-session-attributes: true
check-template-location: true
# 暴露spring提供的freemarker宏
expose-spring-macro-helpers: true
template-loader-path:
- classpath:/templates/
settings:
datetime_format: yyyy-MM-dd HH:mm:ss
LocaleResolver & LocaleChangeInterceptor 配置
LocaleResolver
一个抽象的接口,用于解析和设置客户端的语言环境,有很多不同的实现,可以根据需要选择
- CookieLocaleResolver
根据cookie来确定客户端的语言环境(常用)
- AcceptHeaderLocaleResolver
根据客户的语言头来确定客户端的语言环境
- …
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
// 设置默认的环境
cookieLocaleResolver.setDefaultLocale(Locale.CHINA);
// 具备N多关于cookie属性的api
cookieLocaleResolver.setCookieName("_i18n");
cookieLocaleResolver.setCookieMaxAge(SECONDS_OF_YEAR);
return cookieLocaleResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
// 实现语言切换的拦截器
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
// 切换语言的参数
localeChangeInterceptor.setParamName("_lang");
return localeChangeInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 通过拦截器来完成语言环境的切换(可以设置专门的拦截路径)
registry.addInterceptor(this.localeChangeInterceptor());
}
在视图中使用国际化资源
spring提供的宏位置:
org/springframework/web/servlet/view/freemarker/spring.ftl
<!-- 导入spring提供的宏 -->
<#import "/spring.ftl" as spring/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<!--
使用 message 宏来访问国际化资源
-->
<@spring.message code='name'/><br/>
</body>
</html>
环境切换
默认的环境是中文
切换到英文
在程序中获取到当前的语言环境
spring提供了一个
LocaleContextHolder
,可以获取到当前的语言环境
Locale locale = LocaleContextHolder.getLocale()