1 解决思路:

客户端选择语言,然后将其加入cookie中传过来解析并切换语言包即可。主要用的是Locale和ResourceBundle类

 

2 首先编写拦截器中的拦截代码如下:

// 解析当前cookie,根据cookie处理当前语言包
Cookie[] cookies = httpServletRequest.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie item : cookies) {
if ("Abp.Localization.CultureName".equals(item.getName())) { //从cookie中取出当前语言的类型
//en_US、zh_CN
// 根据类型设置好当前的语言包
LangUtil.setLang(item.getValue(), custHttpServletRequest);
}
}
}
// 如果當前沒有設置,默認設置為中文語言包
if (custHttpServletRequest.getParameter("lang") == null) {
custHttpServletRequest.setParameter("lang.language", "zh");
custHttpServletRequest.setParameter("lang.country", "CN");
}

思路:获取cookie中的Abp.Localization.CultureName,并解析出后设置到request请求中。如果没有当前cookie,默认会设置为中文

 

3 编写对应的语言包工具类

/**
* 国际化语言工具包
* 用法:LangUtil.LANG.getString("helloWorld")
*/
public class LangUtil {


/**
* 设置语言包
* @param cookieVal [如zh_CN]
*/
public static void setLang(String cookieVal, CustHttpServletRequest custHttpServletRequest) {
// 解析cookieVal
if ("".equals(cookieVal) || !cookieVal.contains("-")) //cookie不合法的情况下
return;
// 解析cookieVal
String[] langArr = cookieVal.split("-");
String language = langArr[0];
String country = langArr[1];
LangEnum langEnum = LangEnum.getEnum(language, country);
if (langEnum == null) return;


// 将当前语言包配置到本次request请求中
custHttpServletRequest.setParameter("lang.language", language);
custHttpServletRequest.setParameter("lang.country", country);
}

/**
* 获取语言包
* @param request 本次请求
* @return 返回对应语言包
*/
public static ResourceBundle getLang(HttpServletRequest request) {
String language = request.getParameter("lang.language");
String country = request.getParameter("lang.country");
Locale locale = new Locale(language, country);
return ResourceBundle.getBundle("lang.content", locale);
}
}

思路:getLang、setLang方法解析cookie信息,并设置到request请求中

 

4 编写对应的枚举类LangEnum.java如下

/**
* 国际化语言包枚举类
*/
public enum LangEnum {
// US en
LANG_EN_US("en", "US"),
// CN zh
LANG_ZH_CN("zh", "CN");

// 语言
private String language;
// 国家
private String country;


LangEnum(String language, String country) {
this.language = language;
this.country = country;
}

/**
* 返回循环迭代列表
* @return 返回循环迭代列表
*/
public static List toList() {
List list = new ArrayList(); //Lists.newArrayList()其实和new ArrayList()几乎一模
for (LangEnum item : LangEnum.values()) {
Map<String, Object> map = new HashMap<>();
map.put("language", item.getLanguage());
map.put("country", item.getCountry());
list.add(map);
}
return list;
}
/**
* 获取对应enum
* @return enum
*/
public static LangEnum getEnum(String language, String country) {
for (LangEnum item : LangEnum.values()) {
if (language.equals(item.getLanguage()) && country.equals(item.getCountry())) return item;
}
return null;
}
public String getLanguage() {
return language;
}
public String getCountry() {
return country;
}
}

5 编写对应语言包的配置文件如下:

content_en_US.properties、content_en_US.properties

# 英文语言包

helloWorld = HelloWorld!

 

------------------------------------

# 中文语言包,需要将中文转为unicode编码,转换工具:http://tool.chinaz.com/tools/unicode.aspx

#世界,你好!

helloWorld = \u4e16\u754c\uff0c\u4f60\u597d\u0021