以下代码是我项目的代码根据各自情况更改逻辑
package com.lesso.common.security;
import javax.servlet.http.HttpServletRequest;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.lesso.common.constant.SystemKey;
import com.lesso.common.enumeration.DeleteFlag;
import com.lesso.common.network.Response;
import com.lesso.pojo.language.LangContrast;
import com.lesso.service.language.LangContrastService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import com.lesso.common.network.Response.Meta;
import com.lesso.control.BaseController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author
* @version 创建时间:2019年9月16日 下午12:01:08
*/
@ControllerAdvice
public class ResponseControllerAdviceUtil extends BaseController implements ResponseBodyAdvice<Object> {
@Autowired
LangContrastService langContrastService;
// private String appClient;
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("X-Token");
if (token == null) {
return o;
}
Response re = (Response) o;
Meta meta = re.getMeta();
Object data = re.getData();
// && !getLangKey(request).equals("zh_lang")
if (meta.getMessage() != null && meta.getMessage().equals(SystemKey.ERROR_KEY) && data != null) {
JSONObject json = (JSONObject) JSONObject.toJSON(data);
if (json != null && json.size() > 0) {
Map<String, Object> result = new HashMap<>();
String object = json.get(SystemKey.ERROR_KEY).toString();
String strChar = object.substring(0, 1);
if (strChar.equals("[")) {
//代表集合
// System.out.println("===集合==="+object);
JSONArray array = json.getJSONArray(SystemKey.ERROR_KEY);
if (array != null && array.size() > 0) {
List<String> list = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
list.add(getLangContrast(array.get(i).toString(), request));
}
result.put(SystemKey.ERROR_KEY, list);
re.failureObj(result);
return re;
}
} else {
result.put(SystemKey.ERROR_KEY, getLangContrast(object, request));
re.failureObj(result);
return re;
}
}
} else {
if (meta != null && meta.getMessage() != null && getLangKey(request) != null
&& getLangKey(request) != "" && !getLangKey(request).equals("zh_lang") && !meta.getMessage().equals("ok")) {
meta.setMessage(getLangContrast(meta.getMessage(), request));
return re;
}
}
return o;
}
/**
* 获取对应的语言
* str 翻译的中文
*/
public String getLangContrast(String str, HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
// map.put("langId", getLangId(request));
map.put("langId", 2);
map.put("keyword", getNumberWord(str.trim(), 1, null, 0, 0));
map.put("byOne", 1);
map.put("delflag", DeleteFlag.VALID.getCode());
List<LangContrast> list = langContrastService.getLangKeyByNameSon(map);
if (list != null && list.size() > 0) {
return getNumberWord(str.trim(), 1, list.get(0).getLang(), 0, 0);
} else {
System.err.println("===未解析到===" + str);
}
return str;
}
/**
* 根据字符串判断是否有数字[]符号包括
* str 中文
* number 初始为1
* trans 转换后的语言
* firstIndex 初始为0
* theIndex 初始为0
*/
public static String getNumberWord(String str, int number, String trans, int firstIndex, int theIndex) {
if (str.indexOf("[", firstIndex) != -1 && str.indexOf("]", theIndex) != -1 && trans != null) {
String flag = str.substring(str.indexOf("[", firstIndex) + 1, str.indexOf("]", theIndex));
if (trans.indexOf("[" + number + "n]") != -1) {
StringBuilder sb = new StringBuilder(trans);
sb.replace(trans.indexOf("[" + number + "n]"), trans.indexOf("]", trans.indexOf("[" + number + "n]")) + 1, "[" + flag + "]");
if (sb.toString().indexOf("[", str.indexOf("[", firstIndex) + 1) != -1 && sb.toString().indexOf("]", str.indexOf("[", theIndex) + 1) != -1) {
return getNumberWord(str, number + 1, sb.toString(), str.indexOf("[", firstIndex) + 1, str.indexOf("]", theIndex) + 1);
}
return sb.toString();
} else {
System.err.println("===数据库未写n=====" + str);
}
}
if (trans != null) {
return trans;
}
if (StringUtils.isNotBlank(str) && str.indexOf("[", firstIndex) != -1 && str.indexOf("]", theIndex) != -1) {
StringBuilder sb = new StringBuilder(str);
sb.replace(str.indexOf("[", firstIndex), str.indexOf("]", theIndex) + 1, "[" + number + "n" + "]");
if (sb.toString().indexOf("[", str.indexOf("[", firstIndex) + 1) != -1 && sb.toString().indexOf("]", str.indexOf("[", theIndex) + 1) != -1) {
return getNumberWord(sb.toString(), number + 1, null, str.indexOf("[", firstIndex) + 1, str.indexOf("]", theIndex) + 1);
}
return sb.toString();
}
return str;
}
/**
* 先把:转换成,
* 在把字符串=转换成:
*/
public String getChangeUtil(String str) {
str = str.replaceAll(":", ",").replaceAll(":", ",").replaceAll(",", ",");
str = str.replaceAll("=", ":");
return str;
}
}
登录创建保存语言标识
1.保存在token–Redis里面
下面我说第二种
// langkey 代表语言标识 保存早session里面
if(!StringUtil.isEmpty(langKey)) {
param.put("langKey", langKey.trim());
request.getSession().setAttribute("lang_key", langKey.trim());
}
在全局解决写获取中文的name,读取语言配置文件
/**
* name 需要翻译的中文
* */
public static String getLangName(String name){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String langKey=String.valueOf(request.getSession().getAttribute("lang_key"));
if(langKey == null || langKey == ""){
langKey = "zh_lang";
}
Locale localUS = new Locale(langKey);
ResourceBundle bundle = null;
try {
bundle = ResourceBundle.getBundle("language/lang",localUS);
}catch (Exception e){
System.err.println("=====文件名错误====="+langKey);
return name;
}
String lang = name;
try {
lang = bundle.getString(name);
}catch (Exception e){
System.err.println("=====未找到====="+name);
lang = name;
}
return lang;
}
语言配置文件写法