diff -r 0a24808561e0 -r 0de153b92d53 Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py --- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py Fri Oct 05 19:02:37 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py Sat Oct 06 14:47:40 2018 +0200 @@ -14,10 +14,11 @@ pass import json -import re from PyQt5.QtCore import QUrl, QByteArray, QTimer +import Utilities + from .TranslationEngine import TranslationEngine @@ -26,8 +27,8 @@ Class implementing the translation engine for the DeepL translation service. """ - TranslatorUrl = "https://www.deepl.com/jsonrpc" - MaxTranslationTextLen = 5000 + TranslatorUrl = "https://api.deepl.com/v1/translate" + MaxTranslationTextLen = 30 * 1024 def __init__(self, plugin, parent=None): """ @@ -40,8 +41,6 @@ """ super(DeepLEngine, self).__init__(plugin, parent) - self.__splitPattern = re.compile(r"([^\.!\?;]+[\.!\?;]*)") - QTimer.singleShot(0, self.availableTranslationsLoaded.emit) def engineName(self): @@ -80,71 +79,36 @@ "Text to be translated exceeds the translation limit of {0}" " characters.").format(self.MaxTranslationTextLen), False - sentences = [s for s in self.__splitPattern.split(text) if len(s) > 0] - if originalLanguage in self.supportedLanguages(): - originalLanguageU = originalLanguage.upper() - else: - originalLanguageU = "auto" - payload = { - "jsonrpc": "2.0", - "method": "LMT_handle_jobs", - "id": 1, - "params": { - "jobs": [ - {"kind": "default", "raw_en_sentence": s} - for s in sentences - ], - "lang": { - "user_preferred_langs": [ - originalLanguage.upper(), - translationLanguage.upper(), - ], - "source_lang_user_selected": originalLanguageU, - "target_lang": translationLanguage.upper() - }, - "priority": 1, - } - } - request = QByteArray(json.dumps(payload).encode("utf-8")) - response, ok = requestObject.post(QUrl(self.TranslatorUrl), request, - "json") + apiKey = self.plugin.getPreferences("DeeplKey") + if not apiKey: + return self.tr("A valid DeepL Pro key is required."), False + + params = QByteArray( + "auth_key={0}&source_lang={1}&target_lang={2}&text=".format( + apiKey, originalLanguage.upper(), translationLanguage.upper()).encode("utf-8")) + encodedText = QByteArray(Utilities.html_encode(text).encode("utf-8"))\ + .toPercentEncoding() + request = params + encodedText + response, ok = requestObject.post(QUrl(self.TranslatorUrl), request) if ok: try: responseDict = json.loads(response) except ValueError: return self.tr("Invalid response received from DeepL"), False - if "error" in responseDict: - return self.tr("DeepL reported an error.\nMessage: {0}")\ - .format(responseDict["error"]["message"]), False - - if "result" not in responseDict: + if "translations" not in responseDict: return self.tr("DeepL call returned an unknown result"), False - if not responseDict["result"]["source_lang"] or \ - not responseDict["result"]["target_lang"]: - return self.tr( - "Unsupported language code given (source: {0}," - " target: {1}).").format( - originalLanguage, translationLanguage), False - - translations = responseDict["result"]["translations"] + translations = responseDict["translations"] if len(translations) == 0: return self.tr("<p>No translation found</p>"), True # show sentence by sentence separated by a line - translationStrings = [] - for translation in translations: - translationStrings.append( - "<br/>".join( - [ - s["postprocessed_sentence"] for s in sorted( - translation["beams"], - key=lambda b: -1 * b["score"]) - ] - ) - ) - result = "<p>" + "<hr/>".join(translationStrings) + "</p>" + result = ( + "<p>" + + "<hr/>".join([t["text"] for t in translations]) + + "</p>" + ) else: result = response