本文使用IDEA基于SpringMVC项目实现国际化功能。
创建国际化properties文件:
language_en_US.properties:
username=username
password=password
language_zh_CN.properties:
username=用户名
password=密码
SpringMVC配置文件:
<!-- MVC注解器,启用注释-->
<mvc:annotation-driven>
<!-- 消息转换器(解决@ResponseBody返回中文乱码问题)-->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/plain;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 国际化-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 定义国际化文件前缀-->
<property name="basename" value="language"></property>
<!-- 配置默认编码-->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
Controller类:
使用SpringMVC配置文件配置的ResourceBundleMessageSource的bean对象获取对应的国际化文件中的值。
@Controller
public class InternationalController {
@Autowired
private MessageSource messageSource;
@GetMapping("/international")
@ResponseBody
public String international() {
String username = messageSource.getMessage("username", null, LocaleContextHolder.getLocale());
String password = messageSource.getMessage("password", null, LocaleContextHolder.getLocale());
return username + ", " + password;
}
}
使用PostMan模拟http请求访问Controller:
在以上的配置信息中,默认的国际化实现是:由请求头中Accept-Language信息决定启用哪个国际化文件。
那如果不想使用这种通过设置请求头信息的方法,而希望能够使用请求参数的方式是否可以呢?
答案是肯定的,可以通过 SessionLocaleResolver 或者 CookieLocaleResolver 都可以实现。
SpringMVC配置文件添加多一项bean配置,以及拦截器配置:
<!-- 将解析出来的国际化配置信息保存在session中(注意id只能是localeResolver)-->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
<!-- 将解析出来的国际化配置信息保存在cookie中-->
<!-- <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"></bean>-->
<!-- 国际化拦截器(支持url设置语言参数lang)-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有请求-->
<mvc:mapping path="/**"/>
<bean id="interceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<!-- 通过url的lang参数决定国际化-->
<property name="paramName" value="lang"></property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
再次使用PostMan发送请求测试:
这次是直接在url末尾拼接上参数lang,指定国际化信息。
那如果不依赖拦截器是否可以呢?
答案也是肯定的。
首先删除SpringMVC配置文件中拦截器相关配置,然后对Controller类进行如下改造:
@Controller
public class InternationalController {
@Autowired
private MessageSource messageSource;
@GetMapping("/international")
@ResponseBody
public String international(String lang, HttpSession session) {
Locale locale = null;
switch (lang) {
case "zh-CN":
locale = new Locale("zh", "CN");
break;
case "en-US":
locale = new Locale("en", "US");
break;
}
String username = messageSource.getMessage("username", null, locale);
String password = messageSource.getMessage("password", null, locale);
return username + ", " + password;
}
}