使用 nodeJs 实现 js/ts 文件翻译功能

关于实现翻译(以中翻英为例)的功能,咱们能够分红几个步骤:node

  • 读文件
  • 找出文中的中文
  • 将文中的出现的中文词组或者句子组成一哥数组
  • 调用公共的翻译接口进行异步翻译
  • 将翻译出来的英文回填会文件中

1、搭建环境

打开终端,键入:node -vgit

若是出现 -bash: node: command not found正则表达式

说明 node 的环境没有搭建。请到官网上下载。express

若是终端上出现:v10.16.0 相似这样的版本号,说明你的 node 环境搭建好啦。npm

2、读文件

咱们先读取固定的文件,后面咱们会尝试实现翻译上传的文件,有须要的小伙伴能够移步到后面的内容。json

首先咱们在文件夹下建立一个 replace.js 文件用来编写咱们的代码。数组

其次建立一个供咱们翻译的 js/ts 文件,如:DesUtils.ts,代码以下:promise

const desKeyObj = {
  desKey: 'ztesoftbasemobile20160812..',
  ivKey: '01234567890'
}
export default {
  /** * 加密 * @param dataStr */
  encrypt: function (dataStr) {
    try {
        console.log("若是这是一段话。而且还有标点符号。");
    } catch (error) {
        console.log('加密报错' + JSON.stringify(error));
    }
  },
  /** * * @param dataStr 解密 */
  crypto: function (dataStr) {
    try {
        console.log('');
    } catch (error) {
        console.log('解密报错')
    }
  }
}
复制代码

如今咱们开始编写 replace.js 文件,来读取 DesUtil.ts 文件。bash

首先咱们可使用 require 命令来引入咱们须要的模块。app

var fs = require('fs');
复制代码

node 对于文件的读写操做是基于 Stream 流的形式。

fs 模块下有四种流类型:

  • Readable - 可读操做
  • Writable - 可写操做
  • Duplex - 可读可写操做
  • Transform - 操做被写入数据,而后读出结果

对于流的操做也有四种:

  • data - 当有数据可读时触发
  • end - 没有更多的数据可读时触发
  • error - 在接收和写入过程当中发生错误时触发
  • finish - 全部数据已被写入到底层系统时触发

是否是看了有点懵呢,不着急,经过下面的代码你就能理解。

建立可读流,并处理流事件:

// 建立可读流
let readerStream = fs.createReadStream('DesUtils.ts');
readerStream.setEncoding('UTF8');

let data = '';

// 处理流
readerStream.on('data', (chunk) => {
   data += chunk;
});

readerStream.on('end',() => {
   console.log(data);
});

// 可不写
readerStream.on('error', (err) => {
   console.log(err.stack);
});
复制代码

在这里插入图片描述

读文件的代码咱们已经写完了,如今咱们尝试运行一下:

终端进入到该文件夹下,键入:node replace.js, 不出意外的话文件的内容已经完整的展现在终端上了。

3、列出文中的全部中文内容

data 上进行数据的处理,咱们要经过正则表达式将文中的中文取出来。在上面的代码上进行修改:

readerStream.on('data', (chunk) => {
  const reg = /[\u4e00-\u9fa5]/g;
  while(list = reg.exec(chunk)) {
    console.log(list[0]);
  }
})
复制代码

在这里插入图片描述

好了如今咱们已经把全部的中文所有取出来了,若是咱们的需求是删除中文的话,咱们只须要将这些中文删除便可。

若是是翻译成英文的话,总不能一个字一个字的翻译吧?

因此须要咱们将这个中文分类出来,该是词组的就存成词组,该是句子的就存成句子,用一个数组来进行存放。

个人方式是经过每一个字的索引进行判断。获取到中文与前一个中文索引相比是不是相邻关系,若是是,就不能拆开来,应该组成一个词语或者句子进行存储(可能小伙伴看不懂,大家直接分析代码吧~)

若是有更优的方法,小伙伴能够本身尝试哈~

readerStream.on('data', (chunk) => {

  var reg = /[\u4e00-\u9fa5]/g;
  let index = 0;
  let termList = [];    // 遍历获取到的中文数组
  let term = '';
  data = chunk;

  while (list = reg.exec(chunk)) {
    if ((list.index !== index + 1) && term) {
      termList.push(term);
      term = '';
    }
    term += list[0];
    index = list.index;
  }
  termList.push(term);
  console.log(termList);    // 打印中文数据
})
复制代码

在这里插入图片描述

经过上面的代码,咱们就已经把词组,句子等区分出来了。终端上就能看到数据 [ '加密', '若是这是一段话', '而且还有标点符号', '加密报错', '解密', '解密报错' ]

