Node.js 制作命令行翻译工具

基本思路

  1. 在node.js中使用百度翻译API进行文字翻译。
  2. 通过第一个字符的值为a~z或A~Z来判断是中译英还是英译中。
  3. 全程使用ts进行类型申明。

 

方法实现

安装 commander

yarn add commander

安装 ts-node-dev 

yarn add ts-node-dev --dev

安装 md5

yarn add md5 

入口文件cli.ts

#!/usr/bin/env node
import * as commander from "commander";
import {translate} from './main'
const pkg = require('../package.json')
const program = new commander.Command()

program.
    version(pkg.version)
    .name('fy')
    .usage('<English>')
    .arguments('<English>')
    .action((english) => {
        translate(english)
    });

program.parse(process.argv)

主内容文件 main.ts

import md5 from "md5"; // md5签名算法
import {appId, appSecret} from "./private";
import * as querystring from "querystring";
import * as https from "https"; //node https模块

type ErrorMap = { // 申明错误类型
    [key: string]: string
}

const errorMap: ErrorMap = {
    52003: '用户认证失败',
    52001: '签名错误',
    52004: '账户余额不足',
}


export const translate = (word: string) => {
    const salt = Math.random()
    const sign = md5(appId + word + salt + appSecret)
    let from, to

    if (/[a-zA-Z]/.test(word[0])) {
        from = 'en'
        to = 'zh'
    } else {
        from = 'zh'
        to = 'en'
    }

    const query: string = querystring.stringify({
        q: word, appid: appId, salt, sign, from, to,
    })
    const options = {
        hostname:'api.fanyi.baidu.com',
        port: 443,
        path: '/api/trans/vip/translate?' + query,
        method: 'GET'
    }

    const request = https.request(options, response => {
        // Buffer(缓冲区) 处理像TCP流或文件流时,必须使用到二进制数据。因此node.js中Buffer类用来专门存放二进制数据的缓存区
        let chunks: Buffer[] = []
        response.on('data', chunk => {
            chunks.push(chunk)
        })
        response.on('end', ()=> {
            const string = Buffer.concat(chunks).toString()
            type BaiduResult = {
                error_code?: string;
                error_msg?: string;
                from: string;
                to: string;
                trans_result: {src: string; dst: string}[]
            }
            const object: BaiduResult = JSON.parse(string)
            if (object.error_code) {
                console.error(errorMap[object.error_code] || object.error_msg)
                process.exit(2) // 因错误而结束进程
            } else {
                object.trans_result.map(object => {
                    console.log(object.dst);
                })
                process.exit(0) // 因正确而结束进程
            }
        })
    })

    request.on('error', err => {
        console.error(err)
    })
    request.end()
}

全局安装typescript

yarn global add typescript

生成ts config配置文件 

tsc --init

 修改outDir,将目录改为dist/。

这时可在命令行输入命令tsc,查看typescript语法有无报错。 

 

自动生成dist目录,将ts编译为js文件 

tsc -p .

修改package.json文件 

"bin": {
    "fy": "dist/cli.js" // 我这里的翻译工具的命令行开头取名为 fy,例如 fy hello,你可以自己改。 
  },

最后就可以发布到npm,通过npm使用自己的命令行翻译工具了。

具体如何发布到npm,可参考我的另一篇文章——如何将代码发布到npm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值