虽然高考英语考了 135 分, 大学英语四级也过了, 可到现在, 写了两年代码, 经常在写一个变量的时候, 想半天也想不出来对应的英文单词是什么, 总不能很可 (sha) 爱 (bi) 的去用拼音吧, 最后还是只能去求助有道了. 虽然说打开有道网页, 然后输入词语翻译不算太麻烦, 担保每次都这样, 总觉得不够方便, 也不够逼格.
先来看看我现在用的工具好了, 首先安装 command-translator:
cnpm i -g command-translator
然后打开一个命令行直接翻译:
tl 翻译
- # 输出如下
- translate
- interpret
- translator
- interpreter
够简单了吧, 下面来看看怎么实现的.
在写这个工具之前, 我也用过一些插件, 如果你用 Alfred, 那么你应该已经用过一些翻译插件了. 后来我觉得它颜值没有自带的 spotlight 高, 所以就卸载了, 然后装了个 flashlight, 然而那里面的插件太少了, 有一个有道翻译插件, 然而只能英文翻译成中文, 要它何用? 最后打算自己写一个, 可折腾了两天后, 发现 flashlight 有问题, 似乎是识别不了输入的中文, 大概有道那个插件也是遇到这个问题, 才没有做中文翻译英文吧. 后来想着现在我们一般用 vscode 比较多, 写个 vscode 插件也不错吧. 然而 vscode 插件的命令中好像是带不了参数, 如果用一个命令来启动插件, 然后再输入要翻译的词语, 最后再显示翻译结果, 那还是太难用了. 最后想着就写个命令行里面的翻译工具吧, 对于前端程序员而言, node 肯定是装了的, 就用 node 来写.
其实有了思路后, 就很简单了. 首先是要拿到翻译的结果. 直接调用接口的很多, 有道官方也有, 不过都需要去申请一个 key, 个人比较反感, 就简单点, 直接爬网页, 分析 dom. 整个程序用了两个第三方模块: cheerio 处理 dom, 类似 jquery 的语法; commander 用来简化命令行交互, TJ 大神的大作.
首先爬取页面, 解析结果, 这里爬的是金山词霸的页面, 之前写论文时感觉对于一些专业词汇, 金山翻译的更准确. 几行代码就能搞定, 这里直接上代码好了:
- 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)))
- })
- }
然后我么调用导出的方法, 传参为需要翻译的词语, 中文英文都可以, 最后返回的就是一个数组, 为翻译结果.
最后要解决的是命令行直接输入 tl <word > 直接翻译, 这部分代码写在一个 js 文件中, 我把它叫做 bin.js, 然后在 package,json 配置一个 key 为 "tl" 的 bin, 指向 bin,js 即可. bin,js 就是获取 tl 后面的参数, 然后调用上面导出的那个方法来翻译, 最后把结果打印出来即可, 代码:
- #!/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 的? 都什么年代了, 还不学我, 来搞一波前端, 当年我可是写过 C 艹, 后来 C 艹艹, 再后来 Android,Java, 然后转前端的. 开玩笑啦, 看完这篇文章, 随便你用什么语言都能很快写一个这样的词典出来.
以后如果再看到你身边的朋友还在打开网页来翻译, 或者用拼音的, 直接把这篇文章丢给他把,
- Github: https://github.com/evolify/translator
- Npm:
- npm i -g command-translator
来源: https://juejin.im/post/5aef21c7518825672565c546