欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt - THelper (Translation Tool)

程序员文章站 2022-04-19 17:21:11
...

前言

本文实现了一个翻译小工具,目前仅使用百度翻译API;若有免费的API接口,未来也会考虑加上。

目前界面任然比较简陋,功能比较单一。有啥想法可以留言,有空的话一定加上!

源码已托管至 GitHub-THelper

Qt - THelper (Translation Tool)

如何接入百度API

通用翻译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

参数表单如下:

Qt - THelper (Translation Tool)
然后接收应答;应答数据为 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.";
     }

存在的问题

  • 翻译结果返回有时较慢,未做超时处理及实现重发机制。
  • 多线程的使用不够合理。
  • 有时候存在卡死的状况,未定位问题。