28const QMap<QOnlineTranslator::Language, QString> QOnlineTranslator::s_genericLanguageCodes =
30 { Auto, QStringLiteral(
"auto") },
31 { Afrikaans, QStringLiteral(
"af") },
32 { Albanian, QStringLiteral(
"sq") },
33 { Amharic, QStringLiteral(
"am") },
34 { Arabic, QStringLiteral(
"ar") },
35 { Armenian, QStringLiteral(
"hy") },
36 { Azerbaijani, QStringLiteral(
"az") },
37 { Bashkir, QStringLiteral(
"ba") },
38 { Basque, QStringLiteral(
"eu") },
39 { Belarusian, QStringLiteral(
"be") },
40 { Bengali, QStringLiteral(
"bn") },
41 { Bosnian, QStringLiteral(
"bs") },
42 { Bulgarian, QStringLiteral(
"bg") },
43 { Cantonese, QStringLiteral(
"yue") },
44 { Catalan, QStringLiteral(
"ca") },
45 { Cebuano, QStringLiteral(
"ceb") },
46 { Chichewa, QStringLiteral(
"ny") },
47 { Corsican, QStringLiteral(
"co") },
48 { Croatian, QStringLiteral(
"hr") },
49 { Czech, QStringLiteral(
"cs") },
50 { Danish, QStringLiteral(
"da") },
51 { Dutch, QStringLiteral(
"nl") },
52 { English, QStringLiteral(
"en") },
53 { Esperanto, QStringLiteral(
"eo") },
54 { Estonian, QStringLiteral(
"et") },
55 { Fijian, QStringLiteral(
"fj") },
56 { Filipino, QStringLiteral(
"fil") },
57 { Finnish, QStringLiteral(
"fi") },
58 { French, QStringLiteral(
"fr") },
59 { Frisian, QStringLiteral(
"fy") },
60 { Galician, QStringLiteral(
"gl") },
61 { Georgian, QStringLiteral(
"ka") },
62 { German, QStringLiteral(
"de") },
63 { Greek, QStringLiteral(
"el") },
64 { Gujarati, QStringLiteral(
"gu") },
65 { HaitianCreole, QStringLiteral(
"ht") },
66 { Hausa, QStringLiteral(
"ha") },
67 { Hawaiian, QStringLiteral(
"haw") },
68 { Hebrew, QStringLiteral(
"he") },
69 { HillMari, QStringLiteral(
"mrj") },
70 { Hindi, QStringLiteral(
"hi") },
71 { Hmong, QStringLiteral(
"hmn") },
72 { Hungarian, QStringLiteral(
"hu") },
73 { Icelandic, QStringLiteral(
"is") },
74 { Igbo, QStringLiteral(
"ig") },
75 { Indonesian, QStringLiteral(
"id") },
76 { Irish, QStringLiteral(
"ga") },
77 { Italian, QStringLiteral(
"it") },
78 { Japanese, QStringLiteral(
"ja") },
79 { Javanese, QStringLiteral(
"jw") },
80 { Kannada, QStringLiteral(
"kn") },
81 { Kazakh, QStringLiteral(
"kk") },
82 { Khmer, QStringLiteral(
"km") },
83 { Kinyarwanda, QStringLiteral(
"rw") },
84 { Klingon, QStringLiteral(
"tlh") },
85 { KlingonPlqaD, QStringLiteral(
"tlh-Qaak") },
86 { Korean, QStringLiteral(
"ko") },
87 { Kurdish, QStringLiteral(
"ku") },
88 { Kyrgyz, QStringLiteral(
"ky") },
89 { Lao, QStringLiteral(
"lo") },
90 { Latin, QStringLiteral(
"la") },
91 { Latvian, QStringLiteral(
"lv") },
92 { LevantineArabic, QStringLiteral(
"apc") },
93 { Lithuanian, QStringLiteral(
"lt") },
94 { Luxembourgish, QStringLiteral(
"lb") },
95 { Macedonian, QStringLiteral(
"mk") },
96 { Malagasy, QStringLiteral(
"mg") },
97 { Malay, QStringLiteral(
"ms") },
98 { Malayalam, QStringLiteral(
"ml") },
99 { Maltese, QStringLiteral(
"mt") },
100 { Maori, QStringLiteral(
"mi") },
101 { Marathi, QStringLiteral(
"mr") },
102 { Mari, QStringLiteral(
"mhr") },
103 { Mongolian, QStringLiteral(
"mn") },
104 { Myanmar, QStringLiteral(
"my") },
105 { Nepali, QStringLiteral(
"ne") },
106 { Norwegian, QStringLiteral(
"no") },
107 { Oriya, QStringLiteral(
"or") },
108 { Papiamento, QStringLiteral(
"pap") },
109 { Pashto, QStringLiteral(
"ps") },
110 { Persian, QStringLiteral(
"fa") },
111 { Polish, QStringLiteral(
"pl") },
112 { Portuguese, QStringLiteral(
"pt") },
113 { Punjabi, QStringLiteral(
"pa") },
114 { QueretaroOtomi, QStringLiteral(
"otq") },
115 { Romanian, QStringLiteral(
"ro") },
116 { Russian, QStringLiteral(
"ru") },
117 { Samoan, QStringLiteral(
"sm") },
118 { ScotsGaelic, QStringLiteral(
"gd") },
119 { SerbianCyrillic, QStringLiteral(
"sr") },
120 { SerbianLatin, QStringLiteral(
"sr-Latin") },
121 { Sesotho, QStringLiteral(
"st") },
122 { Shona, QStringLiteral(
"sn") },
123 { SimplifiedChinese, QStringLiteral(
"zh-CN") },
124 { Sindhi, QStringLiteral(
"sd") },
125 { Sinhala, QStringLiteral(
"si") },
126 { Slovak, QStringLiteral(
"sk") },
127 { Slovenian, QStringLiteral(
"sl") },
128 { Somali, QStringLiteral(
"so") },
129 { Spanish, QStringLiteral(
"es") },
130 { Sundanese, QStringLiteral(
"su") },
131 { Swahili, QStringLiteral(
"sw") },
132 { Swedish, QStringLiteral(
"sv") },
133 { Tagalog, QStringLiteral(
"tl") },
134 { Tahitian, QStringLiteral(
"ty") },
135 { Tajik, QStringLiteral(
"tg") },
136 { Tamil, QStringLiteral(
"ta") },
137 { Tatar, QStringLiteral(
"tt") },
138 { Telugu, QStringLiteral(
"te") },
139 { Thai, QStringLiteral(
"th") },
140 { Tongan, QStringLiteral(
"to") },
141 { TraditionalChinese, QStringLiteral(
"zh-TW") },
142 { Turkish, QStringLiteral(
"tr") },
143 { Turkmen, QStringLiteral(
"tk") },
144 { Udmurt, QStringLiteral(
"udm") },
145 { Uighur, QStringLiteral(
"ug") },
146 { Ukrainian, QStringLiteral(
"uk") },
147 { Urdu, QStringLiteral(
"ur") },
148 { Uzbek, QStringLiteral(
"uz") },
149 { Vietnamese, QStringLiteral(
"vi") },
150 { Welsh, QStringLiteral(
"cy") },
151 { Xhosa, QStringLiteral(
"xh") },
152 { Yiddish, QStringLiteral(
"yi") },
153 { Yoruba, QStringLiteral(
"yo") },
154 { YucatecMaya, QStringLiteral(
"yua") },
155 { Zulu, QStringLiteral(
"zu") }
161const QMap<QOnlineTranslator::Language, QString> QOnlineTranslator::s_googleLanguageCodes =
163 { Hebrew, QStringLiteral(
"iw") }
169const QMap<QOnlineTranslator::Language, QString> QOnlineTranslator::s_yandexLanguageCodes =
171 { SimplifiedChinese, QStringLiteral(
"zn") },
172 { Javanese, QStringLiteral(
"jv") }
178const QMap<QOnlineTranslator::Language, QString> QOnlineTranslator::s_bingLanguageCodes =
180 { Auto, QStringLiteral(
"auto-detect") },
181 { Bosnian, QStringLiteral(
"bs-Latn") },
182 { SerbianCyrillic, QStringLiteral(
"sr-Cyrl") },
183 { SimplifiedChinese, QStringLiteral(
"zh-Hans") },
184 { TraditionalChinese, QStringLiteral(
"zh-Hant") },
185 { Hmong, QStringLiteral(
"mww") }
205 m_onlyDetectLanguage =
false;
207 m_sourceLang = sourceLang;
208 m_translationLang = translationLang ==
Auto ?
language(QLocale()) : translationLang;
209 m_uiLang = uiLang ==
Auto ?
language(QLocale()) : uiLang;
214 resetData(
ParametersError, QString(
"%1 %2 %3 %4").arg(tr(
"Selected source language"),
languageName(m_sourceLang), QMetaEnum::fromType<Engine>().valueToKey(engine), tr(
"is not supported for")));
221 resetData(
ParametersError, QString(
"%1 %2 %3 %4").arg(tr(
"Selected translation language"),
languageName(m_translationLang), QMetaEnum::fromType<Engine>().valueToKey(engine), tr(
"is not supported for")));
228 resetData(
ParametersError, QString(
"%1 %2 %3 %4").arg(tr(
"Selected ui language"),
languageName(m_uiLang), QMetaEnum::fromType<Engine>().valueToKey(engine), tr(
"is not supported for")));
235 case Google: buildGoogleStateMachine();
break;
236 case Yandex: buildYandexStateMachine();
break;
237 case Bing: buildBingStateMachine();
break;
240 m_stateMachine->start();
251 m_onlyDetectLanguage =
true;
259 case Google: buildGoogleDetectStateMachine();
break;
260 case Yandex: buildYandexDetectStateMachine();
break;
261 case Bing: buildBingDetectStateMachine();
break;
264 m_stateMachine->start();
272 if (m_currentReply !=
nullptr) { m_currentReply->abort(); }
280 return m_stateMachine->isRunning();
289 for (
auto it = m_translationOptions.cbegin(); it != m_translationOptions.cend(); ++it)
292 for (
const QOption &option : it.value())
294 arr.append(option.toJson());
300 for (
auto it = m_examples.cbegin(); it != m_examples.cend(); ++it)
303 for (
const QExample &example : it.value())
305 arr.append(example.toJson());
313 {
"source", m_source},
314 {
"sourceTranscription", m_sourceTranscription},
315 {
"sourceTranslit", m_sourceTranslit},
316 {
"translation", m_translation},
318 {
"translationTranslit", m_translationTranslit},
321 return QJsonDocument(
object);
337 return m_sourceTranslit;
345 return m_sourceTranscription;
369 return m_translation;
377 return m_translationTranslit;
393 return m_translationLang;
401 return m_translationOptions;
425 return m_errorString;
433 return m_sourceTranslitEnabled;
441 m_sourceTranslitEnabled = enable;
449 return m_translationTranslitEnabled;
457 m_translationTranslitEnabled = enable;
465 return m_sourceTranscriptionEnabled;
473 m_sourceTranscriptionEnabled = enable;
481 return m_translationOptionsEnabled;
489 m_translationOptionsEnabled = enable;
497 return m_examplesEnabled;
505 m_examplesEnabled = enable;
515 case Auto:
return tr(
"Automatically detect");
517 case Albanian:
return tr(
"Albanian");
518 case Amharic:
return tr(
"Amharic");
519 case Arabic:
return tr(
"Arabic");
520 case Armenian:
return tr(
"Armenian");
522 case Basque:
return tr(
"Basque");
523 case Bashkir:
return tr(
"Bashkir");
525 case Bengali:
return tr(
"Bengali");
526 case Bosnian:
return tr(
"Bosnian");
528 case Catalan:
return tr(
"Catalan");
530 case Cebuano:
return tr(
"Cebuano");
533 case Corsican:
return tr(
"Corsican");
534 case Croatian:
return tr(
"Croatian");
535 case Czech:
return tr(
"Czech");
536 case Danish:
return tr(
"Danish");
537 case Dutch:
return tr(
"Dutch");
538 case English:
return tr(
"English");
540 case Estonian:
return tr(
"Estonian");
541 case Fijian:
return tr(
"Fijian");
542 case Filipino:
return tr(
"Filipino");
543 case Finnish:
return tr(
"Finnish");
544 case French:
return tr(
"French");
545 case Frisian:
return tr(
"Frisian");
546 case Galician:
return tr(
"Galician");
547 case Georgian:
return tr(
"Georgian");
548 case German:
return tr(
"German");
549 case Greek:
return tr(
"Greek");
550 case Gujarati:
return tr(
"Gujarati");
552 case Hausa:
return tr(
"Hausa");
553 case Hawaiian:
return tr(
"Hawaiian");
554 case Hebrew:
return tr(
"Hebrew");
555 case HillMari:
return tr(
"Hill Mari");
556 case Hindi:
return tr(
"Hindi");
557 case Hmong:
return tr(
"Hmong");
560 case Igbo:
return tr(
"Igbo");
562 case Irish:
return tr(
"Irish");
563 case Italian:
return tr(
"Italian");
564 case Japanese:
return tr(
"Japanese");
565 case Javanese:
return tr(
"Javanese");
566 case Kannada:
return tr(
"Kannada");
567 case Kazakh:
return tr(
"Kazakh");
568 case Khmer:
return tr(
"Khmer");
570 case Klingon:
return tr(
"Klingon");
572 case Korean:
return tr(
"Korean");
573 case Kurdish:
return tr(
"Kurdish");
574 case Kyrgyz:
return tr(
"Kyrgyz");
575 case Lao:
return tr(
"Lao");
576 case Latin:
return tr(
"Latin");
577 case Latvian:
return tr(
"Latvian");
582 case Malagasy:
return tr(
"Malagasy");
583 case Malay:
return tr(
"Malay");
585 case Maltese:
return tr(
"Maltese");
586 case Maori:
return tr(
"Maori");
587 case Marathi:
return tr(
"Marathi");
588 case Mari:
return tr(
"Mari");
590 case Myanmar:
return tr(
"Myanmar");
591 case Nepali:
return tr(
"Nepali");
593 case Oriya:
return tr(
"Oriya");
594 case Chichewa:
return tr(
"Chichewa");
596 case Pashto:
return tr(
"Pashto");
597 case Persian:
return tr(
"Persian");
598 case Polish:
return tr(
"Polish");
600 case Punjabi:
return tr(
"Punjabi");
602 case Romanian:
return tr(
"Romanian");
603 case Russian:
return tr(
"Russian");
604 case Samoan:
return tr(
"Samoan");
608 case Sesotho:
return tr(
"Sesotho");
609 case Shona:
return tr(
"Shona");
610 case Sindhi:
return tr(
"Sindhi");
611 case Sinhala:
return tr(
"Sinhala");
612 case Slovak:
return tr(
"Slovak");
614 case Somali:
return tr(
"Somali");
615 case Spanish:
return tr(
"Spanish");
617 case Swahili:
return tr(
"Swahili");
618 case Swedish:
return tr(
"Swedish");
619 case Tagalog:
return tr(
"Tagalog");
620 case Tahitian:
return tr(
"Tahitian");
621 case Tajik:
return tr(
"Tajik");
622 case Tamil:
return tr(
"Tamil");
623 case Tatar:
return tr(
"Tatar");
624 case Telugu:
return tr(
"Telugu");
625 case Thai:
return tr(
"Thai");
626 case Tongan:
return tr(
"Tongan");
627 case Turkish:
return tr(
"Turkish");
628 case Turkmen:
return tr(
"Turkmen");
629 case Udmurt:
return tr(
"Udmurt");
630 case Uighur:
return tr(
"Uighur");
632 case Urdu:
return tr(
"Urdu");
633 case Uzbek:
return tr(
"Uzbek");
635 case Welsh:
return tr(
"Welsh");
636 case Xhosa:
return tr(
"Xhosa");
637 case Yiddish:
return tr(
"Yiddish");
638 case Yoruba:
return tr(
"Yoruba");
640 case Zulu:
return tr(
"Zulu");
641 default:
return QString();
650 return s_genericLanguageCodes.value(lang);
658 switch (locale.language())
660 case QLocale::Afrikaans:
return Afrikaans;
661 case QLocale::Albanian:
return Albanian;
662 case QLocale::Amharic:
return Amharic;
663 case QLocale::Arabic:
return Arabic;
664 case QLocale::Armenian:
return Armenian;
666 case QLocale::Basque:
return Basque;
668 case QLocale::Bengali:
return Bengali;
669 case QLocale::Bosnian:
return Bosnian;
670 case QLocale::Bulgarian:
return Bulgarian;
671 case QLocale::Catalan:
return Catalan;
674 case QLocale::Corsican:
return Corsican;
675 case QLocale::Croatian:
return Croatian;
676 case QLocale::Czech:
return Czech;
677 case QLocale::Danish:
return Danish;
678 case QLocale::Dutch:
return Dutch;
679 case QLocale::Esperanto:
return Esperanto;
680 case QLocale::Estonian:
return Estonian;
681 case QLocale::Finnish:
return Finnish;
682 case QLocale::French:
return French;
683 case QLocale::Frisian:
return Frisian;
684 case QLocale::Galician:
return Galician;
685 case QLocale::Georgian:
return Georgian;
686 case QLocale::German:
return German;
687 case QLocale::Greek:
return Greek;
688 case QLocale::Gujarati:
return Gujarati;
690 case QLocale::Hausa:
return Hausa;
691 case QLocale::Hawaiian:
return Hawaiian;
692 case QLocale::Hebrew:
return Hebrew;
693 case QLocale::Hindi:
return Hindi;
694 case QLocale::Hungarian:
return Hungarian;
695 case QLocale::Icelandic:
return Icelandic;
696 case QLocale::Igbo:
return Igbo;
698 case QLocale::Irish:
return Irish;
699 case QLocale::Italian:
return Italian;
700 case QLocale::Japanese:
return Japanese;
701 case QLocale::Javanese:
return Javanese;
702 case QLocale::Kannada:
return Kannada;
703 case QLocale::Kazakh:
return Kazakh;
704 case QLocale::Khmer:
return Khmer;
706 case QLocale::Korean:
return Korean;
707 case QLocale::Kurdish:
return Kurdish;
708 case QLocale::Lao:
return Lao;
709 case QLocale::Latin:
return Latin;
710 case QLocale::Latvian:
return Latvian;
714 case QLocale::Malagasy:
return Malagasy;
715 case QLocale::Malay:
return Malay;
716 case QLocale::Malayalam:
return Malayalam;
717 case QLocale::Maltese:
return Maltese;
718 case QLocale::Maori:
return Maori;
719 case QLocale::Marathi:
return Marathi;
720 case QLocale::Mongolian:
return Mongolian;
721 case QLocale::Nepali:
return Nepali;
722 case QLocale::NorwegianBokmal:
return Norwegian;
723 case QLocale::Oriya:
return Oriya;
724 case QLocale::Pashto:
return Pashto;
725 case QLocale::Persian:
return Persian;
726 case QLocale::Polish:
return Polish;
728 case QLocale::Punjabi:
return Punjabi;
729 case QLocale::Romanian:
return Romanian;
730 case QLocale::Russian:
return Russian;
731 case QLocale::Samoan:
return Samoan;
734 case QLocale::Shona:
return Shona;
735 case QLocale::Sindhi:
return Sindhi;
736 case QLocale::Sinhala:
return Sinhala;
737 case QLocale::Slovak:
return Slovak;
738 case QLocale::Slovenian:
return Slovenian;
739 case QLocale::Somali:
return Somali;
740 case QLocale::Spanish:
return Spanish;
741 case QLocale::Sundanese:
return Sundanese;
742 case QLocale::Swahili:
return Swahili;
743 case QLocale::Swedish:
return Swedish;
744 case QLocale::Filipino:
return Filipino;
745 case QLocale::Tajik:
return Tajik;
746 case QLocale::Tamil:
return Tamil;
747 case QLocale::Tatar:
return Tatar;
748 case QLocale::Telugu:
return Telugu;
749 case QLocale::Thai:
return Thai;
750 case QLocale::Turkish:
return Turkish;
751 case QLocale::Turkmen:
return Turkmen;
752 case QLocale::Uighur:
return Uighur;
753 case QLocale::Ukrainian:
return Ukrainian;
754 case QLocale::Urdu:
return Urdu;
755 case QLocale::Uzbek:
return Uzbek;
757 case QLocale::Welsh:
return Welsh;
758 case QLocale::Xhosa:
return Xhosa;
759 case QLocale::Yiddish:
return Yiddish;
760 case QLocale::Yoruba:
return Yoruba;
761 case QLocale::Zulu:
return Zulu;
772 return s_genericLanguageCodes.key(langCode,
NoLanguage);
780 bool isSupported =
false;
931void QOnlineTranslator::skipGarbageText()
933 m_translation.append(sender()->property(s_textProperty).toString());
939void QOnlineTranslator::requestGoogleTranslate()
941 const QString sourceText = sender()->property(s_textProperty).toString();
944 QUrl url(QStringLiteral(
"https://translate.googleapis.com/translate_a/single"));
946 url.setQuery(QStringLiteral(
"client=gtx&ie=UTF-8&oe=UTF-8&dt=bd&dt=ex&dt=ld&dt=md&dt=rw&dt=rm&dt=ss&dt=t&dt=at&dt=qc&sl=%1&tl=%2&hl=%3&q=%4")
947 .arg(languageApiCode(
Google, m_sourceLang), languageApiCode(
Google, m_translationLang), languageApiCode(
Google, m_uiLang), QUrl::toPercentEncoding(sourceText)));
949 m_currentReply = m_networkManager->get(QNetworkRequest(url));
955void QOnlineTranslator::parseGoogleTranslate()
957 m_currentReply->deleteLater();
960 if (m_currentReply->error() != QNetworkReply::NoError)
962 if (m_currentReply->error() == QNetworkReply::ServiceUnavailableError)
963 { resetData(
ServiceError, tr(
"Error: Engine systems have detected suspicious traffic from your computer network. Please try your request again later.")); }
965 { resetData(
NetworkError, m_currentReply->errorString()); }
970 const QByteArray data = m_currentReply->readAll();
971 if (data.startsWith(
'<'))
973 resetData(
ServiceError, tr(
"Error: Engine systems have detected suspicious traffic from your computer network. Please try your request again later."));
978 const QJsonDocument jsonResponse = QJsonDocument::fromJson(data);
979 const QJsonArray jsonData = jsonResponse.array();
981 if (m_sourceLang ==
Auto)
987 resetData(
ParsingError, tr(
"Error: Unable to parse autodetected language"));
990 if (m_onlyDetectLanguage) {
return; }
993 addSpaceBetweenParts(m_translation);
994 addSpaceBetweenParts(m_translationTranslit);
995 addSpaceBetweenParts(m_sourceTranslit);
997 for (
const QJsonValueRef translationData : jsonData.at(0).toArray())
999 const QJsonArray translationArray = translationData.toArray();
1000 m_translation.append(translationArray.at(0).toString());
1001 if (m_translationTranslitEnabled) { m_translationTranslit.append(translationArray.at(2).toString()); }
1002 if (m_sourceTranslitEnabled) { m_sourceTranslit.append(translationArray.at(3).toString()); }
1005 if (m_source.size() >= s_googleTranslateLimit) {
return; }
1008 if (m_translationOptionsEnabled)
1011 for (
const QJsonValueRef typeOfSpeechData : jsonData.at(1).toArray())
1013 const QJsonArray typeOfSpeechDataArray = typeOfSpeechData.toArray();
1014 const QString typeOfSpeech = typeOfSpeechDataArray.at(0).toString();
1016 for (
const QJsonValueRef wordData : typeOfSpeechDataArray.at(2).toArray())
1018 const QJsonArray wordDataArray = wordData.toArray();
1019 const QString word = wordDataArray.at(0).toString();
1020 const QString gender = wordDataArray.at(4).toString();
1021 const QJsonArray translationsArray = wordDataArray.at(1).toArray();
1022 QStringList translations;
1023 translations.reserve(translationsArray.size());
1024 for (
const QJsonValue &wordTranslation : translationsArray)
1025 { translations.append(wordTranslation.toString()); }
1026 m_translationOptions[typeOfSpeech].append({word, gender, translations});
1032 if (m_examplesEnabled)
1035 for (
const QJsonValueRef exampleData : jsonData.at(12).toArray())
1037 const QJsonArray exampleDataArray = exampleData.toArray();
1038 const QString typeOfSpeech = exampleDataArray.at(0).toString();
1039 const QJsonArray example = exampleDataArray.at(1).toArray().first().toArray();
1041 m_examples[typeOfSpeech].append({example.at(2).toString(), example.at(0).toString()});
1049void QOnlineTranslator::requestYandexKey()
1051 const QUrl url(QStringLiteral(
"https://translate.yandex.com"));
1052 m_currentReply = m_networkManager->get(QNetworkRequest(url));
1058void QOnlineTranslator::parseYandexKey()
1060 m_currentReply->deleteLater();
1062 if (m_currentReply->error() != QNetworkReply::NoError)
1064 resetData(
NetworkError, m_currentReply->errorString());
1069 const QByteArray webSiteData = m_currentReply->readAll();
1070 if (webSiteData.isEmpty() || webSiteData.contains(
"<title>Oops!</title>") || webSiteData.contains(
"<title>302 Found</title>"))
1072 resetData(
ServiceError, tr(
"Error: Engine systems have detected suspicious traffic from your computer network. Please try your request again later."));
1076 const QByteArray sidBeginString =
"SID: '";
1077 const int sidBeginStringPos = webSiteData.indexOf(sidBeginString);
1078 if (sidBeginStringPos == -1)
1080 resetData(
ParsingError, tr(
"Error: Unable to find Yandex SID in web version."));
1084 const int sidBeginPosition = sidBeginStringPos + sidBeginString.size();
1085 const int sidEndPosition = webSiteData.indexOf(
'\'', sidBeginPosition);
1086 if (sidEndPosition == -1)
1088 resetData(
ParsingError, tr(
"Error: Unable to extract Yandex SID from web version."));
1093 const QString sid = webSiteData.mid(sidBeginPosition, sidEndPosition - sidBeginPosition);
1094 QStringList sidParts = sid.split(
'.');
1095 for (
int i = 0; i < sidParts.size(); ++i) { std::reverse(sidParts[i].begin(), sidParts[i].end()); }
1097 s_yandexKey = sidParts.join(
'.');
1103void QOnlineTranslator::requestYandexTranslate()
1105 const QString sourceText = sender()->property(s_textProperty).toString();
1108 if (m_sourceLang ==
Auto) { lang = languageApiCode(
Yandex, m_translationLang); }
1109 else { lang = QString(
"%1-%2").arg(languageApiCode(
Yandex, m_sourceLang), languageApiCode(
Yandex, m_translationLang)); }
1112 QUrl url(QStringLiteral(
"https://translate.yandex.net/api/v1/tr.json/translate"));
1113 url.setQuery(QStringLiteral(
"id=%1-2-0&srv=tr-text&text=%2&lang=%3").arg(s_yandexKey, QUrl::toPercentEncoding(sourceText), lang));
1116 QNetworkRequest request;
1117 request.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
1118 request.setUrl(url);
1121 m_currentReply = m_networkManager->post(request, QByteArray());
1127void QOnlineTranslator::parseYandexTranslate()
1129 m_currentReply->deleteLater();
1132 if (m_currentReply->error() != QNetworkReply::NoError)
1135 if (m_currentReply->error() < QNetworkReply::ContentAccessDenied)
1137 resetData(
NetworkError, m_currentReply->errorString());
1142 s_yandexKey.clear();
1143 const QJsonDocument jsonResponse = QJsonDocument::fromJson(m_currentReply->readAll());
1144 resetData(
ServiceError, jsonResponse.object().value(QStringLiteral(
"message")).toString());
1149 const QJsonDocument jsonResponse = QJsonDocument::fromJson(m_currentReply->readAll());
1150 const QJsonObject jsonData = jsonResponse.object();
1153 if (m_sourceLang ==
Auto)
1155 QString sourceCode = jsonData.value(QStringLiteral(
"lang")).toString();
1156 sourceCode = sourceCode.left(sourceCode.indexOf(
'-'));
1160 resetData(
ParsingError, tr(
"Error: Unable to parse autodetected language"));
1163 if (m_onlyDetectLanguage) {
return; }
1167 m_translation += jsonData.value(QStringLiteral(
"text")).toArray().at(0).toString();
1173void QOnlineTranslator::requestYandexSourceTranslit()
1175 requestYandexTranslit(m_sourceLang);
1181void QOnlineTranslator::parseYandexSourceTranslit()
1183 parseYandexTranslit(m_sourceTranslit);
1189void QOnlineTranslator::requestYandexTranslationTranslit()
1191 requestYandexTranslit(m_translationLang);
1197void QOnlineTranslator::parseYandexTranslationTranslit()
1199 parseYandexTranslit(m_translationTranslit);
1205void QOnlineTranslator::requestYandexDictionary()
1208 if (!isSupportDictionary(
Yandex, m_sourceLang, m_translationLang) && !m_source.contains(
' '))
1210 auto *state = qobject_cast<QState *>(sender());
1211 state->addTransition(
new QFinalState(state->parentState()));
1215 const QString text = sender()->property(s_textProperty).toString();
1216 QUrl url(QStringLiteral(
"https://dictionary.yandex.net/dicservice.json/lookupMultiple"));
1217 url.setQuery(QStringLiteral(
"text=%1&ui=%2&dict=%3-%4").arg(QUrl::toPercentEncoding(text), languageApiCode(
Yandex, m_uiLang), languageApiCode(
Yandex, m_sourceLang), languageApiCode(
Yandex, m_translationLang)));
1219 m_currentReply = m_networkManager->get(QNetworkRequest(url));
1225void QOnlineTranslator::parseYandexDictionary()
1227 m_currentReply->deleteLater();
1229 if (m_currentReply->error() != QNetworkReply::NoError)
1231 resetData(
NetworkError, m_currentReply->errorString());
1235 const QJsonDocument jsonResponse = QJsonDocument::fromJson(m_currentReply->readAll());
1236 const QJsonValue jsonData = jsonResponse.object().value(languageApiCode(
Yandex, m_sourceLang) +
'-' + languageApiCode(
Yandex, m_translationLang)).toObject().value(QStringLiteral(
"regular"));
1238 if (m_sourceTranscriptionEnabled)
1239 { m_sourceTranscription = jsonData.toArray().at(0).toObject().value(QStringLiteral(
"ts")).toString(); }
1242 for (
const QJsonValueRef typeOfSpeechData : jsonData.toArray())
1244 QJsonObject typeOfSpeechObject = typeOfSpeechData.toObject();
1245 const QString typeOfSpeech = typeOfSpeechObject.value(QStringLiteral(
"pos")).toObject().value(QStringLiteral(
"text")).toString();
1247 for (
const QJsonValueRef wordData : typeOfSpeechObject.value(QStringLiteral(
"tr")).toArray())
1250 const QJsonObject wordObject = wordData.toObject();
1251 const QString word = wordObject.value(QStringLiteral(
"text")).toString();
1252 const QString gender = wordObject.value(QStringLiteral(
"gen")).toObject().value(QStringLiteral(
"text")).toString();
1253 const QJsonArray translationsArray = wordObject.value(QStringLiteral(
"mean")).toArray();
1254 QStringList translations;
1255 translations.reserve(translationsArray.size());
1256 for (
const QJsonValue &wordTranslation : translationsArray)
1257 { translations.append(wordTranslation.toObject().value(QStringLiteral(
"text")).toString()); }
1259 m_translationOptions[typeOfSpeech].append({word, gender, translations});
1262 if (m_examplesEnabled && wordObject.contains(QLatin1String(
"ex")))
1265 for (
const QJsonValueRef exampleData : wordObject.value(QStringLiteral(
"ex")).toArray())
1267 const QJsonObject exampleObject = exampleData.toObject();
1268 const QString example = exampleObject.value(QStringLiteral(
"text")).toString();
1269 const QString description = exampleObject.value(QStringLiteral(
"tr")).toArray().first().toObject().value(QStringLiteral(
"text")).toString();
1271 m_examples[typeOfSpeech].append({example, description});
1281void QOnlineTranslator::requestBingCredentials()
1283 const QUrl url(QStringLiteral(
"https://www.bing.com/translator"));
1284 m_currentReply = m_networkManager->get(QNetworkRequest(url));
1290void QOnlineTranslator::parseBingCredentials()
1292 m_currentReply->deleteLater();
1294 if (m_currentReply->error() != QNetworkReply::NoError)
1296 resetData(
NetworkError, m_currentReply->errorString());
1300 const QByteArray webSiteData = m_currentReply->readAll();
1301 const QByteArray credentialsBeginString =
"var params_RichTranslateHelper = [";
1302 const int credentialsBeginPos = webSiteData.indexOf(credentialsBeginString);
1303 if (credentialsBeginPos == -1)
1305 resetData(
ParsingError, tr(
"Error: Unable to find Bing credentials in web version."));
1309 const int keyBeginPos = credentialsBeginPos + credentialsBeginString.size();
1310 const int keyEndPos = webSiteData.indexOf(
',', keyBeginPos);
1311 if (keyEndPos == -1)
1313 resetData(
ParsingError, tr(
"Error: Unable to extract Bing key from web version."));
1316 s_bingKey = webSiteData.mid(keyBeginPos, keyEndPos - keyBeginPos);
1318 const int tokenBeginPos = keyEndPos + 2;
1319 const int tokenEndPos = webSiteData.indexOf(
'"', tokenBeginPos);
1320 if (tokenEndPos == -1)
1322 resetData(
ParsingError, tr(
"Error: Unable to extract Bing token from web version."));
1325 s_bingToken = webSiteData.mid(tokenBeginPos, tokenEndPos - tokenBeginPos);
1331void QOnlineTranslator::requestBingTranslate()
1333 const QString sourceText = sender()->property(s_textProperty).toString();
1335 const QByteArray postData = QString(
"&text=%1&fromLang=%2&to=%3&token=%4&key=%5").arg(QUrl::toPercentEncoding(sourceText, languageApiCode(
Bing, m_sourceLang).toUtf8()), languageApiCode(
Bing, m_translationLang).toUtf8(), s_bingToken, s_bingKey).toLocal8Bit();
1337 QNetworkRequest request;
1338 request.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
1339 request.setHeader(QNetworkRequest::UserAgentHeader, QString(
"%1/%2").arg(QCoreApplication::applicationName(), QCoreApplication::applicationVersion()));
1340 request.setUrl(QStringLiteral(
"https://www.bing.com/ttranslatev3"));
1343 m_currentReply = m_networkManager->post(request, postData);
1349void QOnlineTranslator::parseBingTranslate()
1351 m_currentReply->deleteLater();
1354 if (m_currentReply->error() != QNetworkReply::NoError)
1356 resetData(
NetworkError, m_currentReply->errorString());
1361 const QJsonDocument jsonResponse = QJsonDocument::fromJson(m_currentReply->readAll());
1362 const QJsonObject responseObject = jsonResponse.array().first().toObject();
1364 if (m_sourceLang ==
Auto)
1366 const QString langCode = responseObject.value(QStringLiteral(
"detectedLanguage")).toObject().value(QStringLiteral(
"language")).toString();
1370 resetData(
ParsingError, tr(
"Error: Unable to parse autodetected language"));
1373 if (m_onlyDetectLanguage) {
return; }
1376 const QJsonObject translationsObject = responseObject.value(QStringLiteral(
"translations")).toArray().first().toObject();
1377 m_translation += translationsObject.value(QStringLiteral(
"text")).toString();
1378 m_translationTranslit += translationsObject.value(QStringLiteral(
"transliteration")).toObject().value(QStringLiteral(
"text")).toString();
1384void QOnlineTranslator::requestBingDictionary()
1387 if (!isSupportDictionary(
Bing, m_sourceLang, m_translationLang) && !m_source.contains(
' '))
1389 auto *state = qobject_cast<QState *>(sender());
1390 state->addTransition(
new QFinalState(state->parentState()));
1394 const QByteArray postData = QString(
"&text=%1&from=%2&to=%3").arg(QUrl::toPercentEncoding(sender()->property(s_textProperty).toString()), languageApiCode(
Bing, m_sourceLang).toUtf8(), languageApiCode(
Bing, m_translationLang).toUtf8()).toLocal8Bit();
1396 QNetworkRequest request;
1397 request.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
1398 request.setUrl(QStringLiteral(
"https://www.bing.com/tlookupv3"));
1400 m_currentReply = m_networkManager->post(request, postData);
1406void QOnlineTranslator::parseBingDictionary()
1408 m_currentReply->deleteLater();
1411 if (m_currentReply->error() != QNetworkReply::NoError)
1413 resetData(
NetworkError, m_currentReply->errorString());
1417 const QJsonDocument jsonResponse = QJsonDocument::fromJson(m_currentReply->readAll());
1418 const QJsonObject responseObject = jsonResponse.array().first().toObject();
1420 for (
const QJsonValueRef dictionaryData : responseObject.value(QStringLiteral(
"translations")).toArray())
1422 const QJsonObject dictionaryObject = dictionaryData.toObject();
1423 const QString typeOfSpeech = dictionaryObject.value(QStringLiteral(
"posTag")).toString().toLower();
1424 const QString word = dictionaryObject.value(QStringLiteral(
"displayTarget")).toString().toLower();
1425 const QJsonArray translationsArray = dictionaryObject.value(QStringLiteral(
"backTranslations")).toArray();
1426 QStringList translations;
1427 translations.reserve(translationsArray.size());
1428 for (
const QJsonValue &wordTranslation : translationsArray)
1429 { translations.append(wordTranslation.toObject().value(QStringLiteral(
"displayText")).toString()); }
1431 m_translationOptions[typeOfSpeech].append({word, {}, translations});
1438void QOnlineTranslator::buildGoogleStateMachine()
1441 auto *translationState =
new QState(m_stateMachine);
1442 auto *finalState =
new QFinalState(m_stateMachine);
1443 m_stateMachine->setInitialState(translationState);
1445 translationState->addTransition(translationState, &QState::finished, finalState);
1448 buildSplitNetworkRequest(translationState, &QOnlineTranslator::requestGoogleTranslate, &QOnlineTranslator::parseGoogleTranslate, m_source, s_googleTranslateLimit);
1454void QOnlineTranslator::buildGoogleDetectStateMachine()
1457 auto *detectState =
new QState(m_stateMachine);
1458 auto *finalState =
new QFinalState(m_stateMachine);
1459 m_stateMachine->setInitialState(detectState);
1461 detectState->addTransition(detectState, &QState::finished, finalState);
1464 const QString text = m_source.left(getSplitIndex(m_source, s_googleTranslateLimit));
1465 buildNetworkRequestState(detectState, &QOnlineTranslator::requestGoogleTranslate, &QOnlineTranslator::parseGoogleTranslate, text);
1471void QOnlineTranslator::buildYandexStateMachine()
1474 auto *keyState =
new QState(m_stateMachine);
1475 auto *translationState =
new QState(m_stateMachine);
1476 auto *sourceTranslitState =
new QState(m_stateMachine);
1477 auto *translationTranslitState =
new QState(m_stateMachine);
1478 auto *dictionaryState =
new QState(m_stateMachine);
1479 auto *finalState =
new QFinalState(m_stateMachine);
1480 m_stateMachine->setInitialState(keyState);
1483 keyState->addTransition(keyState, &QState::finished, translationState);
1484 translationState->addTransition(translationState, &QState::finished, sourceTranslitState);
1485 sourceTranslitState->addTransition(sourceTranslitState, &QState::finished, translationTranslitState);
1486 translationTranslitState->addTransition(translationTranslitState, &QState::finished, dictionaryState);
1487 dictionaryState->addTransition(dictionaryState, &QState::finished, finalState);
1490 if (s_yandexKey.isEmpty())
1491 { buildNetworkRequestState(keyState, &QOnlineTranslator::requestYandexKey, &QOnlineTranslator::parseYandexKey); }
1493 { keyState->setInitialState(
new QFinalState(keyState)); }
1496 buildSplitNetworkRequest(translationState, &QOnlineTranslator::requestYandexTranslate, &QOnlineTranslator::parseYandexTranslate, m_source, s_yandexTranslateLimit);
1499 if (m_sourceTranslitEnabled)
1500 { buildSplitNetworkRequest(sourceTranslitState, &QOnlineTranslator::requestYandexSourceTranslit, &QOnlineTranslator::parseYandexSourceTranslit, m_source, s_yandexTranslitLimit); }
1502 { sourceTranslitState->setInitialState(
new QFinalState(sourceTranslitState)); }
1505 if (m_translationTranslitEnabled)
1506 { buildSplitNetworkRequest(translationTranslitState, &QOnlineTranslator::requestYandexTranslationTranslit, &QOnlineTranslator::parseYandexTranslationTranslit, m_translation, s_yandexTranslitLimit); }
1508 { translationTranslitState->setInitialState(
new QFinalState(translationTranslitState)); }
1511 if (m_translationOptionsEnabled && !isContainsSpace(m_source))
1512 { buildNetworkRequestState(dictionaryState, &QOnlineTranslator::requestYandexDictionary, &QOnlineTranslator::parseYandexDictionary, m_source); }
1514 { dictionaryState->setInitialState(
new QFinalState(dictionaryState)); }
1520void QOnlineTranslator::buildYandexDetectStateMachine()
1523 auto *keyState =
new QState(m_stateMachine);
1524 auto *detectState =
new QState(m_stateMachine);
1525 auto *finalState =
new QFinalState(m_stateMachine);
1526 m_stateMachine->setInitialState(keyState);
1529 keyState->addTransition(keyState, &QState::finished, detectState);
1530 detectState->addTransition(detectState, &QState::finished, finalState);
1533 if (s_yandexKey.isEmpty())
1534 { buildNetworkRequestState(keyState, &QOnlineTranslator::requestYandexKey, &QOnlineTranslator::parseYandexKey); }
1536 { keyState->setInitialState(
new QFinalState(keyState)); }
1539 const QString text = m_source.left(getSplitIndex(m_source, s_yandexTranslateLimit));
1540 buildNetworkRequestState(detectState, &QOnlineTranslator::requestYandexTranslate, &QOnlineTranslator::parseYandexTranslate, text);
1546void QOnlineTranslator::buildBingStateMachine()
1549 auto *credentialsState =
new QState(m_stateMachine);
1550 auto *translationState =
new QState(m_stateMachine);
1551 auto *dictionaryState =
new QState(m_stateMachine);
1552 auto *finalState =
new QFinalState(m_stateMachine);
1553 m_stateMachine->setInitialState(credentialsState);
1556 credentialsState->addTransition(credentialsState, &QState::finished, translationState);
1557 translationState->addTransition(translationState, &QState::finished, dictionaryState);
1558 dictionaryState->addTransition(dictionaryState, &QState::finished, finalState);
1561 if (s_bingKey.isEmpty() || s_bingToken.isEmpty())
1562 { buildNetworkRequestState(credentialsState, &QOnlineTranslator::requestBingCredentials, &QOnlineTranslator::parseBingCredentials); }
1564 { credentialsState->setInitialState(
new QFinalState(credentialsState)); }
1567 buildSplitNetworkRequest(translationState, &QOnlineTranslator::requestBingTranslate, &QOnlineTranslator::parseBingTranslate, m_source, s_bingTranslateLimit);
1570 if (m_translationOptionsEnabled && !isContainsSpace(m_source))
1571 { buildNetworkRequestState(dictionaryState, &QOnlineTranslator::requestBingDictionary, &QOnlineTranslator::parseBingDictionary, m_source); }
1573 { dictionaryState->setInitialState(
new QFinalState(dictionaryState)); }
1579void QOnlineTranslator::buildBingDetectStateMachine()
1582 auto *detectState =
new QState(m_stateMachine);
1583 auto *finalState =
new QFinalState(m_stateMachine);
1584 m_stateMachine->setInitialState(detectState);
1586 detectState->addTransition(detectState, &QState::finished, finalState);
1589 const QString text = m_source.left(getSplitIndex(m_source, s_bingTranslateLimit));
1590 buildNetworkRequestState(detectState, &QOnlineTranslator::requestBingTranslate, &QOnlineTranslator::parseBingTranslate, text);
1596void QOnlineTranslator::buildSplitNetworkRequest(QState *parent,
void (
QOnlineTranslator::*requestMethod)(),
void (
QOnlineTranslator::*parseMethod)(),
const QString &text,
int textLimit)
1598 QString unsendedText = text;
1599 auto *nextTranslationState =
new QState(parent);
1600 parent->setInitialState(nextTranslationState);
1602 while (!unsendedText.isEmpty())
1604 auto *currentTranslationState = nextTranslationState;
1605 nextTranslationState =
new QState(parent);
1608 const int splitIndex = getSplitIndex(unsendedText, textLimit);
1609 if (splitIndex == -1)
1611 currentTranslationState->setProperty(s_textProperty, unsendedText.left(textLimit));
1612 currentTranslationState->addTransition(nextTranslationState);
1613 connect(currentTranslationState, &QState::entered,
this, &QOnlineTranslator::skipGarbageText);
1616 unsendedText = unsendedText.mid(textLimit);
1620 buildNetworkRequestState(currentTranslationState, requestMethod, parseMethod, unsendedText.left(splitIndex));
1621 currentTranslationState->addTransition(currentTranslationState, &QState::finished, nextTranslationState);
1624 unsendedText = unsendedText.mid(splitIndex);
1628 nextTranslationState->addTransition(
new QFinalState(parent));
1634void QOnlineTranslator::buildNetworkRequestState(QState *parent,
void (
QOnlineTranslator::*requestMethod)(),
void (
QOnlineTranslator::*parseMethod)(),
const QString &text)
1637 auto *requestingState =
new QState(parent);
1638 auto *parsingState =
new QState(parent);
1640 parent->setInitialState(requestingState);
1642 requestingState->addTransition(m_networkManager, &QNetworkAccessManager::finished, parsingState);
1643 parsingState->addTransition(
new QFinalState(parent));
1645 requestingState->setProperty(s_textProperty, text);
1646 connect(requestingState, &QState::entered,
this, requestMethod);
1648 connect(parsingState, &QState::entered,
this, parseMethod);
1654void QOnlineTranslator::requestYandexTranslit(Language language)
1659 auto *state = qobject_cast<QState *>(sender());
1660 state->addTransition(
new QFinalState(state->parentState()));
1664 const QString text = sender()->property(s_textProperty).toString();
1667 QUrl url(QStringLiteral(
"https://translate.yandex.net/translit/translit"));
1668 url.setQuery(QString(
"text=%1&lang=%2").arg(QUrl::toPercentEncoding(text), languageApiCode(
Yandex,
language)));
1670 m_currentReply = m_networkManager->get(QNetworkRequest(url));
1676void QOnlineTranslator::parseYandexTranslit(QString &text)
1678 m_currentReply->deleteLater();
1680 if (m_currentReply->error() != QNetworkReply::NoError)
1682 resetData(
NetworkError, m_currentReply->errorString());
1686 const QByteArray reply = m_currentReply->readAll();
1688 #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
1689 text += reply.mid(1).chopped(1);
1691 text += reply.mid(1);
1699void QOnlineTranslator::resetData(TranslationError error,
const QString &errorString)
1703 m_translation.clear();
1704 m_translationTranslit.clear();
1705 m_sourceTranslit.clear();
1706 m_sourceTranscription.clear();
1707 m_translationOptions.clear();
1710 m_stateMachine->stop();
1712 for (QAbstractState *state : m_stateMachine->findChildren<QAbstractState *>())
1714 if (!m_stateMachine->configuration().contains(state))
1715 { state->deleteLater(); }
1722bool QOnlineTranslator::isSupportTranslit(Engine engine, Language lang)
1790bool QOnlineTranslator::isSupportDictionary(Engine engine, Language sourceLang, Language translationLang)
1800 switch (translationLang)
1809 switch (translationLang)
1826 switch (translationLang)
1835 switch (translationLang)
1846 switch (translationLang)
1873 switch (translationLang)
1883 switch (translationLang)
1893 switch (translationLang)
1903 switch (translationLang)
1912 switch (translationLang)
1922 switch (translationLang)
1935 switch (translationLang)
1943 switch (translationLang)
1975 switch (translationLang)
1985 switch (translationLang)
2000 if (sourceLang ==
English) { secondLang = translationLang; }
2001 else if (translationLang ==
English) { secondLang = sourceLang; }
2002 else {
return false; }
2068QString QOnlineTranslator::languageApiCode(Engine engine, Language lang)
2074 case Google:
return s_googleLanguageCodes.value(lang, s_genericLanguageCodes.value(lang));
2075 case Yandex:
return s_yandexLanguageCodes.value(lang, s_genericLanguageCodes.value(lang));
2076 case Bing:
return s_bingLanguageCodes.value(lang, s_genericLanguageCodes.value(lang));
2090 case Google:
return s_googleLanguageCodes.key(langCode, s_genericLanguageCodes.key(langCode,
NoLanguage));
2091 case Yandex:
return s_yandexLanguageCodes.key(langCode, s_genericLanguageCodes.key(langCode,
NoLanguage));
2092 case Bing:
return s_bingLanguageCodes.key(langCode, s_genericLanguageCodes.key(langCode,
NoLanguage));
2102int QOnlineTranslator::getSplitIndex(
const QString &untranslatedText,
int limit)
2104 if (untranslatedText.size() < limit) {
return limit; }
2106 int splitIndex = untranslatedText.lastIndexOf(QLatin1String(
". "), limit - 1);
2107 if (splitIndex != -1) {
return splitIndex + 1; }
2109 splitIndex = untranslatedText.lastIndexOf(
' ', limit - 1);
2110 if (splitIndex != -1) {
return splitIndex + 1; }
2112 splitIndex = untranslatedText.lastIndexOf(
'\n', limit - 1);
2113 if (splitIndex != -1) {
return splitIndex + 1; }
2115 splitIndex = untranslatedText.lastIndexOf(0x00a0, limit - 1);
2116 if (splitIndex != -1) {
return splitIndex + 1; }
2124bool QOnlineTranslator::isContainsSpace(
const QString &text)
2126 return std::any_of(text.cbegin(), text.cend(), [](QChar symbol)
2127 { return symbol.isSpace(); });
2133void QOnlineTranslator::addSpaceBetweenParts(QString &text)
2135 if (text.isEmpty()) {
return; }
2136 #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
2137 if (!text.back().isSpace())
2139 if (!text.at(text.size() - 1).isSpace())
2141 { text.append(
' '); }
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
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
@ TraditionalChinese
TraditionalChinese
@ HaitianCreole
HaitianCreole
@ KlingonPlqaD
KlingonPlqaD
@ SerbianLatin
SerbianLatin
@ SerbianCyrillic
SerbianCyrillic
@ LevantineArabic
LevantineArabic
@ SimplifiedChinese
SimplifiedChinese
@ QueretaroOtomi
QueretaroOtomi
@ Luxembourgish
Luxembourgish
TranslationError error() const
error