File size: 3,869 Bytes
f36740b
 
 
28c2eed
d03a2fc
78d0ff1
 
 
 
 
d03a2fc
76aa3b2
58568a7
 
7ade3be
58568a7
 
418aed1
58568a7
76aa3b2
58568a7
 
7ade3be
 
 
 
 
 
 
58568a7
 
 
 
c9c6f12
78d0ff1
 
 
 
 
 
 
 
 
58568a7
6794418
 
7ade3be
58568a7
76aa3b2
a06172d
58568a7
 
76aa3b2
a06172d
70f6ed6
 
78d0ff1
 
58568a7
 
a06172d
58568a7
78d0ff1
 
 
f5c8ab8
 
25222f7
f36740b
 
 
78d0ff1
6cfdf62
58568a7
f36740b
58568a7
6794418
 
 
939c119
78d0ff1
 
 
 
 
 
 
 
 
939c119
8891d45
 
939c119
 
8891d45
1c48989
 
58568a7
7ade3be
f36740b
 
 
 
 
 
 
2bbc526
7167a1f
7ade3be
f5c8ab8
 
 
 
 
2bbc526
d03a2fc
 
78d0ff1
d03a2fc
 
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
"""
google translator API
"""

from deep_translator.constants import BASE_URLS
from deep_translator.exceptions import (
    TooManyRequests,
    TranslationNotFound,
    RequestError,
)
from deep_translator.base import BaseTranslator
from deep_translator.validate import is_input_valid, is_empty
from bs4 import BeautifulSoup
import requests
from typing import Optional, List


class GoogleTranslator(BaseTranslator):
    """
    class that wraps functions, which use Google Translate under the hood to translate text(s)
    """

    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
        super().__init__(
            base_url=BASE_URLS.get("GOOGLE_TRANSLATE"),
            source=source,
            target=target,
            element_tag="div",
            element_query={"class": "t0"},
            payload_key="q",  # key of text in the url
            **kwargs
        )

        self._alt_element_query = {"class": "result-container"}

    def translate(self, text: str, **kwargs) -> str:
        """
        function to translate a text
        @param text: desired text to translate
        @return: str: translated text
        """
        if is_input_valid(text):
            text = text.strip()
            if self._same_source_target() or is_empty(text):
                return text
            self._url_params["tl"] = self._target
            self._url_params["sl"] = self._source

            if self.payload_key:
                self._url_params[self.payload_key] = text

            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()

            soup = BeautifulSoup(response.text, "html.parser")

            element = soup.find(self._element_tag, self._element_query)

            if not element:
                element = soup.find(self._element_tag, self._alt_element_query)
                if not element:
                    raise TranslationNotFound(text)
            if element.get_text(strip=True) == text.strip():
                to_translate_alpha = "".join(ch for ch in text.strip() if ch.isalnum())
                translated_alpha = "".join(
                    ch for ch in element.get_text(strip=True) if ch.isalnum()
                )
                if (
                    to_translate_alpha
                    and translated_alpha
                    and to_translate_alpha == translated_alpha
                ):
                    self._url_params["tl"] = self._target
                    if "hl" not in self._url_params:
                        return text.strip()
                    del self._url_params["hl"]
                    return self.translate(text)

            else:
                return element.get_text(strip=True)

    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)


if __name__ == "__main__":
    t = GoogleTranslator().translate("hallo welt")
    print("translation: ", t)