写在前面
如果不想看碎碎念的话跳过这节就好了,话说我也真是变得越来越啰嗦了,有些话也没有人可以倾诉,就写到文章里面了。最近公司乱七八糟的事儿越来越多了,难得让我过了一个还算轻松愉悦的五月,六月一开始就可真是阴云密布
,相当头疼,都不能安安心心搞开发了。一天都在忙于处理各种OEM的修改、祖传软件的维护,挺难受的。
正文
接到一个订单是要给海外的客户提供软件,要做西班牙语的翻译工作。问题是咱们也不会西班牙语啊,只能把翻译的单词提取出来先弄成英文的列表,再交给客户去翻译。软件是使用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 | NOTHING