?雖然高考英語考了135分,大學(xué)英語四級也過了,可到現(xiàn)在喜鼓,寫了兩年代碼,經(jīng)常在寫一個變量的時候隅忿,想半天也想不出來對應(yīng)的英文單詞是什么,總不能很可 (sha) 愛(bi) 的去用拼音吧链峭,最后還是只能去求助有道了杖刷。雖然說打開有道網(wǎng)頁,然后輸入詞語翻譯不算太麻煩甜滨,擔(dān)保每次都這樣,總覺得不夠方便昭娩,也不夠逼格磕诊。
?先來看看我現(xiàn)在用的工具好了,首先安裝command-translator:
cnpm i -g command-translator
?然后打開一個命令行直接翻譯:
tl 翻譯
# 輸出如下
translate
interpret
translator
interpreter
?夠簡單了吧,下面來看看怎么實現(xiàn)的。
?在寫這個工具之前谅海,我也用過一些插件盲镶,如果你用Alfred, 那么你應(yīng)該已經(jīng)用過一些翻譯插件了送漠。后來我覺得它顏值沒有自帶的spotlight高尼酿,所以就卸載了思币,然后裝了個flashlight, 然而那里面的插件太少了惶我,有一個有道翻譯插件毅哗,然而只能英文翻譯成中文翅睛,要它何用酥艳?最后打算自己寫一個,可折騰了兩天后骤铃,發(fā)現(xiàn)flashlight有問題撕瞧,似乎是識別不了輸入的中文页畦,大概有道那個插件也是遇到這個問題好芭,才沒有做中文翻譯英文吧。后來想著現(xiàn)在我們一般用vscode比較多,寫個vscode插件也不錯吧信柿。然而vscode插件的命令中好像是帶不了參數(shù)形病,如果用一個命令來啟動插件,然后再輸入要翻譯的詞語,最后再顯示翻譯結(jié)果邢享,那還是太難用了。最后想著就寫個命令行里面的翻譯工具吧,對于前端程序員而言赠尾,node肯定是裝了的当窗,就用node來寫巫员。
?其實有了思路后疏遏,就很簡單了。首先是要拿到翻譯的結(jié)果拷泽。直接調(diào)用接口的很多,有道官方也有,不過都需要去申請一個key伟葫,個人比較反感眉睹,就簡單點竹海,直接爬網(wǎng)頁慕蔚,分析dom。整個程序用了兩個第三方模塊:cheerio處理dom斋配,類似jquery的語法孔飒;commander用來簡化命令行交互,TJ大神的大作艰争。
?首先爬取頁面坏瞄,解析結(jié)果,這里爬的是金山詞霸的頁面甩卓,之前寫論文時感覺對于一些專業(yè)詞匯鸠匀,金山翻譯的更準(zhǔn)確。幾行代碼就能搞定逾柿,這里直接上代碼好了:
const http = require('http')
const cheerio = require('cheerio')
const baseUrl = "http://www.iciba.com/"
function spider(word){
return new Promise((resolve,reject)=>{
http.get(encodeURI(baseUrl+word),res=>{
let html=''
res.on('data',data=>html+=data)
res.on('end',()=>resolve(html))
})
})
}
function parse(html){
const ch = cheerio.load(html)
const res = []
ch(".js-base-info .in-base .base-list p span").each((i,el)=>{
res.push(ch(el).text().replace(new RegExp('缀棍;'),''))
})
return res
}
module.exports = function(word){
return new Promise((resolve,reject)=>{
spider(word).then(html=> resolve(parse(html)))
})
}
?然后我么調(diào)用導(dǎo)出的方法宅此,傳參為需要翻譯的詞語,中文英文都可以爬范,最后返回的就是一個數(shù)組父腕,為翻譯結(jié)果。
?最后要解決的是命令行直接輸入tl <word>
直接翻譯青瀑,這部分代碼寫在一個js文件中璧亮,我把它叫做bin.js, 然后在package,json配置一個key為"tl"的bin,指向bin,js即可狱窘。bin,js就是獲取tl后面的參數(shù)杜顺,然后調(diào)用上面導(dǎo)出的那個方法來翻譯财搁,最后把結(jié)果打印出來即可蘸炸,代碼:
#!/usr/bin/env node
const program = require('commander')
const translate = require('./translator')
program.version(require('./package.json').version)
.action((arg,cmd)=>{
translate(arg).then((res=[])=>{
res.forEach(r=>console.log(r)
})
})
.parse(process.argv)
?OK了,以后翻譯只需快捷鍵打開終端尖奔,輸入tl <word>
就可以了搭儒。
?什么?你不用node提茁,你是寫java的淹禾?都什么年代了,還不學(xué)我茴扁,來搞一波前端铃岔,當(dāng)年我可是寫過C艸,后來C艸艸,再后來Android、Java峭火,然后轉(zhuǎn)前端的毁习。開玩笑啦,看完這篇文章卖丸,隨便你用什么語言都能很快寫一個這樣的詞典出來纺且。
?以后如果再看到你身邊的朋友還在打開網(wǎng)頁來翻譯,或者用拼音的稍浆,直接把這篇文章丟給他把载碌,
- Github: https://github.com/evolify/translator
- Npm:
npm i -g command-translator