第一步 翻译 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(/&lt;/g, "<")
    .replace(/&#60;/g, "<")
    .replace(/&gt;/g, ">")
    .replace(/&#62;/g, ">")
    .replace(/&amp;/g, "&")
    .replace(/&#38;/g, "&")
    .replace(/&quot;/g, '"')
    .replace(/&#34;/g, '"')
    .replace(/&apos;/g, "'")
    .replace(/&#39;/g, "'")
    .replace(/&nbsp;/g, " ")
    .replace(/&#160;/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' }

上次更新: 7/7/2020, 11:00:09 PM