""" Yandex translator API """ import requests from requests import exceptions from deep_translator.constants import BASE_URLS from deep_translator.exceptions import (RequestError, ServerException, TranslationNotFound, TooManyRequests) class YandexTranslator(object): """ class that wraps functions, which use the yandex translator under the hood to translate word(s) """ def __init__(self, api_key=None): """ @param api_key: your yandex api key """ if not api_key: raise ServerException(401) self.__base_url = BASE_URLS.get("YANDEX") self.api_key = api_key self.api_version = "v1.5" self.api_endpoints = { "langs": "getLangs", "detect": "detect", "translate": "translate", } def get_supported_languages(self): return set(x.split("-")[0] for x in self.dirs) @property def languages(self): return self.get_supported_languages() @property def dirs(self, proxies=None): try: url = self.__base_url.format(version=self.api_version, endpoint="getLangs") print("url: ", url) response = requests.get(url, params={"key": self.api_key}, proxies=proxies) except requests.exceptions.ConnectionError: raise ServerException(503) else: data = response.json() if response.status_code != 200: raise ServerException(response.status_code) return data.get("dirs") def detect(self, text, proxies=None): response = None params = { "text": text, "format": "plain", "key": self.api_key, } try: url = self.__base_url.format(version=self.api_version, endpoint="detect") response = requests.post(url, data=params, proxies=proxies) except RequestError: raise except ConnectionError: raise ServerException(503) except ValueError: raise ServerException(response.status_code) else: response = response.json() language = response['lang'] status_code = response['code'] if status_code != 200: raise RequestError() elif not language: raise ServerException(501) return language def translate(self, source, target, text, proxies=None): params = { "text": text, "format": "plain", "lang": target if source == "auto" else "{}-{}".format(source, target), "key": self.api_key } try: url = self.__base_url.format(version=self.api_version, endpoint="translate") response = requests.post(url, data=params, proxies=proxies) except ConnectionError: raise ServerException(503) else: response = response.json() if response['code'] == 429: raise TooManyRequests() if response['code'] != 200: raise ServerException(response['code']) if not response['text']: raise TranslationNotFound() return response['text'] def translate_file(self, source, target, path): """ translate from a file @param source: source language @param target: target language @param path: path to file @return: translated text """ try: with open(path) as f: text = f.read() return self.translate(source, target, text) except Exception as e: raise e def translate_batch(self, source, target, batch): """ translate a batch of texts @param source: source language @param target: target language @param batch: list of texts to translate @return: list of translations """ return [self.translate(source, target, text) for text in batch]