前言
由于我需要使用翻译服务把文档翻译成英语,每次更新可以自动翻译,省去复制粘贴的操作,就想弄个这玩意。
百度翻译
先注册开发者:https://api.fanyi.baidu.com/api/trans/product/apiapply
开通翻译api服务
百度翻译文档:https://api.fanyi.baidu.com/api/trans/product/apidoc
百度有个坑,虽然他文档上写免费版的200w字免费,qps是1,但是发现每天调用一定次数后直接就gg 54003,所以开发的人最好升级成高级版。
另外还有个坑,翻译的字数不能太长,否则无法返回。
查看后发现调用还是比较简单的,先制作个demo:
require ( 'dotenv' ) . config ( ) ;
const https = require ( 'https' ) ;
const md5 = require ( 'md5' ) ;
const axios = require ( 'axios' ) ;
const apiUrl = 'http://api.fanyi.baidu.com/api/trans/vip/translate' ;
const appid = process. env. APPID ;
const secret = process. env. SECRET ;
const qs = ` 你好撒旦撒旦撒撒旦撒旦,十大撒的撒sadsad萨达
吃饭吧GV克劳福德的撒
萨达按时,萨达
` ;
const requestTranslate = ( q ) => {
const salt = Math. random ( ) ;
const sign = md5 ( appid + q + salt + secret) ;
const params = {
q,
from : 'zh' ,
to: 'en' ,
salt,
appid,
sign,
} ;
return axios. get ( apiUrl, {
params,
} ) ;
} ;
requestTranslate ( qs) . then ( ( v ) => {
console. log ( v. data. trans_result) ;
} ) ;
[
{
src: '你好撒旦撒旦撒撒旦撒旦,十大撒的撒sadsad萨达' ,
dst: 'Hello, Satan, Satan, Satan, sadsad, sada of the ten great Satans'
} ,
{
src: '吃饭吧GV克劳福德的撒' , dst: "Eat, GV Crawford's SA" } ,
{
src: '萨达按时,萨达' , dst: 'Sada, sada' }
]
下面需要将文档进行翻译。
我使用dooringx的changelog进行翻译,md前面有个元信息字符串,也需要翻译下,但是问题就是翻译的api对空行和空格全部删掉了,所以没有格式信息。
我试了每行替换或者其他方式,效果都不太理想,因为api有同时请求次数限制,所以最好的方式还是翻译完之后处理特殊的地方。我使用下面方法判断头并且特殊地方进行修改。
const concatResult = ( result ) => {
let line = 0 ;
let navstart = 0 ;
if ( result[ 0 ] . src === '---' ) {
const len = result. length;
for ( let i = 1 ; i < len; i++ ) {
let cur = result[ i] . src;
if ( cur === 'nav:' ) {
navstart = i;
}
if ( cur === '---' ) {
line = i;
break ;
}
}
}
result. forEach ( ( v, i ) => {
if ( i === 0 ) {
finalResult = i < line ? v. src : v. dst;
} else {
if ( v. src. startsWith ( 'title:' ) && v. dst. startsWith ( 'Title:' ) ) {
v. dst = v. dst. replace ( 'Title:' , 'title:' ) ;
}
if ( i > navstart && i < line) {
finalResult = finalResult + ` \r\n ` + v. dst;
} else {
finalResult = finalResult + '\r\n' + v. dst;
}
}
} ) ;
return finalResult;
} ;