使用 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 進行文本操做,能夠上傳自定義的文件進行翻譯。

相關文章
相關標籤/搜索