All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openea.eap.module.system.service.language.I18nDataServiceImpl Maven / Gradle / Ivy

Go to download

system 模块下,我们放通用业务,支撑上层的核心业务。 例如说:用户、部门、权限、数据字典等等

The newest version!
package org.openea.eap.module.system.service.language;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.pinyin.PinyinUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.openea.eap.module.system.dal.dataobject.language.I18nJsonDataDO;
import org.openea.eap.module.system.dal.dataobject.permission.MenuDO;
import org.openea.eap.module.system.dal.mysql.language.I18nJsonDataMapper;
import org.openea.eap.module.system.dal.mysql.language.LangTypeMapper;
import org.openea.eap.module.system.service.permission.MenuServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.nio.charset.Charset;
import java.util.*;

@Service
@Slf4j
public class I18nDataServiceImpl implements I18nDataService {

    private static List langList = new ArrayList<>();
    static {
        // init by config,  BCP 47
        langList.add("en-US");
        langList.add("zh-CN");
        langList.add("zh-HK");
        langList.add("ja-JP");
    }

    @Resource
    private LangTypeMapper langTypeMapper;

    @Resource
    private I18nJsonDataMapper i18nJsonDataMapper;


    @Override
    public List getI18nSupportLangs() {
        return langList;
    }

    @Override
    public Map> getI18nDataMap(String langs, String modules) {
        // map>
        Map> mLang = new HashMap<>();
        i18nJsonDataMapper.selectList(new QueryWrapper()).forEach(jsonData -> {
            try{
                String i18nKey = jsonData.getAlias();
                if(StrUtil.isEmpty(i18nKey)){
                    if(StrUtil.isNotEmpty(jsonData.getModule())){
                        i18nKey = jsonData.getModule() + "." + jsonData.getName();
                    }else{
                        i18nKey = jsonData.getName();
                    }
                }
                JSONObject json = JSONUtil.parseObj(jsonData.getJson());
                String finalI18nKey = i18nKey;
                json.keySet().forEach(lang ->{
                    if(!mLang.containsKey(lang)){
                        mLang.put(lang, new HashMap<>());
                    }
                    mLang.get(lang).put(finalI18nKey, json.getStr(lang));
                });
            }catch(Exception e){
                log.warn("getI18nDataMap error:" + jsonData);
            }
        });
        return mLang;
    }

    @Override
    public JSONObject getI18nJsonByKey(String key){
        I18nJsonDataDO jsonDataDO = i18nJsonDataMapper.queryI18nJsonDataByKey(key);
        if(jsonDataDO!=null){
            String strJson = jsonDataDO.getJson();
            if(ObjectUtil.isNotEmpty(strJson)){
                return JSONUtil.parseObj(strJson);
            }
        }
        return null;
    }

    @Override
    public JSONObject getJsJson() {
        JSONObject jsJson = new JSONObject();
        // language
        Map> mapI18nData = getI18nDataMap("", "");
        mapI18nData.keySet().forEach( lang ->{
            jsJson.set(lang, i18n2JsJson(mapI18nData.get(lang)));
        });
        return jsJson;
    }

    @Override
    public JSONObject getLocaleMessageJson(String lang){
        if(ObjectUtil.isEmpty(lang)){
            lang = "zh-CN";
        }else if(lang.indexOf("zh")>-1){
            lang = "zh-CN";
        }else if(lang.indexOf("en")>-1){
            lang = "en-US";
        }else if(lang.indexOf("ja")>-1){
            lang = "ja-JP";
        }
        Map> mapI18nData = getI18nDataMap("", "");
        if(mapI18nData.containsKey(lang)){
            return i18n2JsJson(mapI18nData.get(lang));
        }
        lang = "zh-CN";
        if(mapI18nData.containsKey(lang)){
            return i18n2JsJson(mapI18nData.get(lang));
        }
        lang = mapI18nData.keySet().iterator().next();
        return i18n2JsJson(mapI18nData.get(lang));
    }


