File size: 3,300 Bytes
fa90b1d
 
0d89ff1
7a05cd7
 
77f147b
7a05cd7
 
0d89ff1
 
 
 
 
 
 
 
 
 
3aa1058
a0b5eac
77f147b
f89616a
77f147b
a6888ed
77f147b
 
7ade3be
 
 
 
0d89ff1
7ade3be
 
77f147b
cb15d3a
 
77f147b
 
 
0d89ff1
 
77f147b
 
 
 
 
 
 
78d0ff1
2bbc526
f651d07
2bbc526
 
 
78d0ff1
2bbc526
77f147b
7ade3be
cb15d3a
 
 
 
7ade3be
1f09504
 
 
78d0ff1
 
 
 
1f09504
 
 
77f147b
 
 
 
 
1f09504
 
 
77f147b
1f09504
 
 
77f147b
7ade3be
77f147b
 
78d0ff1
2bbc526
78d0ff1
77f147b
 
1f09504
77f147b
1f09504
77f147b
1f09504
3aa1058
1f09504
 
 
af08fe3
1f09504
 
 
 
7ade3be
2bbc526
 
7ade3be
77f147b
 
b046d4e
77f147b
 
 
2bbc526
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
__copyright__ = "Copyright (C) 2020 Nidhal Baccouri"

import os
from typing import List, Optional

import requests

from deep_translator.base import BaseTranslator
from deep_translator.constants import (
    BASE_URLS,
    QCRI_ENV_VAR,
    QCRI_LANGUAGE_TO_CODE,
)
from deep_translator.exceptions import (
    ApiKeyException,
    ServerException,
    TranslationNotFound,
)
from deep_translator.validate import request_failed


class QcriTranslator(BaseTranslator):
    """
    class that wraps functions, which use the QRCI translator under the hood to translate word(s)
    """

    def __init__(
        self,
        source: str = "en",
        target: str = "en",
        api_key: Optional[str] = os.getenv(QCRI_ENV_VAR, None),
        **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 ApiKeyException(QCRI_ENV_VAR)

        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 request_failed(status_code=response.status_code):
                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)