| """ | |
| mymemory translator API | |
| """ | |
| from typing import List, Optional, Union | |
| import requests | |
| from deep_translator.base import BaseTranslator | |
| from deep_translator.constants import BASE_URLS | |
| from deep_translator.exceptions import ( | |
| RequestError, | |
| TooManyRequests, | |
| TranslationNotFound, | |
| ) | |
| from deep_translator.validate import is_empty, is_input_valid | |
| class MyMemoryTranslator(BaseTranslator): | |
| """ | |
| class that uses the mymemory translator to translate texts | |
| """ | |
| def __init__( | |
| self, | |
| source: str = "auto", | |
| target: str = "en", | |
| proxies: Optional[dict] = None, | |
| **kwargs, | |
| ): | |
| """ | |
| @param source: source language to translate from | |
| @param target: target language to translate to | |
| """ | |
| self.proxies = proxies | |
| self.email = kwargs.get("email", None) | |
| super().__init__( | |
| base_url=BASE_URLS.get("MYMEMORY"), | |
| source=source, | |
| target=target, | |
| payload_key="q", | |
| ) | |
| def translate( | |
| self, text: str, return_all: bool = False, **kwargs | |
| ) -> Union[str, List[str]]: | |
| """ | |
| function that uses the mymemory translator to translate a text | |
| @param text: desired text to translate | |
| @type text: str | |
| @param return_all: set to True to return all synonym/similars of the translated text | |
| @return: str or list | |
| """ | |
| if is_input_valid(text, max_chars=500): | |
| text = text.strip() | |
| if self._same_source_target() or is_empty(text): | |
| return text | |
| self._url_params["langpair"] = f"{self._source}|{self._target}" | |
| if self.payload_key: | |
| self._url_params[self.payload_key] = text | |
| if self.email: | |
| self._url_params["de"] = self.email | |
| response = requests.get( | |
| self._base_url, params=self._url_params, proxies=self.proxies | |
| ) | |
| if response.status_code == 429: | |
| raise TooManyRequests() | |
| if response.status_code != 200: | |
| raise RequestError() | |
| data = response.json() | |
| if not data: | |
| TranslationNotFound(text) | |
| translation = data.get("responseData").get("translatedText") | |
| if translation: | |
| return translation | |
| elif not translation: | |
| all_matches = data.get("matches") | |
| matches = (match["translation"] for match in all_matches) | |
| next_match = next(matches) | |
| return next_match if not return_all else list(all_matches) | |
| def translate_file(self, path: str, **kwargs) -> str: | |
| """ | |
| translate directly from file | |
| @param path: path to the target file | |
| @type path: str | |
| @param kwargs: additional args | |
| @return: str | |
| """ | |
| return self._translate_file(path, **kwargs) | |
| def translate_batch(self, batch: List[str], **kwargs) -> List[str]: | |
| """ | |
| translate a list of texts | |
| @param batch: list of texts you want to translate | |
| @return: list of translations | |
| """ | |
| return self._translate_batch(batch, **kwargs) | |