第一步 翻译 API
这里采用谷歌的翻译 api,具体文档以及支持的语言都可以在这里看到,关键点在于获取一个认证的 key。请求使用 request-promise-native 这个库,在运行之前请先安装
npm install --save request
npm install --save request-promise-native
代码的文件树结构如下
── translate
├── google-translate.js
├── index.js
└── string.js
第二步 封装 API
这里采用谷歌的翻译 API,文件如下--google-translate.js
更新:添加有道翻译 api 支持,有道翻译的相关 key 获取可前往有道智云进行注册
const request = require("request-promise-native")
const crypto = require("crypto")
const googleKey = "AIzaSyBin9npxxxxxxxvBG1yLcjn_CqWcRlXg" // 这里时你自己的Google注册的key
const capitalize = require("./string.js").capitalize
const appKey = "026cxxxxb6d41e86" // 这里存放你自己的appKey
const youdaoKey = "Ssu0LY2aVlxxxxxxO2bF7F6eiXvkS" // 这里时注册后获取的key
/**
*
* @param {*} text
* @param {*} target
* @param {*} api [google|youdao] api类型,接受字符串
*/
function translate(text, target = "en", api = "google") {
const googleApi = {
url: "https://translation.googleapis.com/language/translate/v2",
qs: {
q: text,
target,
key: googleKey,
},
}
const youdaoApi = getYoudaoApi(text, target)
const useGoogle = api === "google"
return request(useGoogle ? googleApi : youdaoApi).then(
(result) => {
// console.log(result);
result = useGoogle
? JSON.parse(result).data.translations[0].translatedText
: JSON.parse(result).translation[0]
return {
text: text,
result: target === "en" ? capitalize(result) : result,
}
},
() => {
return new Promise((resolve) => {
setTimeout(() => {
console.log("Connect Error,Please check network, Retrying....")
resolve(translate(text, target))
}, 1000)
})
}
)
}
function truncate(q) {
var len = q.length
if (len <= 20) return q
return q.substring(0, 10) + len + q.substring(len - 10, len)
}
function getYoudaoApi(text, target, from = "zh") {
const salt = new Date().getTime()
const curTime = Math.round(new Date().getTime() / 1000)
const query = text
const to = target
const randomKey = appKey + truncate(query) + salt + curTime + youdaoKey
const hash = crypto.createHash("sha256")
hash.update(randomKey)
const sign = hash.digest("hex")
return {
url: "http://openapi.youdao.com/api",
qs: {
q: query,
appKey: appKey,
salt: salt,
from: from,
to: to,
sign: sign,
signType: "v3",
curtime: curTime,
},
}
}
module.exports = translate
第三步 字符串转义替换
这里引入的 string.js 的作用是将一些庄毅字符替换为原始字符,函数也很简单,代码如下
function unescape(value) {
return value
.replace(/</g, "<")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/>/g, ">")
.replace(/&/g, "&")
.replace(/&/g, "&")
.replace(/"/g, '"')
.replace(/"/g, '"')
.replace(/'/g, "'")
.replace(/'/g, "'")
.replace(/ /g, " ")
.replace(/ /g, " ")
}
function capitalize(value) {
return value.charAt(0).toUpperCase() + value.slice(1)
}
module.exports = {
unescape,
capitalize,
}
第四步 封装处理函数
有了 Api 以及基本的处理函数,现在我们可以开始函数主体的完善--index.js
更新:添加结果打印标志以及翻译 api 参数
const translateApi = require("./google-translate")
/**
*
* @param {*} map 需要翻译的对象
* @param {*} fn 处理函数
* @param {*} context 结果保存的引用对象
* @param {*} target 目标语言
*/
function _chainPromise(map, fn, context, target, log, api) {
return Object.keys(map).reduce((acc, cur) => {
return acc.then(function() {
return fn(map[cur], cur, target, context, log, api)
})
}, Promise.resolve())
}
/**
*
* @param {*} value 要翻译的值
* @param {*} target 目标语言
* @param {*} context 需要保存的对象引用
*/
function _translateValue(value, key, target, context, log, api) {
return new Promise((resolve, reject) => {
translateApi(value, target, api)
.then((result) => {
if (log) {
console.log(`Text: ${value}`)
console.log(`Result: ${result.result}\r\n`)
}
context[key] = result.result
resolve()
})
.catch((e) => {
reject(e)
})
})
}
/**
*
* @param {*} map 需要翻译额对象
* @param {*} target 目标语言
*/
function translate({ source, target, log = false, api = "youdao" }) {
const translateMap = {}
return new Promise((resolve, reject) => {
_chainPromise(source, _translateValue, translateMap, target, log, api)
.then(() => {
resolve(translateMap)
})
.catch((e) => {
reject(e)
})
})
}
module.exports = {
translateApi,
translate,
}
第五步 测试
有了上面的文件后我们就可以在正式文件里使用自动翻译的脚本了
const translate = require("./translate/index.js")
var fs = require("fs")
var path = require("path")
const en = {
name: "小明",
age: "年龄34",
}
translate.translate(en, "en").then((res) => {
console.log(res)
})
// 结果如下
Text: 小明
Result: Komei
Text: 年龄34
Result: Age 34
{ name: 'Komei', age: 'Age 34' }