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() |