├── .gitignore ├── .npmignore ├── README.md ├── bin └── cli.js ├── lib ├── deepL.js └── youdao.js ├── package.json ├── prettier.config.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | # Editor directories and files 3 | .idea 4 | .vscode 5 | *.suo 6 | *.ntvs* 7 | *.njsproj 8 | *.sln 9 | *.sw? 10 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | examples/ 4 | packages/ 5 | public/ 6 | vue.config.js 7 | babel.config.js 8 | *.map 9 | *.html 10 | 11 | # local env files 12 | .env.local 13 | .env.*.local 14 | 15 | # Log files 16 | npm-debug.log* 17 | yarn-debug.log* 18 | yarn-error.log* 19 | 20 | # Editor directories and files 21 | .idea 22 | .vscode 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | *.sw* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ding-trans 2 | 3 | 一个在终端上翻译的工具,支持有道翻译和 DeepL 翻译。 4 | 5 | 方便自己在编码、查看源码是直接在 VsCode 集成终端上翻译。减少来回切换窗口的操作。提升效率,时间为王! 6 | 7 | ## 安装-Install 8 | 9 | ``` 10 | npm i ding-trans -g 11 | ``` 12 | 13 | ## 使用-Usage 14 | 15 | ### 新增 deepl(中英互译,吊打其他翻译,基于深度学习) 16 | 17 | ```sh 18 | dd 19 | # eg. 20 | dd hello world 21 | ``` 22 | 23 | 翻译专业词汇的表现: 24 | ![](https://assets.fedtop.com/picbed/20220706142743.png) 25 | 26 | 内容中如果标点符号比较多的时候,可以使用 引号 包裹起来,这样可以提高翻译的准确率。 27 | 28 | ![](https://assets.fedtop.com/picbed/20220706143047.png) 29 | 30 | ### 支持单词与长句的发音: 31 | 32 | ```shell 33 | dd hello -S 34 | dd hello --say 35 | dd better late than never -S 36 | dd better late than never --say 37 | ``` 38 | 39 | ![](https://assets.fedtop.com/picbed/202210101726508.png) 40 | 41 | ### 查单词: 42 | 43 | ```shell 44 | ding hello 45 | ``` 46 | 47 | ![](https://assets.fedtop.com/picbed/202210101723582.png) 48 | 49 | ### 查长短句: 50 | 51 | ```shell 52 | ding better late than never 53 | ``` 54 | 55 | ![](https://assets.fedtop.com/picbed/202210101724090.png) 56 | 57 | ### 中译英: 58 | 59 | ```shell 60 | ding JavaScript是最好的语言! 61 | ``` 62 | 63 | ![](https://assets.fedtop.com/picbed/202210101724481.png) 64 | 65 | ### 更多提效的工具? 66 | 67 | More tools to improve efficiency? 68 | 69 | follow me on [GitHub](https://github.com/wangrongding) 70 | -------------------------------------------------------------------------------- /bin/cli.js: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | require('colors') 3 | const say = require('say') 4 | const argv = require('yargs').argv 5 | const { deepl } = require('../lib/deepL') 6 | const { youdao } = require('../lib/youdao') 7 | // 对驼峰的连续单词进行分割后转义 8 | let queryStr = argv._.join(' ') 9 | .replace(/([A-Z])/g, ' $1') 10 | .toLowerCase() 11 | 12 | // 无参数,或帮助 13 | if (!queryStr || argv.help == true || argv.H == true || argv.h == true) { 14 | console.log('-------------------------------') 15 | console.log('查单词: '.bold.blue) 16 | console.log('ding [单词] 或者 [短句]', '\n') 17 | console.log('汉译英: '.bold.red) 18 | console.log('ding [文本]', '\n') 19 | console.log('单词/短句发音: '.bold.yellow) 20 | console.log('ding [单词] [短句] --say') 21 | console.log('ding [单词] [短句] -S') 22 | console.log('-------------------------------') 23 | console.log("请在'ding'命令后输入单词或断句!") 24 | console.log('word or sentence required...') 25 | } else { 26 | //播放 27 | if (argv.say == true || argv.S == true) { 28 | console.log('播放中...'.rainbow) 29 | say.speak(queryStr) 30 | return 31 | } 32 | //查词 33 | if (argv.$0 === 'ding') { 34 | youdao(queryStr) 35 | } else { 36 | deepl(queryStr) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/deepL.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | // DeepL 翻译 3 | exports.deepl = (queryStr) => { 4 | const targetLang = escape(queryStr).indexOf('%u') < 0 ? 'ZH' : 'EN' 5 | axios 6 | .post('http://47.95.239.198:9521/translate', { 7 | text: queryStr, 8 | source_lang: 'auto', 9 | target_lang: targetLang, 10 | }) 11 | .then((res) => { 12 | console.log(`\n${'🚀🚀🚀 翻译: '.green.bold}${res.data.data} \n`) 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /lib/youdao.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | // youdao 翻译 3 | exports.youdao = (queryStr) => { 4 | // 用于请求的选项 5 | // let options = { 6 | // host: "fanyi.youdao.com", 7 | // port: "80", 8 | // path: 9 | // "/openapi.do?keyfrom=translation-tool&key=1730699468&type=data&doctype=json&version=1.1&q=" + 10 | // queryStr, 11 | // }; 12 | axios 13 | .get('http://aidemo.youdao.com/trans', { 14 | params: { 15 | q: queryStr, 16 | from: 'Auto', 17 | to: 'Auto', 18 | }, 19 | }) 20 | .then((res) => { 21 | format(res.data) 22 | }) 23 | } 24 | 25 | //格式化 26 | function format(data) { 27 | // let data = json && JSON.parse(json) 28 | // 发音 29 | let pronounce = data.basic ? data.basic.phonetic : '无' 30 | // 翻译 31 | let mainTrans = '' 32 | // 网络释义 33 | let webTrans = '' 34 | // 机器翻译 35 | let machineTrans = data.translation || '' 36 | 37 | let basic = data.basic 38 | let web = data.web 39 | 40 | if (basic) { 41 | mainTrans = '\n' + basic.explains.join('\n') 42 | } 43 | if (web) { 44 | for (let i = 0; i < web.length; i++) { 45 | webTrans += 46 | '\n' + 47 | (i + 1) + 48 | ': ' + 49 | web[i].key.red.bold + 50 | '\n' + 51 | web[i].value.join(',') 52 | } 53 | } 54 | console.log(` 55 | ${'发音: '.red.bold}${pronounce} 56 | ${'翻译: '.green.bold}${mainTrans} 57 | ${'网络释义: '.blue.bold}${webTrans} 58 | ${'机器翻译: '.yellow.bold}${machineTrans} 59 | ---------------- by 前端超人 ---------------- 60 | `) 61 | } 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ding-trans", 3 | "version": "1.1.3", 4 | "description": "a translation cli", 5 | "main": "index.js", 6 | "bin": { 7 | "ding": "./bin/cli.js", 8 | "dd": "./bin/cli.js" 9 | }, 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/wangrongding/ding-trans.git" 16 | }, 17 | "author": "wangrongding ", 18 | "license": "MIT", 19 | "dependencies": { 20 | "axios": "^0.27.2", 21 | "colors": "^1.4.0", 22 | "say": "^0.16.0", 23 | "yargs": "^17.0.1" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 参考 https://prettier.io/docs/en/options.html 3 | */ 4 | module.exports = { 5 | tabWidth: 2, // 空格数 6 | useTabs: false, // 是否开启tab 7 | printWidth: 80, // 换行的宽度 8 | semi: false, // 是否在语句末尾打印分号 9 | singleQuote: true, // 是否使用单引号 10 | quoteProps: 'as-needed', // 对象的key仅在需要时用引号 as-needed|consistent|preserve 11 | trailingComma: 'all', // 多行时尽可能打印尾随逗号 |all|es5|none 12 | rangeStart: 0, // 每个文件格式化的范围是文件的全部内容 13 | bracketSpacing: true, // 对象文字中的括号之间打印空格 14 | jsxSingleQuote: true, // 在JSX中是否使用单引号 15 | bracketSameLine: false, // 将HTML元素的闭括号放在最后一行的末尾(不适用于自闭合元素)。 16 | arrowParens: 'always', // 箭头函数,只有一个参数的时候,也需要括号 always|avoid 17 | htmlWhitespaceSensitivity: 'ignore', // html中换行规则 css|strict|ignore,strict会强制在标签周围添加空格 18 | vueIndentScriptAndStyle: false, // vue中script与style里的第一条语句是否空格 19 | singleAttributePerLine: false, // 每行强制单个属性 20 | endOfLine: 'lf', // 换行符 21 | proseWrap: 'never', // 当超出print width时就折行 always|never|preserve .md文件? 22 | embeddedLanguageFormatting: 'auto', 23 | } 24 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ansi-regex@^5.0.0: 6 | version "5.0.1" 7 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 8 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 9 | 10 | ansi-styles@^4.0.0: 11 | version "4.3.0" 12 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 13 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 14 | dependencies: 15 | color-convert "^2.0.1" 16 | 17 | asynckit@^0.4.0: 18 | version "0.4.0" 19 | resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 20 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 21 | 22 | axios@^0.27.2: 23 | version "0.27.2" 24 | resolved "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" 25 | integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== 26 | dependencies: 27 | follow-redirects "^1.14.9" 28 | form-data "^4.0.0" 29 | 30 | cliui@^7.0.2: 31 | version "7.0.4" 32 | resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" 33 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 34 | dependencies: 35 | string-width "^4.2.0" 36 | strip-ansi "^6.0.0" 37 | wrap-ansi "^7.0.0" 38 | 39 | color-convert@^2.0.1: 40 | version "2.0.1" 41 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 42 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 43 | dependencies: 44 | color-name "~1.1.4" 45 | 46 | color-name@~1.1.4: 47 | version "1.1.4" 48 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 49 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 50 | 51 | colors@^1.4.0: 52 | version "1.4.0" 53 | resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" 54 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 55 | 56 | combined-stream@^1.0.8: 57 | version "1.0.8" 58 | resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 59 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 60 | dependencies: 61 | delayed-stream "~1.0.0" 62 | 63 | delayed-stream@~1.0.0: 64 | version "1.0.0" 65 | resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 66 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 67 | 68 | emoji-regex@^8.0.0: 69 | version "8.0.0" 70 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 71 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 72 | 73 | escalade@^3.1.1: 74 | version "3.1.1" 75 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 76 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 77 | 78 | follow-redirects@^1.14.9: 79 | version "1.15.1" 80 | resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" 81 | integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== 82 | 83 | form-data@^4.0.0: 84 | version "4.0.0" 85 | resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 86 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 87 | dependencies: 88 | asynckit "^0.4.0" 89 | combined-stream "^1.0.8" 90 | mime-types "^2.1.12" 91 | 92 | get-caller-file@^2.0.5: 93 | version "2.0.5" 94 | resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 95 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 96 | 97 | is-fullwidth-code-point@^3.0.0: 98 | version "3.0.0" 99 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 100 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 101 | 102 | mime-db@1.52.0: 103 | version "1.52.0" 104 | resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 105 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 106 | 107 | mime-types@^2.1.12: 108 | version "2.1.35" 109 | resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 110 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 111 | dependencies: 112 | mime-db "1.52.0" 113 | 114 | one-time@0.0.4: 115 | version "0.0.4" 116 | resolved "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz" 117 | integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= 118 | 119 | require-directory@^2.1.1: 120 | version "2.1.1" 121 | resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 122 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 123 | 124 | say@^0.16.0: 125 | version "0.16.0" 126 | resolved "https://registry.npmjs.org/say/-/say-0.16.0.tgz" 127 | integrity sha512-yEfncNu3I6lcZ6RIrXgE9DqbrEmvV5uQQ8ReM14u/DodlvJYpveqNphO55RLMSj77b06ZKNif/FLmhzQxcuUXg== 128 | dependencies: 129 | one-time "0.0.4" 130 | 131 | string-width@^4.1.0, string-width@^4.2.0: 132 | version "4.2.2" 133 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz" 134 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 135 | dependencies: 136 | emoji-regex "^8.0.0" 137 | is-fullwidth-code-point "^3.0.0" 138 | strip-ansi "^6.0.0" 139 | 140 | strip-ansi@^6.0.0: 141 | version "6.0.0" 142 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" 143 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 144 | dependencies: 145 | ansi-regex "^5.0.0" 146 | 147 | wrap-ansi@^7.0.0: 148 | version "7.0.0" 149 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" 150 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 151 | dependencies: 152 | ansi-styles "^4.0.0" 153 | string-width "^4.1.0" 154 | strip-ansi "^6.0.0" 155 | 156 | y18n@^5.0.5: 157 | version "5.0.8" 158 | resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" 159 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 160 | 161 | yargs-parser@^20.2.2: 162 | version "20.2.7" 163 | resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz" 164 | integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== 165 | 166 | yargs@^17.0.1: 167 | version "17.0.1" 168 | resolved "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz" 169 | integrity sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ== 170 | dependencies: 171 | cliui "^7.0.2" 172 | escalade "^3.1.1" 173 | get-caller-file "^2.0.5" 174 | require-directory "^2.1.1" 175 | string-width "^4.2.0" 176 | y18n "^5.0.5" 177 | yargs-parser "^20.2.2" 178 | --------------------------------------------------------------------------------