最近有一个需求是使用node.js调用谷歌翻译,npm有一个叫google-translate-api的包,已经对谷歌翻译服务进行了封装,可以直接调用。npm包的安装及使用可以参考
链接: link.
链接: link.
api 提供了对字符串查询的基础功能,但是要实现对json对象的翻译,需要手动实现一下异步获取所有翻译结果的功能,在这里记录一下实现过程。
因为只能记录单个字符串,所以要把对象值的内容取出来,逐个翻译。平时async await用的比较多,所以首先想到的就是使用await异步获取到每个结果后放在原来的位置。
const translate = require('google-translate-api');
let data = {
"queryPerson": "露露",
"enterprise": "不知名的神秘公司",
"registration": "610100100442598",
"type": "股份有限公司",
"status": "在营(开业)",
"registeredCapital": "23674.790100万人民币元",
"isLegalPerson": 0,
"isExecutive": 1,
"isShareholder": 0,
"position": "董事"
}
async function creatTranslate(){
let start = new Date().getTime()
for (let key in data){
if(/[^\x00-\xff]/.test(data[key])){
let res = await readyTranslate(data[key])
if (res){
data[key] = res.text
}
}
}
let end = new Date().getTime()
let duration = end - start
console.log(duration)
}
function readyTranslate(string){
let res = translate(string, {
to: 'en'})
return res;
}
creatTranslate();
执行后得到结果如下
{
queryPerson: 'Lulu',
enterprise: "Unknown mysterious company",
registration: '610100100442598',
type: 'Co., Ltd.',
status: 'In camp (opening)',
registeredCapital: '23674.7901 million yuan',
isLegalPerson: 0,
isExecutive: 1,
isShareholder: 0,
position: 'director'
}
但是这种方式的不足之处在于,每次发出翻译都要等上次的结果返回了以后才能发出,耗时比较长。想要一种同时发出多个请求的方法,想到之前看到的promise对象有Promise.all()方法,接受一个数组为参数,将多个 Promise 实例,包装成一个新的 Promise 实例。
const translate = require('google-translate-api');
let data1 = {
"queryPerson": "露露",
"enterprise": "不知名的神秘公司",
"registration": "610100100442598",
"type": "股份有限公司",
"status": "在营(开业)",
"registeredCapital": "23674.790100万人民币元",
"isLegalPerson": 0,
"isExecutive": 1,
"isShareholder": 0,
"position": "董事"
}
function translateZh(){
let start = new Date().getTime()
let keys = Object.keys(data1)
const promises = keys.map(function (key) {
return translate(data1[key], {
to: 'en'})
});
Promise.all(promises).then(function (posts) {
console.log(posts)
}).catch(function(reason){
// ...
});
}
translateZh()
执行结果:
[
{
text: 'Lulu',
from: {
language: [Object], text: [Object] },
raw: ''
},
{
text: 'Unknown mysterious company',
from: {
language: [Object], text: [Object] },
raw: ''
},
{
text: '610100100442598',
from: {
language: [Object], text: [Object] },
raw: ''
},
{
text: 'Co., Ltd.',
from: {
language: [Object], text: [Object] },
raw: ''
},
{
text: 'In camp (opening)',
from: {
language: [Object], text: [Object] },
raw: ''
},
{
text: '23674.7901 million yuan',
from: {
language: [Object], text: [Object] },
raw: ''
},
{
text: '0', from: {
language: [Object], text: [Object] }, raw: '' },
{
text: '1', from: {
language: [Object], text: [Object] }, raw: '' },
{
text: '0', from: {
language: [Object], text: [Object] }, raw: '' },
{
text: 'director',
from: {
language: [Object], text: [Object] },
raw: ''
}
]
返回了一个包含所有翻译结果的数组,麻烦点的就是需要对数据再进行一次处理,优点就是速度变快了。
一次小小的尝试,不足之处望大神指正。