QtLingo 1
QtLingo is an Application to make Qt Computer Translations easier
qonlinetranslator.h
Go to the documentation of this file.
1/*
2 * Copyright © 2018-2021 Hennadii Chernyshchyk <genaloner@gmail.com>
3 *
4 * This file is part of QOnlineTranslator.
5 *
6 * QOnlineTranslator is free library; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a get of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
21#ifndef QONLINETRANSLATOR_H
22#define QONLINETRANSLATOR_H
23
24#include <QMap>
25#include <QPointer>
26#include <QVector>
27#include <QCoreApplication>
28#include <QFinalState>
29#include <QJsonArray>
30#include <QJsonDocument>
31#include <QJsonObject>
32#include <QMediaPlayer>
33#include <QNetworkReply>
34#include <QStateMachine>
35#include <QMediaContent>
36#include <QProcess>
37
38#include <QtGlobal>
39#include <QtNetwork/QNetworkSession>
40
41#include "qexample.h"
42#include "qoption.h"
43
44class QStateMachine;
45class QState;
46class QNetworkAccessManager;
47class QNetworkReply;
48
52class QOnlineTranslator : public QObject
53{
54 Q_OBJECT
55 Q_DISABLE_COPY(QOnlineTranslator)
56
57 friend class QOnlineTts;
58
59 public:
60 /* QOnlineTranslator::Language */
62 {
189 Zulu
190 };
191 Q_ENUM(Language)
192
194 {
197 Bing
198 };
199 Q_ENUM(Engine)
200
202 {
208 };
209
210 explicit QOnlineTranslator(QObject *parent = nullptr);
211
212 void translate(const QString &text, Engine engine = Google, Language translationLang = Auto, Language sourceLang = Auto, Language uiLang = Auto);
213 //
214 void detectLanguage(const QString &text, Engine engine = Google);
215
216 void abort();
217 bool isRunning() const;
218
219 QJsonDocument toJson() const;
220 QString source() const;
221 QString sourceTranslit() const;
222 QString sourceTranscription() const;
223 QString sourceLanguageName() const;
224 Language sourceLanguage() const;
225
226 QString translation() const;
227 QString translationTranslit() const;
228 QString translationLanguageName() const;
230
231 QMap<QString, QVector<QOption>> translationOptions() const;
232 QMap<QString, QVector<QExample>> examples() const;
233
234 TranslationError error() const;
235 QString errorString() const;
236
237 bool isSourceTranslitEnabled() const;
238 void setSourceTranslitEnabled(bool enable);
239
240 bool isTranslationTranslitEnabled() const;
241 void setTranslationTranslitEnabled(bool enable);
242
243 bool isSourceTranscriptionEnabled() const;
244 void setSourceTranscriptionEnabled(bool enable);
245
246 bool isTranslationOptionsEnabled() const;
247 void setTranslationOptionsEnabled(bool enable);
248
249 bool isExamplesEnabled() const;
250 void setExamplesEnabled(bool enable);
251
252 static QString languageName(Language lang);
253 QString languageName(const QString &lang);
254 static QString languageCode(Language lang);
255 static Language language(const QLocale &locale);
256 static Language language(const QString &langCode);
257 static bool isSupportTranslation(Engine engine, Language lang);
258
259 signals:
260 void finished();
261
262 private slots:
263 void skipGarbageText();
264 // Google Translate
265 void requestGoogleTranslate();
266 void parseGoogleTranslate();
267 // Yandex Key
268 void requestYandexKey();
269 void parseYandexKey();
270 // Yandex Translate
271 void requestYandexTranslate();
272 void parseYandexTranslate();
273 // Yandex Source Translit
274 void requestYandexSourceTranslit();
275 void parseYandexSourceTranslit();
276 // Yandex Translation Translit
277 void requestYandexTranslationTranslit();
278 void parseYandexTranslationTranslit();
279 // Yandex Dictionary
280 void requestYandexDictionary();
281 void parseYandexDictionary();
282 // Bing Credentials
283 void requestBingCredentials();
284 void parseBingCredentials();
285 // Bing Translate
286 void requestBingTranslate();
287 void parseBingTranslate();
288 // Bing Dictionary
289 void requestBingDictionary();
290 void parseBingDictionary();
291
292 private:
293 /*
294 * Engines have translation limit, so need to split all text into parts and make request sequentially.
295 * Also Yandex and Bing requires several requests to get dictionary, transliteration etc.
296 * We use state machine to rely async computation with signals and slots.
297 */
298 void buildGoogleStateMachine();
299 void buildGoogleDetectStateMachine();
300
301 void buildYandexStateMachine();
302 void buildYandexDetectStateMachine();
303
304 void buildBingStateMachine();
305 void buildBingDetectStateMachine();
306
307 // Helper functions to build nested states
308 void buildSplitNetworkRequest(QState *parent, void (QOnlineTranslator::*requestMethod)(), void (QOnlineTranslator::*parseMethod)(), const QString &text, int textLimit);
309 void buildNetworkRequestState(QState *parent, void (QOnlineTranslator::*requestMethod)(), void (QOnlineTranslator::*parseMethod)(), const QString &text = {});
310
311 // Helper functions for transliteration
312 void requestYandexTranslit(Language language);
313 void parseYandexTranslit(QString &text);
314
315 void resetData(TranslationError error = NoError, const QString &errorString = {});
316
317 // Check for service support
318 static bool isSupportTranslit(Engine engine, Language lang);
319 static bool isSupportDictionary(Engine engine, Language sourceLang, Language translationLang);
320
321 // Other
322 static QString languageApiCode(Engine engine, Language lang);
323 static Language language(Engine engine, const QString &langCode);
324 static int getSplitIndex(const QString &untranslatedText, int limit);
325 static bool isContainsSpace(const QString &text);
326 static void addSpaceBetweenParts(QString &text);
327
328 static const QMap<Language, QString> s_genericLanguageCodes;
329
330 // Engines have some language codes exceptions
331 static const QMap<Language, QString> s_googleLanguageCodes;
332 static const QMap<Language, QString> s_yandexLanguageCodes;
333 static const QMap<Language, QString> s_bingLanguageCodes;
334
335 // Credentials that is parsed from the web version to receive the translation using the API
336 static inline QString s_yandexKey;
337 static inline QByteArray s_bingKey;
338 static inline QByteArray s_bingToken;
339
340 // This properties used to store unseful information in states
341 static constexpr char s_textProperty[] = "Text";
342
343 // Engines have a limit of characters per translation request.
344 // If the query is larger, then it should be splited into several with getSplitIndex() helper function
345 static constexpr int s_googleTranslateLimit = 5000;
346 static constexpr int s_yandexTranslateLimit = 150;
347 static constexpr int s_yandexTranslitLimit = 180;
348 static constexpr int s_bingTranslateLimit = 5001;
349
350 QStateMachine *m_stateMachine;
351 QNetworkAccessManager *m_networkManager;
352 QPointer<QNetworkReply> m_currentReply;
353
354 Language m_sourceLang = NoLanguage;
355 Language m_translationLang = NoLanguage;
356 Language m_uiLang = NoLanguage;
357 TranslationError m_error = NoError;
358
359 QString m_source;
360 QString m_sourceTranslit;
361 QString m_sourceTranscription;
362 QString m_translation;
363 QString m_translationTranslit;
364 QString m_errorString;
365
366 QMap<QString, QVector<QOption>> m_translationOptions;
367 QMap<QString, QVector<QExample>> m_examples;
368
369 bool m_sourceTranslitEnabled = true;
370 bool m_translationTranslitEnabled = true;
371 bool m_sourceTranscriptionEnabled = true;
372 bool m_translationOptionsEnabled = true;
373 bool m_examplesEnabled = true;
374 bool m_onlyDetectLanguage = false;
375
376}; // end class QOnlineTranslator
377#endif // QONLINETRANSLATOR_H
378
QOnlineTranslator.
bool isSourceTranslitEnabled() const
is Source Translit Enabled
static QString languageCode(Language lang)
language Code
bool isTranslationTranslitEnabled() const
is Translation Translit Enabled
static bool isSupportTranslation(Engine engine, Language lang)
is Support Translation
void setTranslationTranslitEnabled(bool enable)
set Translation Translit Enabled
QString errorString() const
error String
void detectLanguage(const QString &text, Engine engine=Google)
detect Language
bool isTranslationOptionsEnabled() const
is Translation Options Enabled
void setSourceTranscriptionEnabled(bool enable)
set Source Transcription Enabled
Language sourceLanguage() const
source Language
QJsonDocument toJson() const
to Json
void setExamplesEnabled(bool enable)
set Examples Enabled
static QString languageName(Language lang)
language Name
QString sourceTranslit() const
source Translit
Language translationLanguage() const
translation Language
bool isExamplesEnabled() const
is Examples Enabled
static Language language(const QLocale &locale)
language
bool isSourceTranscriptionEnabled() const
is Source Transcription Enabled
QString translation() const
translation
@ ParsingError
ParsingError
@ NetworkError
NetworkError
@ ParametersError
ParametersError
@ ServiceError
ServiceError
bool isRunning() const
is Running
QString translationLanguageName() const
translation Language Name
QMap< QString, QVector< QExample > > examples() const
examples
QOnlineTranslator(QObject *parent=nullptr)
QOnlineTranslator.
QString sourceLanguageName() const
source Language Name
QString source() const
source
QString languageName(const QString &lang)
language Name
void setTranslationOptionsEnabled(bool enable)
set Translation Options Enabled
void translate(const QString &text, Engine engine=Google, Language translationLang=Auto, Language sourceLang=Auto, Language uiLang=Auto)
translate
void setSourceTranslitEnabled(bool enable)
set Source Translit Enabled
QMap< QString, QVector< QOption > > translationOptions() const
translation Options
QString sourceTranscription() const
source Transcription
QString translationTranslit() const
translation Translit
@ ScotsGaelic
ScotsGaelic
@ Kinyarwanda
Kinyarwanda
@ TraditionalChinese
TraditionalChinese
@ Azerbaijani
Azerbaijani
@ YucatecMaya
YucatecMaya
@ HaitianCreole
HaitianCreole
@ KlingonPlqaD
KlingonPlqaD
@ SerbianLatin
SerbianLatin
@ SerbianCyrillic
SerbianCyrillic
@ LevantineArabic
LevantineArabic
@ SimplifiedChinese
SimplifiedChinese
@ NoLanguage
NoLanguage
@ QueretaroOtomi
QueretaroOtomi
@ Luxembourgish
Luxembourgish
@ Belarusian
Belarusian
TranslationError error() const
error
Q Online Tts.
Definition: qonlinetts.h:33