File size: 4,618 Bytes
c006992
 
 
fa90b1d
 
 
0d89ff1
7a05cd7
 
c006992
7a05cd7
 
0d89ff1
78d0ff1
0d89ff1
78d0ff1
 
 
7a05cd7
78d0ff1
3aa1058
674f1bf
c006992
2bbc526
c006992
cb15d3a
 
c006992
 
7ade3be
 
 
 
0d89ff1
7ade3be
 
c006992
 
 
 
0d89ff1
c006992
 
 
 
 
 
 
2bbc526
cb15d3a
 
 
 
2bbc526
186e33e
 
c006992
 
 
 
 
 
 
7ade3be
c006992
cb15d3a
 
 
c006992
cb15d3a
 
 
c006992
1f09504
c006992
 
 
3aa1058
1f09504
c006992
 
7ade3be
1600811
 
 
 
 
 
 
cb15d3a
 
 
1600811
 
 
 
 
1f09504
1600811
1f09504
1600811
 
78d0ff1
 
1600811
 
 
1f09504
1600811
 
cb15d3a
 
 
76aa3b2
70f6ed6
 
 
78d0ff1
 
 
 
70f6ed6
 
 
78d0ff1
 
70f6ed6
 
 
 
 
 
78d0ff1
70f6ed6
 
78d0ff1
 
70f6ed6
78d0ff1
70f6ed6
 
78d0ff1
1600811
7ade3be
1600811
 
 
 
 
2bbc526
1600811
7ade3be
1600811
 
 
 
 
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
"""
Yandex translator API
"""

__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, YANDEX_ENV_VAR
from deep_translator.exceptions import (
    ApiKeyException,
    RequestError,
    ServerException,
    TooManyRequests,
    TranslationNotFound,
)
from deep_translator.validate import is_input_valid, request_failed


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

    def __init__(
        self,
        source: str = "en",
        target: str = "de",
        api_key: Optional[str] = os.getenv(YANDEX_ENV_VAR, None),
        **kwargs
    ):
        """
        @param api_key: your yandex api key
        """
        if not api_key:
            raise ApiKeyException(YANDEX_ENV_VAR)
        self.api_key = api_key
        self.api_version = "v1.5"
        self.api_endpoints = {
            "langs": "getLangs",
            "detect": "detect",
            "translate": "translate",
        }
        super().__init__(
            base_url=BASE_URLS.get("YANDEX"),
            source=source,
            target=target,
            **kwargs
        )

    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: Optional[dict] = 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 request_failed(status_code=response.status_code):
            raise ServerException(response.status_code)
        return data.get("dirs")

    def detect(self, text: str, proxies: Optional[dict] = 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, text: str, proxies: Optional[dict] = None, **kwargs
    ) -> str:
        if is_input_valid(text):
            params = {
                "text": text,
                "format": "plain",
                "lang": self._target
                if self._source == "auto"
                else "{}-{}".format(self._source, self._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, path: str, **kwargs) -> str:
        """
        translate from a file
        @param path: path to file
        @return: translated text
        """
        return self._translate_file(path, **kwargs)

    def translate_batch(self, batch: List[str], **kwargs) -> List[str]:
        """
        translate a batch of texts
        @param batch: list of texts to translate
        @return: list of translations
        """
        return self._translate_batch(batch, **kwargs)