多语言结果集拦截器

以下代码是我项目的代码根据各自情况更改逻辑

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;
	}

语言配置文件写法
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值