Qt - THelper (Translation Tool)
程序员文章站
2022-04-19 17:21:11
...
前言
本文实现了一个翻译小工具,目前仅使用百度翻译API;若有免费的API接口,未来也会考虑加上。
目前界面任然比较简陋,功能比较单一。有啥想法可以留言,有空的话一定加上!
源码已托管至 GitHub-THelper。
如何接入百度API
原理
使用百度通用翻译API,其实只需要按照官方文档格式发送一个 http/https
请求。
- 通用翻译API HTTP地址:
http://api.fanyi.baidu.com/api/trans/vip/translate
- 通用翻译API HTTPS地址:
https://fanyi-api.baidu.com/api/trans/vip/translate
参数表单如下:
然后接收应答;应答数据为 Json
格式,我们需要解析它拿到我们需要的翻译文本。
{
"from": "en",
"to":"zh",
"trans_result":[{
"src":"apple",
"dst":"\u82f9\u679c"
}]
}
网络请求
Qt 中的Http请求可以用 QNetworkAccessManager
实现,本处使用的是 Get
请求:
QNetworkAccessManager *mnetwork_Manager = new QNetworkAccessManager;
QNetworkRequest *request= new QNetworkRequest;
QMetaObject::Connection connRet = QObject::connect(mnetwork_Manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));
Q_ASSERT(connRet);
request->setUrl(QUrl(str_request));
qDebug() << str_request;
mnetwork_Manager->get(*request);
MD5
QT中提供了 QCryptographicHash
,可用于 MD5
加密:
//MD5 - 签名
QString str_noencrypt = APPID.toUtf8() + strinput + QString::number(mrand).toUtf8() + Key.toUtf8();
QString signature = QCryptographicHash::hash(str_noencrypt.toUtf8(),QCryptographicHash::Md5).toHex();
注意:按照文档提示, 在生成签名拼接 appid+q+salt+** 字符串时,q
(即 strinput
)不需要做 URL encode
,在生成签名之后,发送 HTTP
请求之前才需要对要发送的待翻译文本字段 q
(即strinput
)做 URL encode
。
随机数
这里使用QTime 生成伪随机数:
QTime time;
time= QTime::currentTime();
qsrand(time.msec()+time.second()*1000);
//rang: [0,99]
rand = qrand() % 100;
Json解析
主要依靠三个类 QJsonDocument
+ QJsonValue
+ QJsonObject
。
值得注意的是 trans_result
是一个 jsobject
的数组:
-
[]
数组 -
{}
对象
if (reply->error() == QNetworkReply::NoError)
{
QByteArray jsonbytearray = reply->readAll();
qDebug() << jsonbytearray;
QJsonParseError jsonpe;
QJsonDocument jsonfile = QJsonDocument::fromJson(jsonbytearray, &jsonpe);
if (jsonpe.error == QJsonParseError::NoError)
{
QJsonObject jsobj = jsonfile.object();
if(jsobj.contains( "trans_result")){
QJsonValue transresultValue = jsobj.value("trans_result");
if(transresultValue.isArray()){
QJsonArray transresultArray = transresultValue.toArray();
qDebug() << "transresultArray Size:" << transresultArray.size();
for (int i = 0; i < transresultArray.size(); ++i) {
//JS Object
QJsonValue itemArray = transresultArray.at(i);
QJsonObject item = itemArray.toObject();
QString src = item["src"].toString();
QString dst = item["dst"].toString();
qDebug() << "src:" << src << " " << "dst:" << dst;
emit TranslationReturn(dst);
}
}
}
}else{
qDebug() << "[Error] Js parse error.";
}
}
else
{
qDebug() << "[Error] Request error.";
}
存在的问题
- 翻译结果返回有时较慢,未做超时处理及实现重发机制。
- 多线程的使用不够合理。
- 有时候存在卡死的状况,未定位问题。
上一篇: 立春时节吃什么养生 最适合吃八种水果
下一篇: footer.html中中文乱码的解决