免费的翻译接口

前言

列举几个免费的翻译接口。

百度翻译

官方文档:https://fanyi-api.baidu.com/doc/21

免费版有请求频次限制。

请求的参数:

字段名 类型 是否必填 描述 备注
q string 请求翻译query UTF-8编码
from string 翻译源语言 可设置为auto
to string 翻译目标语言 不可设置为auto
appid string APP ID 可在管理控制台查看
salt string 随机数 可为字母或数字的字符串
sign string 签名 appid+q+salt+密钥的MD5值

常见语种列表(from/to):

名称 代码 名称 代码 名称 代码
自动检测 auto 中文 zh 英语 en
粤语 yue 文言文 wyw 日语 jp
韩语 kor 法语 fra 西班牙语 spa
泰语 th 阿拉伯语 ara 俄语 ru
葡萄牙语 pt 德语 de 意大利语 it
希腊语 el 荷兰语 nl 波兰语 pl
保加利亚语 bul 爱沙尼亚语 est 丹麦语 dan
芬兰语 fin 捷克语 cs 罗马尼亚语 rom
斯洛文尼亚语 slo 瑞典语 swe 匈牙利语 hu
繁体中文 cht 越南语 vie

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
onst md5 = require("md5");

async cidian_query(word) {
if (!word) {
return "";
}
let q = word;
let from = "zh";
let to = "en";
if (this.tozh) {
from = "en";
to = "zh";
} else {
from = "zh";
to = "en";
}
let appid = "xxx";
let key = "xxxx";
let salt = "10086";
let sign = md5("" + appid + q + salt + key);

let data = await this.mpost2(
"https://fanyi-api.baidu.com/api/trans/vip/translate",
{
q,
from,
to,
appid,
salt,
sign
}
);
if (data.error_code) {
this.$Message.error(data.error_msg);
return "";
} else {
let trans_result = data.trans_result;

let str_arr = [];
if (trans_result && trans_result.length > 0) {
for (let i = 0; i < trans_result.length; i++) {
let item = trans_result[i];
str_arr.push(item.dst);
}
}
console.info("转换:", str_arr.join("\n"));
return str_arr.join("\n");
}
}

mpost(url, para) {
let bodystr = "";
for (let item in para) {
if (item === "q") {
bodystr += "&" + item + "=" + encodeURIComponent(para[item]);
} else {
bodystr += "&" + item + "=" + para[item];
}
}
bodystr = bodystr.slice(1, bodystr.length);
return new Promise(function(resolve, reject) {
request(
{
url: url,
method: "POST",
json: true,
headers: {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
body: bodystr
},
function(error, response, body) {
if (!error && response.statusCode === 200) {
resolve(body);
} else {
reject("请求接口失败");
}
}
);
});
}

但是注意免费的有调用频次限制,1秒内只能调用1次,否则会报错:

1
{"error_code":"54003","error_msg":"Invalid Access Limit"}

建议请求后延迟1秒再次调用

否则会报错

1
2
3
4
5
6
7
window.sleep = function(time) {
return new Promise(resolve => {
setTimeout(resolve, time);
});
};
word = await this.cidian_query(word);
await window.sleep(1000);

有道

示例

http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=计算

http://fanyi.youdao.com/translate?&doctype=json&type=ZH_CN2EN&i=计算

http://fanyi.youdao.com/translate?&doctype=json&type=ZH_CN2KR&i=计算

返回的数据

1
{"type":"ZH_CN2EN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"计算","tgt":"To calculate"}]]}

注意返回的数据中有空格,注意处理。

type的类型有:

1
2
3
4
5
6
7
8
9
10
11
12
ZH_CN2EN 中文 » 英语
ZH_CN2JA 中文 » 日语
ZH_CN2KR 中文 » 韩语
ZH_CN2FR 中文 » 法语
ZH_CN2RU 中文 » 俄语
ZH_CN2SP 中文 » 西语
EN2ZH_CN 英语 » 中文
JA2ZH_CN 日语 » 中文
KR2ZH_CN 韩语 » 中文
FR2ZH_CN 法语 » 中文
RU2ZH_CN 俄语 » 中文
SP2ZH_CN 西语 » 中文

金山翻译

文字中有特殊符号时有时请求报错。

添加引用

1
npm install md5 --save

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
const md5 = require("md5");

async cidian_query(word) {
if (!word) {
return "";
}
try {
let u = {
client: 6,
key: 1000006,
timestamp: new Date().valueOf(),
word: word
};
let i = "http://dict.iciba.com/dictionary/word/query/web";
let l = "";
for (let c in u) {
l += String(u[c]);
}
u.signature = md5(
i.replace("http://dict.iciba.com", "") +
l +
"7ece94d9f9c202b0d2ec557dg4r9bc"
);
let data = await this.mget(i, u);
if (data.status === 1) {
console.info(data);
if (
data.message &&
data.message.baesInfo &&
data.message.baesInfo.translate_result
) {
return data.message.baesInfo.translate_result;
} else {
this.$Message.error("转换失败!");
return "";
}
} else {
this.$Message.error(data.message);
return "";
}
} catch (e) {
console.info(e);
}
}

mget(url, para) {
let parastr = "";
for (let key in para) {
parastr += "&" + key + "=" + para[key];
}
parastr = parastr.slice(1, parastr.length);
// parastr = encodeURIComponent(parastr);
url = url + "?" + parastr;
return new Promise(function(resolve, reject) {
request(
{
url: url,
method: "get",
json: true,
headers: {
"content-type": "application/json"
}
},
function(error, response, body) {
if (!error && response.statusCode === 200) {
resolve(body);
} else {
reject("请求接口失败");
}
}
);
});
}