1、在项目resources资源下,配置文件spring-servlet.xml
<!--国际化-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>i18n</value>
</list>
</property>
</bean>
<mvc:interceptors>
<!--国际化操作拦截器如果采用基于(Session/Cookie)则必须配置-->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
<!--SessionLocaleResolver配置-->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
2、在项目resources资源下添加转换中英语言的资源文件(key值)
3、Controller层返回值国际化,使用
先在每个Controller都继承的父类中封装根据语言环境转换语言的方法,根据页面中已设置好的中英文选择按钮保存cookie值,该方法可直接通过cookie值得到语言状态:
BaseController.java:
@Autowired
private ResourceBundleMessageSource messageSource;
/**
* 通过不同语言环境(中英),根据对应配置文件的key返回对应环境的value值
* @param key
* @return
*/
public String transformation(String key){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
messageSource.setDefaultEncoding("utf-8");
String languageType="zh-CN";//默认中文
String value =null;
Cookie[] cookies=request.getCookies();
if(cookies!=null&&cookies.length>0){
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userLanguage")){
languageType = cookie.getValue();
}
}
}
if(StringUtil.isNotBlank(languageType)){
if(languageType.equals("zh-CN")){
value = messageSource.getMessage(key,null, Locale.CHINESE);
}else{
value = messageSource.getMessage(key,null,Locale.ENGLISH);
}
}
return value;
}
然后在Controller层中可直接调用该方法转换:
/**
*删除信息
* @param ids
* @return
*/
@RequestMapping("delBuyInfoById")
@ResponseBody
public AppResult<String> delBuyInfoById(String ids){
logger.debug("删除信息");
AppResult<String> result = new AppResult<String>();
try {
buyInfoService.delBuyInfoById(ids);
result.setSuccessMsg(this.transformation("DeleteSuccessful"));//删除成功
} catch (Exception e) {
result.setFailMsg(this.transformation("DeleteFailed"));//删除失败
logger.error("删除信息出错" + e.getMessage());
e.printStackTrace();
}
return result;
}
4、Service层返回值国际化:
因为刚刚封装的方法在Controller层,service无法直接使用,只能在封装公用的I18NUtil.java方法,因为ResourceBundleMessageSource
不支持静态方法,service调用该方法时还需new一个对象。
I18NUtil.java:
package com.gzzhongtu.forklift.core;
import com.gzzhongtu.forklift.core.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.PostConstruct;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.Locale;
@Component
public class I18NUtil {
private ResourceBundleMessageSource messageSource;
public I18NUtil(){
messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("i18n");
}
/**
* 通过不同语言环境(中英),根据对应配置文件的key返回对应环境的value值
*
* @param key
* @return
*/
public String transformation(String key) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
messageSource.setDefaultEncoding("utf-8");
String languageType = "zh-CN";//默认中文
String value = null;
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userLanguage")) {
languageType = cookie.getValue();
}
}
}
if (StringUtil.isNotBlank(languageType)) {
if (languageType.equals("zh-CN")) {
//value = this.messageSource.getMessage(key, null, Locale.CHINESE);
value = messageSource.getMessage(key, null, Locale.CHINESE);
} else {
//value = this.messageSource.getMessage(key, null, Locale.ENGLISH);
value = messageSource.getMessage(key, null, Locale.ENGLISH);
}
}
return value;
}
}
Service层调用:
/**
* 更新
* @param buyInfoVo
* @return
*/
private AppResult<String> updateBuyInfo(BuyInfoVo buyInfoVo) {
I18NUtil I18N = new I18NUtil();
AppResult<String> result = new AppResult<String>();
if (this.checkCodeIsExist(buyInfoVo)) {
result.setFailMsg(I18N.transformation("CostOfTheVehicleAlreadyExists"));//修改失败,所选车辆费用已存在
}else {
buyInfoMapper.updateBuyInfo(buyInfoVo);
result.setSuccessMsg(I18N.transformation("SaveSuccessfully"));//保存成功
}
return result;
}