def _map_language_to_code(self, *languages, **kwargs): """ @param language: type of language @return: mapped value of the language or raise an exception if the language is not supported """ for language in languages: if language in PONS_LANGUAGES_TO_CODES.values(): yield PONS_CODES_TO_LANGUAGES[language] elif language in PONS_LANGUAGES_TO_CODES.keys(): yield language else: raise LanguageNotSupportedException(language)
class PonsTranslator(BaseTranslator): """ class that uses PONS translator to translate words """ supported_languages = list(PONS_LANGUAGES_TO_CODES.keys()) def __init__(self, source="french", target="english"): """ @param source: source language to translate from @param target: target language to translate to """ self.__base_url = BASE_URLS.get("PONS") if self.is_language_supported(source, target): self._source, self._target = self._map_language_to_code(source, target) super().__init__(base_url=self.__base_url, source=self._source, target=self._target, payload_key=None, element_tag='div', element_query={"class": "target"} ) def _map_language_to_code(self, *languages, **kwargs): """ @param language: type of language @return: mapped value of the language or raise an exception if the language is not supported """ for language in languages: if language in PONS_LANGUAGES_TO_CODES.values(): yield PONS_CODES_TO_LANGUAGES[language] elif language in PONS_LANGUAGES_TO_CODES.keys(): yield language else: raise LanguageNotSupportedException(language) def is_language_supported(self, *languages, **kwargs): for lang in languages: if lang not in PONS_LANGUAGES_TO_CODES.keys(): if lang not in PONS_LANGUAGES_TO_CODES.values(): raise LanguageNotSupportedException(lang) return True def translate(self, word, **kwargs): if self._validate_payload(word): url = "{}{}-{}/{}".format(self.__base_url, self._source, self._target, quote(word)) response = requests.get(url, verify=False) soup = BeautifulSoup(response.text, 'html.parser') elements = soup.findAll(self._element_tag, self._element_query) if not elements: raise ElementNotFoundInGetRequest(elements) eof = [] for el in elements: temp = '' for e in el.findAll('a'): if e.parent.name == 'div': if e and "/translate/{}-{}/".format(self._target, self._source) in e.get('href'): temp += e.get_text() + ' ' if not kwargs.get('return_all'): return temp eof.append(temp) if 'return_all' in kwargs and kwargs.get('return_all'): return [word for word in eof if word and len(word) > 1] def translate_words(self, words, **kwargs): if not words: raise NotValidPayload(words) translated_words = [] for word in words: translated_words.append(self.translate(payload=word)) return translated_words
def is_language_supported(self, *languages, **kwargs): for lang in languages: if lang not in PONS_LANGUAGES_TO_CODES.keys(): if lang not in PONS_LANGUAGES_TO_CODES.values(): raise LanguageNotSupportedException(lang) return True