Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py

changeset 6539
0de153b92d53
parent 6412
d71b094845e7
child 6545
f669c4c0d39b
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

eric ide

mercurial