后台国际化问题

后台国际化问题

1.首先进行创建资源文件messages_en_US.properties、messages_zh_CN.properties,messages.properties语言配置文件。

2.初始化相关配置信息

指定message的basename,多个以逗号分隔,如果不加包名的话,默认从classpath路径开始,默认:messages

spring.messages.basename=i18n/messages

设定加载的资源文件缓存失效时间,-1的话为永不过期,默认为-1

spring.messages.cache-seconds= 3600

设定Message bundles的编码,默认: UTF-8

spring.messages.encoding=UTF-8

3.把语言的属性放在header信息中加上过滤器

如:头信息添加 Accept-Language

当调用接口返回参数是对日志进行过滤解析成对应语言

   @Around("webLog()")
    public Object arround(ProceedingJoinPoint pjp) {
        Object o;
        try {
            o =  pjp.proceed();
        } catch (Throwable e) {
            if(e instanceof BootException){
                BootException bootException = (BootException) e;
                o = new CommonReturnObject();
                ((CommonReturnObject) o).setCode(((BootException) e).getCode());
                ((CommonReturnObject) o).setDesc("");
            }else {
                e.printStackTrace();
                o = new CommonReturnObject(ServerReturnCodeEnum.SYS_ERROR_10);
                LOGGER.info(e.getMessage(),e.toString());
            }
        }

        String messageFound = i18nController.getMessage(((CommonReturnObject)o).getCode());
        ((CommonReturnObject)o).setDesc(messageFound);

//        System.out.println("方法的返回值 : " + JSONObject.toJSONString(o));
        LOGGER.info("方法的返回值 :{}",JSONObject.toJSONString(o));
        return o;
    }
    
    
    
    /**
     * 设置当前的返回信息
     *
     * @param code
     * @return
     */

    public String getMessage(String code) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        
        if (messageSource == null) {
            messageSource = initMessageSource();
        }
        String lauage = request.getHeader("Accept-Language");
        // 默认没有就是请求地区的语言
        Locale locale = null;
        if (lauage == null) {
            locale = request.getLocale();
        } else if ("en-US".equals(lauage.split(",")[0])||"en".equals(lauage.split(",")[0])) {
            locale = Locale.US;
        } else if ("zh-CN".equals(lauage.split(",")[0])) {
            locale = Locale.SIMPLIFIED_CHINESE;
        } // 其余的不正确的默认就是本地的语言
        else {
            locale = request.getLocale();
        }
        String result = null;
        try {
            result = messageSource.getMessage(code, null, locale);
        } catch (NoSuchMessageException e) {
            LOGGER.error("Cannot find the error message of internationalization, return the original error message.");
        }
        if (result == null) {
            return code;
        }
        return result;
    }

4.对于数据库层数据国际化有以下几种思路:

        1.数据库需要翻译的,建2个对应的表,一个表存中文,一个表存英文。

        2.需要翻译的表,里面一个中文列,一个英文列。  

        3.实现两个一个中文服务器一个英文服务器

        4,购买第三方翻译服务,对接口返回参数进行整体翻译(基本不建议用,机器翻译不准)

你可能感兴趣的:(后台国际化问题)