我正在尝试使用在线翻译服务编写一个简单的免费翻译器(QT小部件)。 其思想是将标准get请求发送到在线翻译器,然后解析响应。 但回复中不包含翻译文本! 我猜这是因为服务使用了Ajax。 在本例中,我使用的是google translator,但我使用其他翻译器(yandex,deepl)得到了类似的结果。 我知道有一种方法可以使用共享软件API,但由于该项目目前还没有商业性质,我不想注册银行卡。 有没有一种类似浏览器的方式可以在没有API的情况下获得翻译并免费使用?
我已经搜索过任何信息,但令我惊讶的是,它已经过时了,而且此刻已经无关紧要了(自从谷歌关闭了免费服务之后)。
还有一个问题。 当我试图将结果强制转换为QString(QString s=reply->readAll().toString()或QString s=reply->readAll().toStdString().c_str())时,我得到了一个失真的htlm代码(文件开头有很多NUL字符)。 我假设这是由于对转义序列的错误解释,但是如何正确地转换结果呢? 即使在当前版本中,文件的开头也有一些垃圾(NUL NUL i)。
我使用的代码是:
void getTranslate() {
QNetworkAccessManager manager;
QUrl url("https://translate.google.com/#view=home&op=translate&sl=en&tl=ru&text=Hello%2C%20World%20!");
QNetworkRequest request(url);
QNetworkReply *reply = manager.get(request);
do {
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
} while(!reply->isFinished());
QFile html("out.html");
if (html.open(QIODevice::ReadWrite)) {
QDataStream out(&html);
out << reply->readAll();
}
reply->close();
delete reply;
}
查看谷歌翻译它使用AJAX请求,以获得翻译。 您可以尝试将URL更改为如下所示(这是ajax请求的所在):
https://translate.google.de/translate_a/single?client=webapp&sl=auto&tl=en&hl=de&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=sos&dt=ss&dt=tt=>otf=2&ssel=0&tsel=0&xid=45662847&kc=1&tk=656516.836633&q=dies%20ist%20
这个请求返回JSON数据,这些数据应该很容易解析。
我不确定所有的参数是用来做什么的,但也许这些信息对你有帮助。
我认为您可以将API插入到与代码一起的文件中,而不是让它在线,这样它就在您的程序中
我相信您使用屏幕刮取方法的问题可能是翻译应用程序使用Ajax
调用服务器端并检索翻译。 使用QNetworkRequest
下载时得到的页面仅仅是JS应用程序
,它实际上并不包含翻译。 直到从页面向服务器发出调用之后,才会填入。 这就是为什么它不起作用的原因。 也许你可以用某种方法让它工作,所以让我们知道你是怎么做的:-)