帮以前同事解决一个需求,中文项目 翻译 英文项目~~~
考虑到具体实现方面的问题,如果智能的话,肯定是要做中文的语法分析,不过感觉这个有难度。
所以最后的方案是遍历文件,将中文短语匹配出来,再进行人工翻译,将中文短语替换成翻译的内容。当然后期还是需要人工再检验下,毕竟代码中的中文,可能会影响到相关的程序。
这个问题,明显涉及到 多线程,文件读写,第一时间就想到的是 nodejs,虽然nodejs是一个主线程,但是异步文件读写,事件响应机制,肯定也是调用了线程,在实际编程的时候不需要考虑线程的相关的问题。
代码不复杂如下,写完了之后,适当的封装了下
var fs = require('fs');
var http = require('http');
var filePath = 'D:\\WORK_new\\';
var logPath = 'D:\\chinese.log';
var map = {};
var num = 0;
var dictionary = (function () {
var map = {};
return {
logPath: 'D:\\chinese.log',
set: function (key, val) {
map[key] = val || '';
},
get: function (key) {
return map[key]||'';
},
save2File: function () {
fs.writeFile(this.logPath, JSON.stringify(map).replace(/","/g,'",\r\n"'),{encoding:'utf8',flag:'w'}, function (err) {
if (err) throw err;
});
},
loadFile: function (callback) {
fs.readFile(this.logPath, {encoding:'utf8'},function (err, data) {
map = JSON.parse(data);
callback();
})
},
translateByGoogle: function (callback) {
var index = 0;
for (var key in map) {
if (map[key] == '') {
index++;
(function (key) {
http.get("http://translate.google.cn/translate_a/t"+key, function(res) {
res.setEncoding('utf8');
var body = "";
res.on('data', function (chunk) {
body+=chunk;
}).on('end', function (){
var obj = eval('('+body+')');
map[key] = obj[0][0][0];
index--;
if (index == 0) {
callback();
}
});
}).on('error', function(e) {
console.log('http error');
index--;
if (index == 0) {
callback();
}
console.log("Got error: " + e.message);
});
})(key);
}
}
}
}
})();
function File () {
var index = 0;
var _readFile = function (pathStr, fileBack, doneBack) {
fs.readFile(pathStr,{encoding:'utf8'}, function (err, data) {
index--;
if (err) {
data = "";
console.log(err,pathStr)
//throw err;
}
fileBack(data,pathStr);
if (index == 0) {
doneBack();
}
});
};
var _walkDir = function (pathStr, fileBack, doneBack) {
fs.readdir(pathStr, function (err, files) {
files.forEach(function (file) {
if(fs.statSync(pathStr + '/' + file).isDirectory()){
_walkDir(pathStr + '/' + file, fileBack, doneBack);
} else {
if (/.js$|.html$|.htm$|.jsp$/.test(file)){
index ++;
_readFile(pathStr + '/' + file, fileBack, doneBack);
}
return;
}
});
});
}
this.walkDir = function (pathStr, fileBack, doneBack) {
index = 0;
_walkDir(pathStr, fileBack, doneBack);
}
}
//第一步 获取中文
dictionary.logPath = logPath;
new File().walkDir(filePath, function (data) {
if (!!data) {
var match = data.match(/[\u4e00-\u9faf]+/g);
if (!!match) {
match.forEach(function (mat) {
dictionary.set(mat);
})
}
}
}, function () {
console.log('获取中文 OK');
dictionary.save2File();
})
//第二步 google翻译
/*
dictionary.loadFile(function () {
dictionary.translateByGoogle(function () {
dictionary.save2File();
})
});
*/
//第三步 中文替换
/*
dictionary.loadFile(function () {
new File().walkDir(filePath, function (data,pathStr) {
fs.writeFile(pathStr, data.replace(/[\u4e00-\u9faf]+/g, function (ch) {
return dictionary.get(ch);
}),{encoding:'ascii',flag:'w'}, function (err) {
if (err) throw err;
});
}, function () {
console.log('中文替换 OK');
})
});
*/
问题还是有的
1.nodejs编码问题,在window环境下对GBK编码支持不好,主要是utf8文件的处理
2.效率上面可能可以再通过 线程进行优化,这块没做深入的考虑
3.匹配出来,可能有单个的标点符号的短语等情况,需要人工排查
实际情况中,文件是GBK的,还有些文件是utf8的,后来还是考虑通过 脚本语言 快手实现的时候,
1.文件编码的问题,判断通过搜索
判断文件首位3个字节是不是 ef bb bf,但是这个只是针对有BOM的utf8格式
对无BOM的utf8格式,需要进行字节特征码的判断(有难度,精力有限,使用了上面的方案,对于无BOM的情况,进行人工排查)。
2.因为快手多线程方便编程很简单,一直以为多线程肯定比单线程效率要好。实际情况却和想的不一样,单线程的比多线程的快多了。看来主要瓶颈还是在读写文件IO上面。
以上所述就是本文全部内容了,希望大家能够喜欢。
nodejs,中英文翻译
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。