i18n-translatejs
Version:
多国语言翻译插件
100 lines (91 loc) • 3.02 kB
JavaScript
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 : "")
})
}