From 88de8b1f5c84a00454818b454241847213656c13 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Wed, 16 Feb 2022 21:49:08 +0100 Subject: [PATCH 01/11] DevTools DeepL Translate: sometimes the target language selection is wrong --- extensions/devtoolsdeepltranslate.cpp | 82 ++++++++++++++------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index 16a79ad..23af563 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -7,6 +7,7 @@ extern const wchar_t* TRANSLATION_ERROR; const char* TRANSLATION_PROVIDER = "DevTools DeepL Translate"; const char* GET_API_KEY_FROM = nullptr; +std::wstring currTranslateTo; extern const QStringList languagesTo { @@ -66,35 +67,35 @@ languagesFrom = }; extern const std::unordered_map codes { - { { L"Bulgarian" }, { L"Bulgarian" } }, - { { L"Chinese" }, { L"Chinese" } }, - { { L"Chinese (Simplified)" }, { L"Chinese (simplified)" } }, - { { L"Czech" }, { L"Czech" } }, - { { L"Danish" }, { L"Danish" } }, - { { L"Dutch" }, { L"Dutch" } }, - { { L"English" }, { L"English" } }, - { { L"English (American)" }, { L"English (American)" } }, - { { L"English (British)" }, { L"English (British)" } }, - { { L"Estonian" }, { L"Estonian" } }, - { { L"Finnish" }, { L"Finnish" } }, - { { L"French" }, { L"French" } }, - { { L"German" }, { L"German" } }, - { { L"Greek" }, { L"Greek" } }, - { { L"Hungarian" }, { L"Hungarian" } }, - { { L"Italian" }, { L"Italian" } }, - { { L"Japanese" }, { L"Japanese" } }, - { { L"Latvian" }, { L"Latvian" } }, - { { L"Lithuanian" }, { L"Lithuanian" } }, - { { L"Polish" }, { L"Polish" } }, - { { L"Portuguese" }, { L"Portuguese" } }, - { { L"Portuguese (Brazilian)" }, { L"Portuguese (Brazilian)" } }, - { { L"Romanian" }, { L"Romanian" } }, - { { L"Russian" }, { L"Russian" } }, - { { L"Slovak" }, { L"Slovak" } }, - { { L"Slovenian" }, { L"Slovenian" } }, - { { L"Spanish" }, { L"Spanish" } }, - { { L"Swedish" }, { L"Swedish" } }, - { { L"?" }, { L"Detect language" } } + { { L"Bulgarian" }, { L"bg-BG" } }, + { { L"Chinese" }, { L"zh" } }, + { { L"Chinese (Simplified)" }, { L"zh-ZH" } }, + { { L"Czech" }, { L"cs-CS" } }, + { { L"Danish" }, { L"da-DA" } }, + { { L"Dutch" }, { L"nl-NL" } }, + { { L"English" }, { L"en" } }, + { { L"English (American)" }, { L"en-US" } }, + { { L"English (British)" }, { L"en-GB" } }, + { { L"Estonian" }, { L"et-ET" } }, + { { L"Finnish" }, { L"fi-FI" } }, + { { L"French" }, { L"fr-FR" } }, + { { L"German" }, { L"de-DE" } }, + { { L"Greek" }, { L"el-EL" } }, + { { L"Hungarian" }, { L"hu-HU" } }, + { { L"Italian" }, { L"it-IT" } }, + { { L"Japanese" }, { L"ja-JA" } }, + { { L"Latvian" }, { L"lv-LV" } }, + { { L"Lithuanian" }, { L"lt-LT" } }, + { { L"Polish" }, { L"pl-PL" } }, + { { L"Portuguese" }, { L"pt-PT" } }, + { { L"Portuguese (Brazilian)" }, { L"pt-BR" } }, + { { L"Romanian" }, { L"ro-RO" } }, + { { L"Russian" }, { L"ru-RU" } }, + { { L"Slovak" }, { L"sk-SK" } }, + { { L"Slovenian" }, { L"sl-SL" } }, + { { L"Spanish" }, { L"es-ES" } }, + { { L"Swedish" }, { L"sv-SV" } }, + { { L"?" }, { L"auto" } } }; bool translateSelectedOnly = true, useRateLimiter = true, rateLimitSelected = false, useCache = true, useFilter = true; @@ -126,16 +127,21 @@ std::pair Translate(const std::wstring& text, TranslationPar std::scoped_lock lock(translationMutex); std::wstring escaped; // DeepL breaks with slash in input for (auto ch : text) ch == '/' ? escaped += L"\\/" : escaped += ch; - DevTools::SendRequest("Page.navigate", FormatString(LR"({"url":"https://www.deepl.com/en/translator#en/en/%s"})", Escape(escaped))); - for (int retry = 0; ++retry < 20; Sleep(100)) - if (Copy(DevTools::SendRequest("Runtime.evaluate", LR"({"expression":"document.readyState"})")[L"result"][L"value"].String()) == L"complete") break; + DevTools::SendRequest("Page.navigate", FormatString(LR"({"url":"https://www.deepl.com/en/translator#%s/%s/%s"})", (tlp.translateFrom == L"?") ? codes.at(tlp.translateFrom) : codes.at(tlp.translateFrom).substr(0, 2), codes.at(tlp.translateTo).substr(0, 2), Escape(escaped))); + if (currTranslateTo != tlp.translateTo) + { + currTranslateTo = tlp.translateTo; + for (int retry = 0; ++retry < 20; Sleep(100)) + if (Copy(DevTools::SendRequest("Runtime.evaluate", LR"({"expression":"document.readyState"})")[L"result"][L"value"].String()) == L"complete") break; - DevTools::SendRequest("Runtime.evaluate", FormatString(LR"({"expression":" - document.querySelector('.lmt__language_select--source').querySelector('button').click(); - document.evaluate(`//*[text()='%s']`,document.querySelector('.lmt__language_select__menu'),null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue.click(); - document.querySelector('.lmt__language_select--target').querySelector('button').click(); - document.evaluate(`//*[text()='%s']`,document.querySelector('.lmt__language_select__menu'),null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue.click(); - "})", codes.at(tlp.translateFrom), codes.at(tlp.translateTo))); + DevTools::SendRequest("Runtime.evaluate", FormatString(LR"({"expression":" + document.querySelector('.lmt__language_select--source').querySelector('button').click(); + document.querySelector('[dl-test=translator-lang-option-%s').click(); + + document.querySelector('.lmt__language_select--target').querySelector('button').click(); + document.querySelector('[dl-test=translator-lang-option-%s]').click(); + "})", (tlp.translateFrom == L"?") ? codes.at(tlp.translateFrom) : codes.at(tlp.translateFrom).substr(0, 2), codes.at(tlp.translateTo))); + } for (int retry = 0; ++retry < 100; Sleep(100)) if (auto translation = Copy(DevTools::SendRequest("Runtime.evaluate", From 7cc8d3871e427cfc6dee38b92ecda67d106b0fe2 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 19 Apr 2022 19:11:07 +0200 Subject: [PATCH 02/11] some characters are in Html encoded format in the translated text --- extensions/devtoolsdeepltranslate.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index 23af563..b422a99 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -119,6 +119,21 @@ BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved return TRUE; } +std::wstring htmlDecode (std::wstring text) { + const std::wstring enc[] = { L"&", L"<", L">" }; + const std::wstring dec[] = { L"&", L"<", L">" }; + + size_t pos; + for(int j = 0; j < 3; j++) { + do { + pos = text.find(enc[j]); + if (pos != std::wstring::npos) + text.replace (pos,enc[j].length(),dec[j]); + } while (pos != std::wstring::npos); + } + return text; +} + std::pair Translate(const std::wstring& text, TranslationParam tlp) { if (!DevTools::Connected()) return { false, FormatString(L"%s: %s", TRANSLATION_ERROR, ERROR_START_CHROME) }; @@ -146,7 +161,7 @@ std::pair Translate(const std::wstring& text, TranslationPar for (int retry = 0; ++retry < 100; Sleep(100)) if (auto translation = Copy(DevTools::SendRequest("Runtime.evaluate", LR"({"expression":"document.querySelector('#target-dummydiv').innerHTML.trim() ","returnByValue":true})" - )[L"result"][L"value"].String())) if (!translation->empty()) return { true, translation.value() }; + )[L"result"][L"value"].String())) if (!translation->empty()) return { true, htmlDecode(translation.value()) }; if (auto errorMessage = Copy(DevTools::SendRequest("Runtime.evaluate", LR"({"expression":"document.querySelector('div.lmt__system_notification').innerHTML","returnByValue":true})" )[L"result"][L"value"].String())) return { false, FormatString(L"%s: %s", TRANSLATION_ERROR, errorMessage.value()) }; From 3d042c29c8a23aad69b5ad2c2d40fd08fee242f8 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Sat, 4 Jun 2022 20:07:02 +0200 Subject: [PATCH 03/11] Added Turkish language selection --- extensions/devtoolsdeepltranslate.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index b422a99..c6eaad2 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -36,7 +36,8 @@ extern const QStringList languagesTo "Slovak", "Slovenian", "Spanish", - "Swedish" + "Swedish", + "Turkish" }, languagesFrom = { @@ -63,7 +64,8 @@ languagesFrom = "Slovak", "Slovenian", "Spanish", - "Swedish" + "Swedish", + "Turkish" }; extern const std::unordered_map codes { @@ -95,6 +97,7 @@ extern const std::unordered_map codes { { L"Slovenian" }, { L"sl-SL" } }, { { L"Spanish" }, { L"es-ES" } }, { { L"Swedish" }, { L"sv-SV" } }, + { { L"Turkish" }, { L"tr-TR" } }, { { L"?" }, { L"auto" } } }; From 560c1a9a050d10e3a065f8fd143f34e370ecdd90 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Sun, 12 Jun 2022 10:35:50 +0200 Subject: [PATCH 04/11] Added Indonesian language selection --- extensions/devtoolsdeepltranslate.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index c6eaad2..b96c8bf 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -24,6 +24,7 @@ extern const QStringList languagesTo "German", "Greek", "Hungarian", + "Indonesian", "Italian", "Japanese", "Latvian", @@ -53,6 +54,7 @@ languagesFrom = "German", "Greek", "Hungarian", + "Indonesian", "Italian", "Japanese", "Latvian", @@ -84,6 +86,7 @@ extern const std::unordered_map codes { { L"German" }, { L"de-DE" } }, { { L"Greek" }, { L"el-EL" } }, { { L"Hungarian" }, { L"hu-HU" } }, + { { L"Indonesian" }, { L"id-ID" } }, { { L"Italian" }, { L"it-IT" } }, { { L"Japanese" }, { L"ja-JA" } }, { { L"Latvian" }, { L"lv-LV" } }, From 78e3be549e1553281e42dff3a57f34b11e3ef979 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 19 Jul 2022 18:33:49 +0200 Subject: [PATCH 05/11] Fixed closure drop-down language selection due to site modification --- extensions/devtoolsdeepltranslate.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index b96c8bf..a895d7d 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -162,6 +162,11 @@ std::pair Translate(const std::wstring& text, TranslationPar document.querySelector('.lmt__language_select--target').querySelector('button').click(); document.querySelector('[dl-test=translator-lang-option-%s]').click(); "})", (tlp.translateFrom == L"?") ? codes.at(tlp.translateFrom) : codes.at(tlp.translateFrom).substr(0, 2), codes.at(tlp.translateTo))); + //Fixed closure drop-down language selection due to site modification + DevTools::SendRequest("Runtime.evaluate", FormatString(LR"({"expression":" + document.querySelector('[class=lmt__textarea_container]').click(); + "})")); + Sleep(200); } for (int retry = 0; ++retry < 100; Sleep(100)) From fcf1ea2f14785c99d7196eec485f322f8a9843e9 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Mon, 19 Sep 2022 23:45:10 +0200 Subject: [PATCH 06/11] Added Ukrainian language selection --- extensions/devtoolsdeepltranslate.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index a895d7d..6753194 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -38,7 +38,8 @@ extern const QStringList languagesTo "Slovenian", "Spanish", "Swedish", - "Turkish" + "Turkish", + "Ukrainian" }, languagesFrom = { @@ -67,7 +68,8 @@ languagesFrom = "Slovenian", "Spanish", "Swedish", - "Turkish" + "Turkish", + "Ukrainian" }; extern const std::unordered_map codes { @@ -101,6 +103,7 @@ extern const std::unordered_map codes { { L"Spanish" }, { L"es-ES" } }, { { L"Swedish" }, { L"sv-SV" } }, { { L"Turkish" }, { L"tr-TR" } }, + { { L"Ukrainian" }, { L"uk-UK" } }, { { L"?" }, { L"auto" } } }; From 786e0aac05f492ee9eb298af67b3fc2affdaddac Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 21 Feb 2023 22:30:00 +0100 Subject: [PATCH 07/11] Added Korean and Norwegian languages selection --- extensions/devtoolsdeepltranslate.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index 6753194..2fbd5b4 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -27,8 +27,10 @@ extern const QStringList languagesTo "Indonesian", "Italian", "Japanese", + "Korean", "Latvian", "Lithuanian", + "Norwegian", "Polish", "Portuguese", "Portuguese (Brazilian)", @@ -58,8 +60,10 @@ languagesFrom = "Indonesian", "Italian", "Japanese", + "Korean", "Latvian", "Lithuanian", + "Norwegian", "Polish", "Portuguese", "Romanian", @@ -91,8 +95,10 @@ extern const std::unordered_map codes { { L"Indonesian" }, { L"id-ID" } }, { { L"Italian" }, { L"it-IT" } }, { { L"Japanese" }, { L"ja-JA" } }, + { { L"Korean" }, { L"ko-KO" } }, { { L"Latvian" }, { L"lv-LV" } }, { { L"Lithuanian" }, { L"lt-LT" } }, + { { L"Norwegian" }, { L"nb-NB" } }, { { L"Polish" }, { L"pl-PL" } }, { { L"Portuguese" }, { L"pt-PT" } }, { { L"Portuguese (Brazilian)" }, { L"pt-BR" } }, From cb43f0db014f20f9e5924bffe29043d796244c55 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 4 Apr 2023 01:12:30 +0200 Subject: [PATCH 08/11] DeepL changed the way to select secondary language (US English and UK English) --- extensions/devtoolsdeepltranslate.cpp | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index 2fbd5b4..666e71f 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -157,25 +157,14 @@ std::pair Translate(const std::wstring& text, TranslationPar std::scoped_lock lock(translationMutex); std::wstring escaped; // DeepL breaks with slash in input for (auto ch : text) ch == '/' ? escaped += L"\\/" : escaped += ch; - DevTools::SendRequest("Page.navigate", FormatString(LR"({"url":"https://www.deepl.com/en/translator#%s/%s/%s"})", (tlp.translateFrom == L"?") ? codes.at(tlp.translateFrom) : codes.at(tlp.translateFrom).substr(0, 2), codes.at(tlp.translateTo).substr(0, 2), Escape(escaped))); - if (currTranslateTo != tlp.translateTo) + if (currTranslateTo == tlp.translateTo) + DevTools::SendRequest("Page.navigate", FormatString(LR"({"url":"https://www.deepl.com/en/translator#%s/%s/%s"})", (tlp.translateFrom == L"?") ? codes.at(tlp.translateFrom) : codes.at(tlp.translateFrom).substr(0, 2), codes.at(tlp.translateTo).substr(0, 2), Escape(escaped))); + else { currTranslateTo = tlp.translateTo; for (int retry = 0; ++retry < 20; Sleep(100)) if (Copy(DevTools::SendRequest("Runtime.evaluate", LR"({"expression":"document.readyState"})")[L"result"][L"value"].String()) == L"complete") break; - - DevTools::SendRequest("Runtime.evaluate", FormatString(LR"({"expression":" - document.querySelector('.lmt__language_select--source').querySelector('button').click(); - document.querySelector('[dl-test=translator-lang-option-%s').click(); - - document.querySelector('.lmt__language_select--target').querySelector('button').click(); - document.querySelector('[dl-test=translator-lang-option-%s]').click(); - "})", (tlp.translateFrom == L"?") ? codes.at(tlp.translateFrom) : codes.at(tlp.translateFrom).substr(0, 2), codes.at(tlp.translateTo))); - //Fixed closure drop-down language selection due to site modification - DevTools::SendRequest("Runtime.evaluate", FormatString(LR"({"expression":" - document.querySelector('[class=lmt__textarea_container]').click(); - "})")); - Sleep(200); + DevTools::SendRequest("Page.navigate", FormatString(LR"({"url":"https://www.deepl.com/en/translator#%s/%s/%s"})", (tlp.translateFrom == L"?") ? codes.at(tlp.translateFrom) : codes.at(tlp.translateFrom).substr(0, 2), codes.at(tlp.translateTo), Escape(escaped))); } for (int retry = 0; ++retry < 100; Sleep(100)) From da56952c614e9a6f47497e1c130985d601f53161 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 4 Apr 2023 01:32:07 +0200 Subject: [PATCH 09/11] DeepL changed the way to select secondary language (US English and UK English) --- extensions/devtoolsdeepltranslate.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index 666e71f..705a3f2 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -162,8 +162,6 @@ std::pair Translate(const std::wstring& text, TranslationPar else { currTranslateTo = tlp.translateTo; - for (int retry = 0; ++retry < 20; Sleep(100)) - if (Copy(DevTools::SendRequest("Runtime.evaluate", LR"({"expression":"document.readyState"})")[L"result"][L"value"].String()) == L"complete") break; DevTools::SendRequest("Page.navigate", FormatString(LR"({"url":"https://www.deepl.com/en/translator#%s/%s/%s"})", (tlp.translateFrom == L"?") ? codes.at(tlp.translateFrom) : codes.at(tlp.translateFrom).substr(0, 2), codes.at(tlp.translateTo), Escape(escaped))); } From c6b52b6886603d3c80760c745ba7bd52aedf5cde Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 16 May 2023 20:35:45 +0200 Subject: [PATCH 10/11] DeepL selector traslation text fix --- extensions/devtoolsdeepltranslate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index 705a3f2..9f61a87 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -167,7 +167,7 @@ std::pair Translate(const std::wstring& text, TranslationPar for (int retry = 0; ++retry < 100; Sleep(100)) if (auto translation = Copy(DevTools::SendRequest("Runtime.evaluate", - LR"({"expression":"document.querySelector('#target-dummydiv').innerHTML.trim() ","returnByValue":true})" + LR"({"expression":"document.querySelector('.lmt__side_container--target [data-testid=translator-target-input]').textContent.trim() ","returnByValue":true})" )[L"result"][L"value"].String())) if (!translation->empty()) return { true, htmlDecode(translation.value()) }; if (auto errorMessage = Copy(DevTools::SendRequest("Runtime.evaluate", LR"({"expression":"document.querySelector('div.lmt__system_notification').innerHTML","returnByValue":true})" From 916b2c87b68e468ebc388ad16d7b00c662a8e0fe Mon Sep 17 00:00:00 2001 From: Blu3train Date: Wed, 27 Sep 2023 18:57:36 +0200 Subject: [PATCH 11/11] DeepL selector traslation text fix --- extensions/devtoolsdeepltranslate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/devtoolsdeepltranslate.cpp b/extensions/devtoolsdeepltranslate.cpp index 9f61a87..7ec6b79 100644 --- a/extensions/devtoolsdeepltranslate.cpp +++ b/extensions/devtoolsdeepltranslate.cpp @@ -167,7 +167,7 @@ std::pair Translate(const std::wstring& text, TranslationPar for (int retry = 0; ++retry < 100; Sleep(100)) if (auto translation = Copy(DevTools::SendRequest("Runtime.evaluate", - LR"({"expression":"document.querySelector('.lmt__side_container--target [data-testid=translator-target-input]').textContent.trim() ","returnByValue":true})" + LR"({"expression":"document.querySelector('[data-testid=translator-target-input]').textContent.trim() ","returnByValue":true})" )[L"result"][L"value"].String())) if (!translation->empty()) return { true, htmlDecode(translation.value()) }; if (auto errorMessage = Copy(DevTools::SendRequest("Runtime.evaluate", LR"({"expression":"document.querySelector('div.lmt__system_notification').innerHTML","returnByValue":true})"