關於實現翻譯(以中翻英爲例)的功能,咱們能夠分紅幾個步驟:node
打開終端,鍵入:node -v
git
若是出現 -bash: node: command not found
正則表達式
說明 node
的環境沒有搭建。請到官網上下載。express
若是終端上出現:v10.16.0
相似這樣的版本號,說明你的 node
環境搭建好啦。npm
咱們先讀取固定的文件,後面咱們會嘗試實現翻譯上傳的文件,有須要的小夥伴能夠移步到後面的內容。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
模塊下有四種流類型:
對於流的操做也有四種:
是否是看了有點懵呢,不着急,經過下面的代碼你就能理解。
建立可讀流,並處理流事件:
// 建立可讀流
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
, 不出意外的話文件的內容已經完整的展現在終端上了。
在 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); // 打印中文數據
})
複製代碼
經過上面的代碼,咱們就已經把詞組,句子等區分出來了。終端上就能看到數據 [ '加密', '若是這是一段話', '而且還有標點符號', '加密報錯', '解密', '解密報錯' ]
。
翻譯的功能咱們放到下個模塊去說,咱們如今先把獲取到的中文內容替換成隨意的內容。
建立一個能夠寫入的流,將查詢出來的中文替換成隨便的字符。
// 建立一個能夠寫入的流,寫入到文件 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
文件,快打開看看是否成功了吧。
在調用翻譯的接口上,參考了基於nodejs實現一個有道詞典翻譯器 百度上的一個教程文檔,小夥伴們能夠作參考。
我粗略說下建立的步驟(裏頭有50元的額度,夠咱們寫 demo 測試用就是了~):
tab
上找到 天然語言翻譯-翻譯實例
,建立新的實例,選擇文本翻譯
(或者你能夠選擇其餘的類型,我只嘗試了文本翻譯
)tab
上應用管理-個人應用
,建立新的應用,接入類型
選擇 API
, 點擊下一步後綁定剛建立的實例。應用ID
和 應用密鑰
這兩個字段,分別對應一會須要用到的 appKey
和 secretKey
.接下來在該文件夾下建立一個 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
進行文本操做,能夠上傳自定義的文件進行翻譯。