【QT】使用NodeJS辅助转换Excel中的翻译文件

发布于 2020-09-30  4 次阅读


写在前面

如果不想看碎碎念的话跳过这节就好了,话说我也真是变得越来越啰嗦了,有些话也没有人可以倾诉,就写到文章里面了。最近公司乱七八糟的事儿越来越多了,难得让我过了一个还算轻松愉悦(nan wang)的五月,六月一开始就可真是阴云密布,相当头疼,都不能安安心心搞开发了。一天都在忙于处理各种OEM的修改、祖传软件的维护,挺难受的。

正文

接到一个订单是要给海外的客户提供软件,要做西班牙语的翻译工作。问题是咱们也不会西班牙语(Español)啊,只能把翻译的单词提取出来先弄成英文的列表,再交给客户去翻译。软件是使用QT开发的,有两个版本,QT5版本使用的ts语言文件,QT2版本使用的是po文件(最终都要生成qm文件才能用)。因此我们的工作流程就变成了这个样子:
1. 把ts/po文件中源语言的单词全部单独提取出来。ts还好说就是xml格式,po文件确实有些棘手。
2. 把单词列表放到Excel中,供客户进行翻译。
3. 使用客户翻译好的Excel文件,把单词还原到ts/po文件中。
整个过程描述起来无非就是A->B->A,但是由于单词数量不算少(ts文件大概3500行,单词数量1000左右,po文件2000余行,单词数量1300左右)

/**
 * 使用Nodejs脚本将翻译Excel表格转换为xml
 * author: CHNhawk
 * date: 20200610
 */
var xml2js = require('xml2js');
var fs = require('fs');
var xlsx = require("node-xlsx");

// xml -> json
var jsonBuilder = new xml2js.Builder({
    xmldec:{
        version:'1.0',
        encoding: 'utf-8'
    }
});

// json -> xml
var xmlParser = new xml2js.Parser({
    explicitArray: false,
    ignoreAttrs: true
});

// 获取xlsx
var translateList = xlsx.parse("8600.xlsx");

// 读取xml
fs.readFile('test.xml','utf-8',function(err, result){
    var xmlContent = result; 
    xmlParser.parseString(xmlContent, function (err, result) {
        var jsonContent = result;
        console.log('xml解析成json:'+JSON.stringify(jsonContent));

        fs.writeFile('data.json', JSON.stringify(jsonContent), function(err){
            if(err){
                console.log(err);
            }
        });

        console.log(jsonContent.TS.context[0].message.source);

        // 直接暴力遍历xlsx取出的数组,反正数据量也不算大
        for(let rowid in translateList[0]['data']){
            row = translateList[0]['data'][rowid];
            // source为源语言内容 translation为修改后的语言
            let source = row[0];
            let translation = row[1];
            // 遍历json对象进行替换
            for(let i = 0; i < jsonContent.TS.context.length; i++){
                let replaced = false;
                for(let j = 0; j < jsonContent.TS.context[i].message.length; j++){
                    // 搜索到对应的源语言
                    if(source == jsonContent.TS.context[i].message[j].source){
                        // 获取对应的translation 并使用正则表达式进行替换
                        // 若翻译一致则不替换
                        /* PS.该方法容易出错,暂时抛弃,不做优化
                        let origin = messageList[j].translation;
                        console.log("origin >> " + origin);
                        if(origin.length > 0 && origin != translation){
                            let reg = new RegExp(origin, 'g');
                            console.log("reg >> " + reg + " >> " + translation);
                            xmlContent = xmlContent.replace(reg, translation);
                            replaced = true;
                        }*/
                        // 直接使用新方法直接修改对应json的translation属性
                        jsonContent.TS.context[i].message[j].translation = translation;
                        break;
                    }
                }
                // 替换了就跳出
                if(replaced){
                    break;
                }
            }

        }
        // 修改后的json转换回xml 并保存为文件
        let json2xml = jsonBuilder.buildObject(jsonContent);
        fs.writeFile('Language.xml', json2xml, function(err){
            if(err){
                console.log(err);
            }
        });
    });
});

Comments


来自像素世界的代码家,创造第九艺术!