一、 环境搭建
1.1 依赖包版本
jdk版本 1.8
spring版本 4.1.6.RELEASE
javax.servlet版本 3.0.1
1.2 Maven配置
<properties>
<org.springframework.version>4.1.6.RELEASE</org.springframework.version>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- j2ee -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
二、国际化配置步骤
在环境搭建完成后,我们开始配置国际化。基本的实现思路就是根据每个请求的请求头中的地区信息,也就是Accept-Language来识别地区,如下所示。识别请求所属的地区后,利用Spring的ResourceBundleMessageSource来获取对应语言版本资源文件中的信息即可。
Accept-Language:zh-CN,zh;q=0.8
2.1 新建国际化资源文件resource bundle
我们在项目文件resource文件夹下创建一个locale文件夹,用于存放不同语言版本的资源文件,资源文件的名称格式为:
文件名_对应语言英文简称.properties,如message_zh.properties和message_en.properties
创建完成后,在资源文件内加入需要替换的字段信息,以键值对形式排列:
在message_zh.properties中添加: message.hi=你好
在message_en.properties中添加: message.hi=hi
2.2 在spring配置文件中添加messageSource:
在Spring配置文件中增加id为messageSource的bean,将资源文件读取到messageSource中。
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<!-- 这里设置资源文件地址,这里只要填文件名就可以了,不需要填语言类型的后缀 -->
<value>locale.message</value>
</list>
</property>
<!-- 设置字符编码utf8 -->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
2.3 创建LocaleType类:
创建一个用于记录和转换语言版本的LocaleType类,将上面创建的messageSource注入,用于获取资源文件中对应的文本信息。将该类注册到spring容器,在需要使用的地方直接注入即可。
@Component
public class LocaleType {
@Autowired
private MessageSource messageSource;
private static ThreadLocal<Locale> threadLocal = new NamedThreadLocal<Locale>("language_threadLocal");
public static void setLocale(Locale locale) {
threadLocal.set(locale);
}
public String getMessage(String key) {
return messageSource.getMessage(key,null,threadLocal.get());
}
}
2.4 创建LocaleInterceptor类
创建一个LocaleInterceptor,用于拦截请求,获取请求头中的地区信息并利用已创建的LocalType类保存,如下所示:
@Component("localeInterceptor")
public class LocaleInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
Locale locale = request.getLocale();
if (locale != null) {
LocaleType.setLocale(locale);
} else {
//请求头中不包含地区信息则设置为中国
LocaleType.setLocale(Locale.CHINA);
}
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
2.5 在SpringMVC配置文件中添加拦截器:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<ref bean="localeInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
2.6 在需要使用语言版本转换的地方注入LocaleType类:
@RestController
public class TestController {
@Autowired
private LocaleType localeType;
@RequestMapping(value = "/test",method = RequestMethod.GET)
public String getMessage() {
String message = localeType.getMessage("message.hi");
System.out.println("get message: " + message);
return message;
}
}
三、测试运行
我们使用postman发送请求进行测试,分别在请求头中选择zh和en两种语言版本发送:
控制台打印信息:get message: hi
控制台打印信息:get message: 你好
四、项目github地址:
本项目github地址:git@github.com:cokiMing/i18demo.git