UNPKG

i18n-translatejs

Version:

多国语言翻译插件

100 lines (91 loc) 3.02 kB
#!/usr/bin/env node const baiduUrl = "http://api.fanyi.baidu.com/api/trans/vip/translate" const config = require("./libs/globalConfig.js") const fs = require("fs") const axios = require("axios") const crypto = require("crypto") const { contents, raw, additionKey, getPath } = require("./libs/readAll.js") // 处理流 const zhContent = contents.zh translateAll(contents) async function translateAll(all) { //翻译所有的语言 const stime = Date.now() for (key in all) { if (key !== "zh") { const result = await translate(additionKey, key) wirteFile(key + ".json", getFinalText(raw[key], result)) } } const duration = (Date.now() - stime) / 60000 //计算花费的时间 console.log(`This task takes ${duration} minutes`) } // 获取最终将要写入的文本 function getFinalText(text, result) { let prefix = text.replace(/\s*\}\s*$/g, ",\n") //将原文末尾的 } 替换成 , let suffix = formatJSON(result).replace(/^\s*\{\s*/, "") //将JSON字符串开头的 { 替换掉 suffix = suffix.replace(/^\s*(?=[^\]\}])/mg, ' ') //在每行字符串前加上4个空格 return prefix + suffix } //格式化json function formatJSON(json) { let ret = JSON.stringify(json || {}) ret = ret.replace(/((?<=[^\\])([\]"\}]\s*,)|[\[\{](?=[^\\]))/g, "$1\n") //在每个,后面添加换行符\n return ret.replace(/(?<=[^\\])(["\:])([\}\]])/g, "$1\n$2") //在[" :] 和 [ [ } ]之间添加换行 } //通过对比出来的字段来翻译 async function translate(words, key = "en") { let timer = null const result = {} for (const word of words) { result[word] = await new Promise((resolve, reject) => { if (timer) { clearTimeout(timer) } timer = setTimeout(async () => { getTranslateResult(zhContent[word], "zh", config[key].to).then((res) => { resolve(res) }) }, 1300) }) console.log(key + " Is translating, please waiting!!") } return result } // 覆盖文本 function wirteFile(file, msg) { return new Promise((resolve, reject) => { fs.access(file, fs.constants.F_OK, (err) => { fs.writeFile(getPath(file), msg, "utf8", (error) => { if (!error) { console.info(file + " has been wiritten!") resolve(error) return } reject() }) }) }) } // 获取翻译结果 function getTranslateResult(q, from, to) { const appid = "20210311000723859" const secret = "btreH0vLuNgI_cMfpSKX" const salt = (Math.random() * 1000000) | 0 const md5 = crypto.createHash("md5") const sign = md5.update(appid + q + salt + secret).digest("hex") return axios .get(baiduUrl, { params: { q, from, to, appid, salt, sign, }, }) .then((res) => { return Promise.resolve(res.data.trans_result ? res.data.trans_result[0].dst : "") }) }