from typing import List, Optional import requests from deep_translator.base import BaseTranslator from deep_translator.constants import BASE_URLS, QCRI_LANGUAGE_TO_CODE from deep_translator.exceptions import ServerException, TranslationNotFound class QcriTranslator(BaseTranslator): """ class that wraps functions, which use the QRCI translator under the hood to translate word(s) """ def __init__( self, api_key: Optional[str] = None, source: str = "en", target: str = "en", **kwargs, ): """ @param api_key: your qrci api key. Get one for free here https://mt.qcri.org/api/v1/ref """ if not api_key: raise ServerException(401) self.api_key = api_key self.api_endpoints = { "get_languages": "getLanguagePairs", "get_domains": "getDomains", "translate": "translate", } self.params = {"key": self.api_key} super().__init__( base_url=BASE_URLS.get("QCRI"), source=source, target=target, languages=QCRI_LANGUAGE_TO_CODE, **kwargs, ) def _get( self, endpoint: str, params: Optional[dict] = None, return_text: bool = True ): if not params: params = self.params try: res = requests.get( self._base_url.format(endpoint=self.api_endpoints[endpoint]), params=params, ) return res.text if return_text else res except Exception as e: raise e @property def languages(self): return self.get_supported_languages() def get_domains(self): domains = self._get("get_domains") return domains @property def domains(self): return self.get_domains() def translate(self, text: str, **kwargs) -> str: params = { "key": self.api_key, "langpair": f"{self._source}-{self._target}", "domain": kwargs["domain"], "text": text, } try: response = self._get("translate", params=params, return_text=False) except ConnectionError: raise ServerException(503) else: if response.status_code != 200: ServerException(response.status_code) else: res = response.json() translation = res.get("translatedText") if not translation: raise TranslationNotFound(text) return translation def translate_file(self, path: str, **kwargs) -> str: return self._translate_file(path, **kwargs) def translate_batch(self, batch: List[str], **kwargs) -> List[str]: """ translate a batch of texts @domain: domain @param batch: list of texts to translate @return: list of translations """ return self._translate_batch(batch, **kwargs)