翻译的功能咱们放到下个模块去说,咱们如今先把获取到的中文内容替换成随意的内容。

4、替换中文

建立一个能够写入的流,将查询出来的中文替换成随便的字符。

// 建立一个能够写入的流,写入到文件 replaceDesUtils.ts 中
let writerStream = fs.createWriteStream('replaceDesUtils.ts');

readerStream.on('data', (chunk) => {

  var reg = /[\u4e00-\u9fa5]/g;
  let index = 0;
  let termList = [];    // 遍历获取到的中文数组
  let term = '';

  while (list = reg.exec(chunk)) {
    ...省略
  }
  if(termList && termList.length) {
    termList.map(item => {
      data = data.replace(item, '112233');      // 至此,已经将中文所有进行替换
    })
  }

  writerStream.end(data); // 将替换后的文件写入到 replaceDesUtils.ts 中去
})
复制代码

如今就能够发现当前包下多了一个 replaceDesUtils.ts 文件,快打开看看是否成功了吧。

5、实现翻译功能

在调用翻译的接口上,参考了基于nodejs实现一个有道词典翻译器 百度上的一个教程文档,小伙伴们能够作参考。

我粗略说下建立的步骤(里头有50元的额度,够咱们写 demo 测试用就是了~):

  • 打开有道智云注册下帐号
  • 登陆后在左边的 tab 上找到 天然语言翻译-翻译实例,建立新的实例,选择文本翻译(或者你能够选择其余的类型,我只尝试了文本翻译)
  • 打开左边 tab应用管理-个人应用,建立新的应用,接入类型 选择 API, 点击下一步后绑定刚建立的实例。
  • 查看应用详情里就有 应用ID应用密钥 这两个字段,分别对应一会须要用到的 appKeysecretKey.

在这里插入图片描述

接下来在该文件夹下建立一个 translator.js 文件,直接 copy 基于nodejs实现一个有道词典翻译器这里的代码就行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jQSSvVM7-1578552563377)(gitImg/nodeReplace/1-5.jpg)]

可是这个文件有一些须要用到的库咱们没有。须要咱们手动安装一下,步骤以下:

  • 一、在当前包下建立一个 package.json 文件,复制一下的代码:
{
  "dependencies": {
    "request": "^2.88.0",
    "request-promise": "^4.2.5"
  }
}
复制代码
  • 二、而后在终端上执行:npm i 或者 yarn,装上咱们须要的库。

好了继续在 replace.js 编写咱们的代码:

  • 引入翻译的文件,并实例化
  • 设置翻译的配置
  • 编写公共方法,进行翻译(小伙伴若是对 Promise 不太理解我下文有解释啊哈~)
  • 将中文进行翻译并写入文档中
var Translator = require('./translator');

let translator = new Translator();

translator.config = {
  from: 'zh_CHS',
  to: 'EN',
  appKey: '*********',
  secretKey: '****************'
}

function translateString(str) {
  return new Promise(function (resolve, reject) {
    let resultStr = translator.translate(str);
    resolve(resultStr);
  })
}
复制代码

这里先解释一下 translateString() 这个方法,由于咱们调用的翻译接口是异步的,若是不使用 Promise 会存在延迟问题。

Promise 提供了一种异步执行模式。

其提供的两个参数能够理解为 return, 经过 resolve 将须要的数据传递出去。这里咱们来个小小的测试

translateString('加油').then(val => {
  console.log(val);
})
复制代码

在这里插入图片描述

出来的数据是一大长串 JSON 字符串,咱们对此进行转义和截取下。console.log(JSON.parse(val).translation)

是否是发现翻译后的内容已经被咱们获取到了。

如今咱们继续来编写代码:

while (list = reg.exec(chunk)) {
  ...省略
}
termList.push(term);
console.log(termList);    // 打印中文数据
translateString(termList).then(val => {
  let translation = JSON.parse(val).translation;  // 这里能够打印一下数据,翻译出来的内容,就能够知道为何下文的代码要那样写了。
  let transList = [];     // 翻译后的数组

  if(translation[0] && translation[0].indexOf(',') !== -1) {

    transList = translation[0].split(', '); // 逗号后面有个空格不要漏了哈
    transList.map((item, index) => {
      console.log(termList[index], item);
      const res = data.replace(termList[index], item);
      data = res;
    })

    writerStream.write(data, 'UTF8');
    writerStream.end();
    console.log('写入完成');
  }
})
复制代码

在这里插入图片描述
在这里插入图片描述

好了小伙伴们,如今咱们打开 replaceDesUtils.ts 看看效果哈。

后面的文章会用到 express 进行文本操做,能够上传自定义的文件进行翻译。

相关文章
相关标签/搜索