QTranslate翻译器接口修复(10月18日更新)
本帖最后由 白小飞V 于 2022-10-18 11:34 编辑非常感谢大家的支持!很惊喜还有这么多朋友在坚持喜欢并使用着这款软件,那我们应该做点力所能及的事
我在gitee上新建了仓库,专用于分享QTranslate的Services,为了让这个翻译神器继续流传,我们一起加油
QTranslate的Services分享
https://gitee.com/linpure/qtranslate-services
https://static.52pojie.cn/static/image/hrline/1.gifhttps://static.52pojie.cn/static/image/hrline/1.gifhttps://static.52pojie.cn/static/image/hrline/1.gif
”作为一名工科生我才20几岁,我只想找一款好用的翻译软件,我有什么错!“ ——我不是译神
今天故事的主角就是大名鼎鼎的QTranslate,软件小巧,功能专业,可谓麻雀虽小五脏俱全,从取词翻译、朗读到全文翻译、再到图片OCR翻译,QTranslate 无所不能。
而且其强大的粘手性,让你用过QTranslate之后,再面对其他五花八门的翻译软件,总感觉差强人意。
然而就是这样一款堪称完美的神器,却也面临着不少问题:
如如再如
此情此景,可谓”世间无限丹青手,一片伤心画不成“,更让人绝望的是这款优秀的软件未开源,也暂未找到前辈大神们的修改,唯一的办法就是等待作者的更新......
可认真学习代码两年半,喜欢唱歌跳舞和rap,又热爱学习的我怎么能轻易让被困难打败呢
接下来就来亲自打怪吧,简单总结一下我的思路,没有深入研究,只算是抛砖引玉,还请各位大佬指点。
https://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.png
安装版本和便携版的文件基本一致,如图所示
我们可以看到的接口代码主要存放在Services文件夹下,供主程序去调用
各个文件夹对应存放的不同接口处理程序,common.js则是一些公共函数。
每一个文件夹里都有一个server.js的同名文件,以Google翻译为例
function serviceHeader(){return new ServiceHeader(1,"Google","Google's free online language translation service instantly translates text and web pages."+Const.NL2+serviceHost()+Const.NL2+"\u00a9 2020 Google",Capability.TRANSLATE|Capability.DETECT_LANGUAGE|Capability.LISTEN)}function serviceHost(a,b,c){return"https://translate.google."+(Options.PreferredDomain||Options.GoogleDomain||"com")}
function serviceLink(a,b,c){var h=serviceHost()+"/";a&&(b=isLanguage(b)?codeFromLanguage(b):"auto",c=isLanguage(c)?codeFromLanguage(c):"auto",h+=format("#{0}/{1}/{2}",b,c,encodeGetParam(a)));return h}
SupportedLanguages=[-1,"auto","af","az","sq","ar","hy","eu","be","bg","ca","zh-CN","zh-TW","hr","cs","da","nl","en","et","fi","tl","fr","gl","de","el","ht","iw","hi","hu","is","id","it","ga","ja","ka","ko","lv","lt","mk","ms","mt","no","fa","pl","pt","ro","ru","sr","sk","sl","es","sw","sv","th","tr","uk","ur","vi","cy","yi","eo","hmn","la","lo","kk","uz","si","tg","te","km","mn","kn","ta","mr","bn","tt"];
function tk(a){function b(a,b){for(var d=0;d<b.length-2;d+=3){var c=b.charAt(d+2),c="a"<=c?c.charCodeAt(0)-87:Number(c),c="+"==b.charAt(d+1)?a>>>c:a<<c;a="+"==b.charAt(d)?a+c&4294967295:a^c}return a}for(var c=(Options.GoogleTkk||"0.0").split("."),h=Number(c)||0,g=[],d=0,e=0;e<a.length;e++){var f=a.charCodeAt(e);128>f?g=f:(2048>f?g=f>>6|192:(55296==(f&64512)&&e+1<a.length&&56320==(a.charCodeAt(e+1)&64512)?(f=65536+((f&1023)<<10)+(a.charCodeAt(++e)&1023),g=f>>18|240,g=f>>12&63|
128):g=f>>12|224,g=f>>6&63|128),g=f&63|128)}a=h;for(d=0;d<g.length;d++)a+=g,a=b(a,"+-a^+6");a=b(a,"+-3^+b+-f");a^=Number(c)||0;0>a&&(a=(a&2147483647)+2147483648);a%=1E6;return a.toString()+"."+(a^h)}
function serviceDetectLanguageRequest(a){a=limitSource(a);var b=tk(a);a=encodeUriParam(a);var c=a.length>Const.MAX_URI_LEN?HttpMethod.POST:HttpMethod.GET;return new RequestData(c,"/translate_a/single?client=gtx&sl=auto&dt=ld&ie=UTF-8&oe=UTF-8&tk="+b+(c===HttpMethod.POST?"":"&q="+a),c===HttpMethod.POST?"q="+a:null)}function serviceDetectLanguageResponse(a){a=parseJSON(a);return getSourceLanguage(a)}
function serviceTranslateRequest(a,b,c){a=limitSource(a);var h=tk(a);a=encodeUriParam(a);var g=a.length>Const.MAX_URI_LEN?HttpMethod.POST:HttpMethod.GET;b=format("/translate_a/single?client=gtx&sl={0}&tl={1}&hl={2}&dt=bd&dt=t&dt=ld&dt=rm&ie=UTF-8&oe=UTF-8&tk={3}",codeFromLanguage(b),codeFromLanguage(c),Options.LanguageCode,h);g===HttpMethod.GET&&(b+="&q="+a);return new RequestData(g,b,g===HttpMethod.POST?"q="+a:null)}
function serviceTranslateResponse(a,b,c,h){a=parseJSON(b);var g=b="",d,e;if(a){var f=a;if(f)for(d=0;d<f.length;d++)(e=f)&&0!==e.length&&(b+=e||"",2<e.length&&d===f.length-1&&(g=e||""));if(f=a)for(d=0;d<f.length;d++)if(e=f,!(3>e.length)){b+=Const.NL2+e+":";var l=e;for(e=0;e<l.length;e++){var k=l;1<k.length&&(b+=Const.NL+" "+k,(k=k)&&0<k.length&&(b+=" ("+k.join(", ")+")"))}}isLanguage(c)||(c=getSourceLanguage(a))}return new ResponseData(b,c,h,g)}
function getSourceLanguage(a){return!a||9>a.length?UNKNOWN_LANGUAGE:(a=a)&&0!==a.length?languageFromCode(a):UNKNOWN_LANGUAGE}function serviceListenRequest(a,b,c){a=format("/translate_tts?ie=UTF-8&q={0}&tl={1}&client=gtx&tk={2}",encodeGetParam(a),codeFromLanguage(b),tk(a));c&&(a+="&ttsspeed=0.24");return new RequestData(HttpMethod.GET,a)};
大致看下来,其主要作用是创建相应的请求和处理对应的请求,也就是俗话说的”爬虫“,所以对于网络错误和脚本错误的问题,理论上问题都是出在这里的。
QTranslate的接口非常多,常用的如Google现在已经失效了,不是cn或com就能解决的问题,而是不再对中国开放谷歌翻译了,所以无解。现在我比较常用的是百度和有道,但是这俩接口也有一些问题
有道的在长句子翻译时会出现翻译不全的问题,百度间歇性正常,而且汉译英只有一个结果。
1. 有道
serviceTranslateRequest函数,顾名思义,就是用来创建翻译请求,处理过程比较清晰,我原本以为是因为limitSource函数进行了截取,后来发现并不是,因为默认的长度限制是5e3也就是5000长度,而实际长度几百的时候就会出现截断的情况,其实问题出在最后的请求地址上,
"/translate_o?smartresult=dict&smartresult=rule"
改为
"/translate?smartresult=dict&smartresult=rule"
即可,至于_o这个链接,网页版的有道翻译也确实是这样使用的,但是不会出现截断的问题,可能是有重定向操作吧,不得而知了。
很幸运,有道这个问题没有出现在sign或者cookie上,比较好解决。
2. 百度
百度就没有那么幸运了
可能是百度不定期更换baidugtk导致sign错误,解决办法就是去百度翻译网页上扒gtk,比如现在的是"320305.131321201"
起初我以为是sign的方法改变了,很庆幸并不是,因为如此头大的加密方法只能去找官方的程序,而这种程序读起来实在是晦涩啊
至此,可以接收到翻译结果了,但是汉译英只有一个结果,其他用法都是object]的形式,说明解析部分有一些问题,
如图,第二张为英译汉,第三张
看一下处理方法
var k = f.parts;
k.part && (b += "[" + k.part + "] ");
b += k.means
.map(function (b) {
return b;
})
.join("; ");
b += Const.NL;
这明显不全好吧,争对英译汉没有问题,但是汉译英格式对不上,那只能手写一部分处理程序了
if(e == 11){
var p = f.parts.means;
if(p && p.length){
for (var index = 0; index < p.length; index++) {
var l = p;
l.text && (b += (index+1) + ". " + l.text);
if(l.means){
b += " (";
for (var i = 0; i < l.means.length; i++) {
b += l.means;
if(i < l.means.length-1){
b += ",";
}
}
b += ")";
}
l.part && (b += " " + l.part);
b += Const.NL;
}
b += Const.NL;
}
}
其中e==11,是判断输入是否为”zh“,语言代码在SupportedLanguages里,添加这段代码到serviceTranslateResponse里
https://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.pnghttps://static.52pojie.cn/static/image/hrline/line4.png
任务完成,至此有道和百度均能正常使用。小菜鸡一枚,希望喜欢QTranslate的大家多多支持,让这个神器更顺手更符合需要 祖千秋 发表于 2022-10-14 16:29
楼主,这是我现在能凑出的4个现在可用接口的QT,4个可用接口分别为 deepl有道 微软 YANDX,麻烦您能不能 ...
已把我用的上传gitee Microsoft的接口好像无法使用,关注您gitee好像没有做出修改。 祖千秋 发表于 2022-10-25 14:08
系统要在WIN7以上,32 64无所谓,楼主用的QT是6.10版本,所以您也要用6.10,然后copy他的文件夹就好了。
系统是w11,QT6.10,复制进去后,其他的都能用,Microsoft不能用,所以才提出。 666紫薯布丁 感谢分享 本帖最后由 restart19 于 2022-10-14 08:24 编辑
所有的翻译引擎都是“未返回数据(发送数据超时)。”,难道要一个个修改?
==========================
刚看到https://www.52pojie.cn/forum.php?mod=viewthread&tid=1585458&highlight=qtranslate的介绍。
现在的有道和yandex可用 restart19 发表于 2022-10-14 08:18
所有的翻译引擎都是“未返回数据(发送数据超时)。”,难道要一个个修改?
==========================
...
是的,因为每个接口整体思路相同但具体实现有差别,只能争对不同接口做定向修改 没想到啊没想到,真的有朋友也一直不死心这个软件。这可能是翻译软件里最灵活最小巧,也用着最方便的一款了,我备份了一些servies,结果发现每个版本还不通用,到现在也没凑出一个多接口可用的。麻烦朋友能不能发一下可用版本的压缩包?大恩不言谢!!! 祖千秋 发表于 2022-10-14 12:59
没想到啊没想到,真的有朋友也一直不死心这个软件。这可能是翻译软件里最灵活最小巧,也用着最方便的一款了 ...
我的邮箱是0431@yeah.net,麻烦大佬!! 同求 lukemin#gmail.com restart19 发表于 2022-10-14 08:18
所有的翻译引擎都是“未返回数据(发送数据超时)。”,难道要一个个修改?
==========================
...
这个链接里的有道不能使用啊 楼主,这是我现在能凑出的4个现在可用接口的QT,4个可用接口分别为 deepl有道 微软 YANDX,麻烦您能不能给我搞一份百度可用的接口?咱们资源共享,把QT这个号软件传承下去哈