Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py

changeset 6412
d71b094845e7
parent 6411
7fd9b7ecbcfe
child 6645
ad476851d7e0
equal deleted inserted replaced
6411:7fd9b7ecbcfe 6412:d71b094845e7
13 except NameError: 13 except NameError:
14 pass 14 pass
15 15
16 import json 16 import json
17 17
18 from PyQt5.QtCore import QUrl, QByteArray 18 from PyQt5.QtCore import QUrl, QByteArray, QTimer
19 from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, \
20 QNetworkReply
19 21
20 from E5Gui import E5MessageBox 22 from E5Gui import E5MessageBox
23
24 from E5Network.E5NetworkProxyFactory import proxyAuthenticationRequired
25
26 from Globals import qVersionTuple
21 27
22 from .TranslationEngine import TranslationEngine 28 from .TranslationEngine import TranslationEngine
23 29
24 30
25 class IbmWatsonEngine(TranslationEngine): 31 class IbmWatsonEngine(TranslationEngine):
44 """ 50 """
45 super(IbmWatsonEngine, self).__init__(plugin, parent) 51 super(IbmWatsonEngine, self).__init__(plugin, parent)
46 52
47 self.__ui = parent 53 self.__ui = parent
48 54
55 self.__networkManager = QNetworkAccessManager(self)
56 self.__networkManager.proxyAuthenticationRequired.connect(
57 proxyAuthenticationRequired)
58
49 self.__availableTranslations = {} 59 self.__availableTranslations = {}
50 # dictionary of sets of available translations 60 # dictionary of sets of available translations
51 61
52 self.__getTranslationModels() 62 self.__replies = []
63
64 QTimer.singleShot(0, self.__getTranslationModels)
53 65
54 def engineName(self): 66 def engineName(self):
55 """ 67 """
56 Public method to return the name of the engine. 68 Public method to return the name of the engine.
57 69
198 (b"Authorization", 210 (b"Authorization",
199 b"Basic " + QByteArray( 211 b"Basic " + QByteArray(
200 b"apikey:" + apiKey.encode("utf-8")).toBase64()) 212 b"apikey:" + apiKey.encode("utf-8")).toBase64())
201 ] 213 ]
202 214
203 from ..TranslatorRequest import TranslatorRequest 215 request = QNetworkRequest(url)
204 requestObject = TranslatorRequest(self) 216 if qVersionTuple() >= (5, 6, 0):
205 response, ok = requestObject.get(url, extraHeaders=extraHeaders) 217 request.setAttribute(QNetworkRequest.FollowRedirectsAttribute,
206 if ok: 218 True)
207 response = str(response, "utf-8", "replace") 219 if extraHeaders:
208 try: 220 for name, value in extraHeaders:
209 responseDict = json.loads(response) 221 request.setRawHeader(name, value)
210 except ValueError: 222 reply = self.__networkManager.get(request)
223 reply.finished.connect(
224 lambda: self.__getTranslationModelsReplyFinished(reply))
225 self.__replies.append(reply)
226
227 def __getTranslationModelsReplyFinished(self, reply):
228 """
229 Private slot handling the receipt of the available translations.
230
231 @param reply reference to the network reply object
232 @type QNetworkReply
233 """
234 if reply in self.__replies:
235 self.__replies.remove(reply)
236 reply.deleteLater()
237
238 if reply.error() != QNetworkReply.NoError:
239 errorStr = reply.errorString()
211 E5MessageBox.critical( 240 E5MessageBox.critical(
212 self.__ui, 241 self.__ui,
213 self.tr("Error Getting Available Translations"), 242 self.tr("Error Getting Available Translations"),
214 self.tr("Invalid response received") 243 self.tr("The server sent an error indication.\n"
244 "Error: {0}").format(errorStr)
215 ) 245 )
216 return 246 return
217 247 else:
218 if "models" not in responseDict: 248 response = str(reply.readAll(), "utf-8", "replace")
219 E5MessageBox.critical( 249 try:
220 self.__ui, 250 responseDict = json.loads(response)
221 self.tr("Error Getting Available Translations"), 251 except ValueError:
222 self.tr("No translation available.") 252 E5MessageBox.critical(
223 ) 253 self.__ui,
224 return 254 self.tr("Error Getting Available Translations"),
225 255 self.tr("Invalid response received")
226 for model in responseDict["models"]: 256 )
227 if model["status"] == "available": 257 return
228 source = self.__adjustLanguageCode(model["source"]) 258
229 target = self.__adjustLanguageCode(model["target"]) 259 if "models" not in responseDict:
230 if source not in self.__availableTranslations: 260 E5MessageBox.critical(
231 self.__availableTranslations[source] = set() 261 self.__ui,
232 self.__availableTranslations[source].add(target) 262 self.tr("Error Getting Available Translations"),
263 self.tr("No translation available.")
264 )
265 return
266
267 for model in responseDict["models"]:
268 if model["status"] == "available":
269 source = self.__adjustLanguageCode(model["source"])
270 target = self.__adjustLanguageCode(model["target"])
271 if source not in self.__availableTranslations:
272 self.__availableTranslations[source] = set()
273 self.__availableTranslations[source].add(target)
274
275 self.availableTranslationsLoaded.emit()

eric ide

mercurial