def _translate(self, query: TranslationQuery) -> TranslationResponse: """ :param query: :return: """ pos = self._get_pos_tag(query) response = self.word_api.getDefinitions(query.query, partOfSpeech=pos) if not response: if self._query_is_uppercase(query): query.query = query.query.lower() return self._translate(query) elif self._query_starts_with_quote(query): # try to see whether the problem is due to 'quotes' around the word name self._remove_quotes(query) return self._translate(query) if not response: response = [] translations = [] quality = int(self.get_quality()) for d in response[:query.max_translations]: quality -= 1 try: definition = self.definition_without_example_and_without_see_synonims(d) if self.not_too_long(definition): translations.append(self.make_translation(definition, quality)) meta_defined_word = self.is_meta_definition(definition) if meta_defined_word: response2 = self.word_api.getDefinitions(meta_defined_word) for d2 in response2[:query.max_translations]: d2clean = self.definition_without_example_and_without_see_synonims(d2) if self.not_too_long(d2clean): translations.append(self.make_translation(meta_defined_word + ": " + d2clean, quality)) except Exception as e: logger.info(f"Can't parse definition: {e}") if not translations: # if we don't know the translation, just parrot back the question translations.append(self.make_translation(query.query, quality)) rez = TranslationResponse( translations=translations, costs=TranslationCosts( money=0 # API is free ) ) return rez
def _translate(self, query: TranslationQuery) -> TranslationResponse: """ :param query: :return: """ pos = self._get_pos_tag(query) try: if pos: response = self.word_api.getDefinitions(query.query, partOfSpeech=pos) else: response = self.word_api.getDefinitions(query.query) except HTTPError as e: print( f"error code returned: {e.code} when translating {query.query}" ) if e.code == 429: logger.info("Wordnik returned 429: 'Too Many Requests'!") elif e.code == 404: # Wordnik API will return 404 for Uppercase or quoted words # in that case we adapt the query and retry if self._query_is_uppercase(query): query.query = query.query.lower() print(f"trying to translate {query.query} instead") return self._translate(query) elif self._query_starts_with_quote(query): # try to see whether the problem is due to 'quotes' around the word name self._remove_quotes(query) print(f"trying to translate {query.query} instead") return self._translate(query) if not response: response = [] translations = [] quality = int(self.get_quality()) for d in response[:query.max_translations]: quality -= 1 try: definition = self.definition_without_example_and_without_see_synonims( d) if self.not_too_long(definition): translations.append( self.make_translation(definition, quality)) meta_defined_word = self.is_meta_definition(definition) if meta_defined_word: response2 = self.word_api.getDefinitions(meta_defined_word) for d2 in response2[:query.max_translations]: d2clean = self.definition_without_example_and_without_see_synonims( d2) if self.not_too_long(d2clean): translations.append( self.make_translation( meta_defined_word + ": " + d2clean, quality)) except Exception as e: logger.info(f"Can't parse definition: {e}") if not translations: # if we don't know the translation, just parrot back the question translations.append(self.make_translation(query.query, quality)) rez = TranslationResponse( translations=translations, costs=TranslationCosts(money=0 # API is free )) return rez