/**
* 批量对中文文本进行翻译,我自己用在了源代码中对中文注释翻译成英文,使用谷歌翻译完成
* nodejs +selenium实现,使用简单,一下步骤:
* 1、下载driver“chromedriver.storage.googleapis.com/71.0.3578.80/chromedriver_win32.zip” * 2、配置环境变量,在path加入“C:\\work\\source\\driver\\” 这是我的解压后的路径 * 3、创建一个nodejs项目,然后安装npm install selenium-webdriver * 4、设置好需要翻译的文件路径
* 5、checkFilePath可以设置忽略的路径,checkFileType 可以设置允许翻译的文本文件类型,不支持word */
let fs = require('fs'); let path = require('path'); //解析需要遍历的文件
let filePath = path.resolve('C:\\\\work\\\\workspace\\\\Indonesia\\\\kuliner-saya\\\\microservice_backend\\\\'); //存放文件路径的数组 let fileArr = [];
//存放中文翻译的结果
let translateMap=new Map();
var webdriver = require('selenium-webdriver'), By = webdriver.By, until = webdriver.until;
var driver = new webdriver.Builder() .forBrowser('chrome') .build(); /**
* 格式化时间 * @param fmt * @returns {*} * @constructor */
Date.prototype.Format = function(fmt) { var o = {
\ \ \ \ \
\ \ };
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + \ for (var k in o)
if (new RegExp(\
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((\o[k]).length))); return fmt; };
async function init() {
//初始化需要翻译的文件 fileDisplay(filePath); var len = fileArr.length; /* for(var i in fileArr){ console.log(fileArr[i]); }*/
// 初始化google翻译地址
await driver.get(\CN&tl=en\汉语 -> 英语
let source = await driver.wait(until.elementLocated(By.id('source')), 10000); var sb =null;
for(var i in fileArr){
sb = new StringBuffer();
sb.append(\
hh:mm:ss\lating file: \ console.log(sb.toString());
await analyticalFile(source,fileArr[i]); } }
init(); /**
* 调用谷歌翻译 */
async function translate(source,chinese){ await source.sendKeys(chinese);
let resElement = await driver.wait(until.elementLocated(By.className(\translation\
let str = await resElement.getText();
let clear = await driver.wait(until.elementLocated(By.className(\ await clear.click(); return str; }
/**
* 文件遍历方法
* @param filePath 需要遍历的文件路径 */
function fileDisplay(filePath){ if(!checkFilePath(filePath)){ return; }
//根据文件路径读取文件,返回文件列表 var files = fs.readdirSync(filePath); //遍历读取到的文件列表
files.forEach(function(filename){ //获取当前文件的绝对路径
var filedir = path.join(filePath,filename); var stats =fs.statSync(filedir); var isFile = stats.isFile();//是文件
var isDir = stats.isDirectory();//是文件夹 if(isFile && checkFileType(filedir)){ fileArr.push(filedir); }
if(isDir){
fileDisplay(filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件 } }); } /**
* 判断文件路径 * @param filePath
* @returns {boolean} true 不包含忽略的文件 false 包含忽略的文件 */
function checkFilePath(filePath){
var ignorePath = [\ for(var i in ignorePath){
if(filePath.indexOf(ignorePath[i]) != -1){ return false; } }
return true; }
/**
* 判断文件类型 * @param filedir
* @returns {boolean} true 允许翻译的文件 false 不允许翻译的文件 */
function checkFileType(filedir){ let idx = filedir.lastIndexOf(\ if(idx == -1){ return false; }
var availableSuffixs = [\ let suffix = filedir.substring(idx,filedir.length); if(availableSuffixs.indexOf(suffix) != -1){ return true; }
return false; } /**
* 读取文件
* @param filePath */
async function analyticalFile(source,filePath){ var data = fs.readFileSync(filePath, 'utf8'); //console.log(data);
var match = data.match(/[\一-\?]+/g); if (!!match) {
//排序把字符串长度越长的放在最前面 match.sort(function (a,b) { if (a.length < b.length) { return 1; } else { return -1; } });
//去重复与过滤短文本 match = uniqFilter(match);
//循环遍历文件中的中文进行翻译 var keyword = null; for(var i in match){ keyword = match[i];
if(translateMap.containsKey(keyword)){ continue; }
//console.log(keyword);
let res = await translate(source,keyword); //随机睡眠1-3秒,防止被识别 sleep(sum(1,3000));
translateMap.put(keyword,res) } }
//console.log(\ var tStr =null; //替换原来的内容 for(var n in match){ keyword = match[n];
//console.log(\ tStr = new StringBuffer();
tStr.append(keyword).append(\ data = data.replace(new RegExp(keyword, 'g'), tStr.toString()); }
//console.log(data); writeFile(data,filePath); }
function writeFile(data,filePath){
var w = fs.writeFileSync(filePath,data);
//console.log(\ } /**
* 程序随眠的时间 * @param sleepTime */
function sleep(sleepTime) {
var start = new Date().getTime(); while(true) {
if(new Date().getTime()-start > sleepTime){ break; } } } /**
* 取随机数