SpringBoot + Freemarker国际化

freemarker
国际化
#1

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>

环境切换

默认的环境是中文

image

切换到英文

http://localhost/test?_lang=en_US

image

在程序中获取到当前的语言环境

spring提供了一个 LocaleContextHolder,可以获取到当前的语言环境

Locale locale = LocaleContextHolder.getLocale()