    @Override
    public Integer translateMenu(Collection menuList) {
        int count = 0;
        if(CollectionUtil.isEmpty(menuList)){
            return count;
        }
        List listInsertJsonData = new ArrayList<>();
        List listUpdateJsonData = new ArrayList<>();
        for(MenuDO menu: menuList){
            String i18nKey = MenuServiceImpl.getI18nKey(menu);
            I18nJsonDataDO menuJsonData = null;
            List jsonDataList = i18nJsonDataMapper.selectList(I18nJsonDataDO::getAlias, i18nKey);
            if(CollectionUtil.isEmpty(jsonDataList)){
                // 添加菜单翻译记录
                menuJsonData = new I18nJsonDataDO();
                // id , auto
                String type = "menu";
                if(i18nKey.startsWith("button")){
                    type = "button";
                }
                menuJsonData.setModule("menu");
                menuJsonData.setAlias(i18nKey);
                menuJsonData.setName(type+"-"+menu.getName());
                JSONObject i18nJson = autoTransMenu(type,menu.getAlias(), menu.getName(), StrUtil.byteLength(menu.getName(), Charset.forName("UTF-8")));
                if(ObjectUtil.isNotEmpty(i18nJson)){
                    menuJsonData.setJson(i18nJson.toString());
                    menuJsonData.setRemark("auto");
                }else {
                    // default
                    menuJsonData.setRemark("default");
                    i18nJson = new JSONObject();
                    i18nJson.set("zh-CN",  menu.getName());
                    menuJsonData.setJson(i18nJson.toString());
                }
                listInsertJsonData.add(menuJsonData);
                count++;
                // batch 100
                if(listInsertJsonData.size()>=100){
                    i18nJsonDataMapper.insertBatch(listInsertJsonData);
                    listInsertJsonData.clear();
                }
            }else{
                menuJsonData = jsonDataList.get(0);
                // todo 检查翻译是否空缺
                JSONObject i18nJson = JSONUtil.parseObj(menuJsonData.getJson());
                if(i18nJson==null || !i18nJson.containsKey("en-US") || !i18nJson.containsKey("ja-JP")){
                    String type = "menu";
                    if(i18nKey.startsWith("button")){
                        type = "button";
                    }
                    i18nJson = autoTransMenu(type,menu.getAlias(), menu.getName(), StrUtil.byteLength(menu.getName(), Charset.forName("UTF-8")));
                    if(ObjectUtil.isNotEmpty(i18nJson)){
                        menuJsonData.setJson(i18nJson.toString());
                        menuJsonData.setRemark("auto-update");
                        listUpdateJsonData.add(menuJsonData);
                        count++;
                        // batch 100
                        if(listUpdateJsonData.size()>=100){
                            i18nJsonDataMapper.updateBatch(listUpdateJsonData);
                            listUpdateJsonData.clear();
                        }
                    }
                }
            }
        }

        int countAdd = 0;
        if(CollectionUtil.isNotEmpty(listInsertJsonData)){
            countAdd = listInsertJsonData.size();
            i18nJsonDataMapper.insertBatch(listInsertJsonData);
            listInsertJsonData.clear();
        }
        int countUpdate = 0;
        if(CollectionUtil.isNotEmpty(listUpdateJsonData)){
            countUpdate = listUpdateJsonData.size();
            i18nJsonDataMapper.updateBatch(listUpdateJsonData);
            listUpdateJsonData.clear();
        }
        log.info(String.format("translateMenu total=%c, add=%c, update=%c",count, countAdd, countUpdate));
        return count;
    }

    @Override
    public String convertEnKey(String name, String type) {
        String enKey = null;
        // 特别处理
        if("menu".equalsIgnoreCase(type)){

        }else if("button".equalsIgnoreCase(type)){

        }
        // AI翻译
        if(ObjectUtil.isEmpty(enKey)){
            // TODO AI翻译
        }
        // 词典翻译
        if(ObjectUtil.isEmpty(enKey)){
            // 英文翻译
            try{
                enKey = TranslateUtil.translateText(name, "auto", "en-US");
            }catch (Exception e){
                log.debug(e.getMessage(), e);
            }
            // 转拼音
            if(ObjectUtil.isEmpty(enKey) || enKey.equalsIgnoreCase(name)){
                enKey = PinyinUtil.getPinyin(name, "-");
            }
            if(ObjectUtil.isNotEmpty(enKey)){
                enKey = enKey.replaceAll("  ","-").replaceAll(" ","-");
                enKey = StrUtil.toCamelCase(enKey, '-');
            }

        }
        // 默认处理
        if(ObjectUtil.isEmpty(enKey)){
            enKey = name;
        }
        return enKey;
    }

    @Override
    public JSONObject autoTransMenu(String type, String key, String name, int len) {
        JSONObject json = TranslateUtil.queryMenuI18n(type, key, name, len);
        if(json==null){
            json = new JSONObject();
            // type: menu偏向名词 button偏向动词
            json.set("zh-CN", name);
        }
        return json;
    }

    @Override
    public I18nJsonDataDO autoTransItem(I18nJsonDataDO i18nJsonData) {

        JSONObject json = JSONUtil.parseObj(i18nJsonData.getJson());
        String label = json.getStr("en-US");
        if(ObjectUtil.isEmpty(label)){
            label = json.getStr("zh-CN");
        }if(ObjectUtil.isEmpty(label)){
            label = json.getStr("ja-JP");
        }
        if(ObjectUtil.isEmpty(label)){
            json.put("warning","no data");
            i18nJsonData.setJson(json.toStringPretty());
            return i18nJsonData;
        }
        String finalLabel = label;
        langList.forEach(lang -> {
            String i18nLabel = TranslateUtil.translateText(finalLabel, "auto", lang);
            if(ObjectUtil.isNotEmpty(i18nLabel)){
                json.put(lang, i18nLabel);
            }
        });
        i18nJsonData.setJson(JSONUtil.toJsonStr(json));
        return i18nJsonData;
    }


    private JSONObject i18n2JsJson(Map mI18nData){
        JSONObject jsJson = new JSONObject();
        JSONObject pageJson = new JSONObject();
        mI18nData.keySet().forEach(key->{
            // menu/button
            if(key.startsWith("menu.") || key.startsWith("button.")){
                return;
            }
            // page
            if(key.startsWith("page.")){
                JSONUtil.putByPath(pageJson, key.substring(5, key.length()), mI18nData.get(key));
                return;
            }
            // other
            JSONUtil.putByPath(jsJson, key, mI18nData.get(key));
        });
        jsJson.putAll(pageJson);
        return jsJson;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy