= commited on
Commit
418aed1
·
1 Parent(s): 9a69a65

added linguee support

Browse files
HISTORY.rst CHANGED
@@ -2,6 +2,6 @@
2
  History
3
  =======
4
 
5
- 0.1.2 stable release
6
  ---------------------
7
 
 
2
  History
3
  =======
4
 
5
+ 0.1.4 stable release
6
  ---------------------
7
 
deep_translator/constants.py CHANGED
@@ -1,7 +1,10 @@
1
 
 
2
  BASE_URLS = {
3
  "GOOGLE_TRANSLATE": "https://translate.google.com/m",
4
- "PONS": "https://en.pons.com/translate/"
 
 
5
  }
6
 
7
  GOOGLE_CODES_TO_LANGUAGES = {
@@ -115,7 +118,6 @@ GOOGLE_CODES_TO_LANGUAGES = {
115
 
116
  GOOGLE_LANGUAGES_TO_CODES = {v: k for k, v in GOOGLE_CODES_TO_LANGUAGES.items()}
117
 
118
-
119
  PONS_CODES_TO_LANGUAGES = {
120
  'ar': 'arabic',
121
  'bg': 'bulgarian',
@@ -142,3 +144,35 @@ PONS_CODES_TO_LANGUAGES = {
142
  }
143
 
144
  PONS_LANGUAGES_TO_CODES = {v: k for k, v in PONS_CODES_TO_LANGUAGES.items()}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
 
2
+
3
  BASE_URLS = {
4
  "GOOGLE_TRANSLATE": "https://translate.google.com/m",
5
+ "PONS": "https://en.pons.com/translate/",
6
+ "YANDEX": "https://translate.yandex.com/",
7
+ "LINGUEE": "https://www.linguee.com/"
8
  }
9
 
10
  GOOGLE_CODES_TO_LANGUAGES = {
 
118
 
119
  GOOGLE_LANGUAGES_TO_CODES = {v: k for k, v in GOOGLE_CODES_TO_LANGUAGES.items()}
120
 
 
121
  PONS_CODES_TO_LANGUAGES = {
122
  'ar': 'arabic',
123
  'bg': 'bulgarian',
 
144
  }
145
 
146
  PONS_LANGUAGES_TO_CODES = {v: k for k, v in PONS_CODES_TO_LANGUAGES.items()}
147
+
148
+ LINGUEE_LANGUAGES_TO_CODES = {
149
+ "maltese": "mt",
150
+ "english": "en",
151
+ "german": "de",
152
+ "bulgarian": "bg",
153
+ "polish": "pl",
154
+ "portuguese": "pt",
155
+ "hungarian": "hu",
156
+ "romanian": "ro",
157
+ "russian": "ru",
158
+ #"serbian": "sr",
159
+ "dutch": "nl",
160
+ "slovakian": "sk",
161
+ "greek": "el",
162
+ "slovenian": "sl",
163
+ "danish": "da",
164
+ "italian": "it",
165
+ "spanish": "es",
166
+ "finnish": "fi",
167
+ "chinese": "zh",
168
+ "french": "fr",
169
+ #"croatian": "hr",
170
+ "czech": "cs",
171
+ "laotian": "lo",
172
+ "swedish": "sv",
173
+ "latvian": "lv",
174
+ "estonian": "et",
175
+ "japanese": "ja"
176
+ }
177
+
178
+ LINGUEE_CODE_TO_LANGUAGE = {v: k for k, v in LINGUEE_LANGUAGES_TO_CODES.items()}
deep_translator/google_trans.py CHANGED
@@ -1,4 +1,3 @@
1
- from abc import ABC
2
 
3
  from deep_translator.constants import BASE_URLS, GOOGLE_LANGUAGES_TO_CODES
4
  from deep_translator.exceptions import LanguageNotSupportedException, ElementNotFoundInGetRequest, NotValidPayload, NotValidLength
@@ -7,7 +6,7 @@ from bs4 import BeautifulSoup
7
  import requests
8
 
9
 
10
- class GoogleTranslator(BaseTranslator, ABC):
11
  """
12
  class that uses google translate to translate texts
13
  """
@@ -65,8 +64,8 @@ class GoogleTranslator(BaseTranslator, ABC):
65
  if self.payload_key:
66
  self._url_params[self.payload_key] = payload
67
 
68
- res = requests.get(self.__base_url, params=self._url_params)
69
- soup = BeautifulSoup(res.text, 'html.parser')
70
  element = soup.find(self._element_tag, self._element_query)
71
  if not element:
72
  raise ElementNotFoundInGetRequest(element)
 
 
1
 
2
  from deep_translator.constants import BASE_URLS, GOOGLE_LANGUAGES_TO_CODES
3
  from deep_translator.exceptions import LanguageNotSupportedException, ElementNotFoundInGetRequest, NotValidPayload, NotValidLength
 
6
  import requests
7
 
8
 
9
+ class GoogleTranslator(BaseTranslator):
10
  """
11
  class that uses google translate to translate texts
12
  """
 
64
  if self.payload_key:
65
  self._url_params[self.payload_key] = payload
66
 
67
+ response = requests.get(self.__base_url, params=self._url_params)
68
+ soup = BeautifulSoup(response.text, 'html.parser')
69
  element = soup.find(self._element_tag, self._element_query)
70
  if not element:
71
  raise ElementNotFoundInGetRequest(element)
deep_translator/linguee.py ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from deep_translator.constants import BASE_URLS, LINGUEE_LANGUAGES_TO_CODES, LINGUEE_CODE_TO_LANGUAGE
2
+ from deep_translator.exceptions import LanguageNotSupportedException, ElementNotFoundInGetRequest, NotValidPayload, NotValidLength
3
+ from deep_translator.parent import BaseTranslator
4
+ from bs4 import BeautifulSoup
5
+ import requests
6
+ from requests.utils import quote
7
+
8
+
9
+ class LingueeTranslator(BaseTranslator):
10
+ def __init__(self, source, target):
11
+ """
12
+ @param source: source language to translate from
13
+ @param target: target language to translate to
14
+ """
15
+ self.__base_url = BASE_URLS.get("LINGUEE")
16
+
17
+ if self.is_language_supported(source, target):
18
+ self._source, self._target = self._map_language_to_code(source.lower(), target.lower())
19
+
20
+ super().__init__(base_url=self.__base_url,
21
+ source=self._source,
22
+ target=self._target,
23
+ element_tag='a',
24
+ element_query={'class': 'dictLink featured'},
25
+ payload_key=None, # key of payload in the url
26
+ )
27
+
28
+ def _map_language_to_code(self, *languages, **kwargs):
29
+ """
30
+ @param language: type of language
31
+ @return: mapped value of the language or raise an exception if the language is not supported
32
+ """
33
+ for language in languages:
34
+ if language in LINGUEE_LANGUAGES_TO_CODES.values():
35
+ yield LINGUEE_CODE_TO_LANGUAGE[language]
36
+ elif language in LINGUEE_LANGUAGES_TO_CODES.keys():
37
+ yield language
38
+ else:
39
+ raise LanguageNotSupportedException(language)
40
+
41
+ def is_language_supported(self, *languages, **kwargs):
42
+ for lang in languages:
43
+ if lang not in LINGUEE_LANGUAGES_TO_CODES.keys():
44
+ if lang not in LINGUEE_LANGUAGES_TO_CODES.values():
45
+ raise LanguageNotSupportedException(lang)
46
+ return True
47
+
48
+ def translate(self, word, **kwargs):
49
+
50
+ if self._validate_payload(word):
51
+ # %s-%s/translation/%s.html
52
+ url = "{}{}-{}/translation/{}.html".format(self.__base_url, self._source, self._target, quote(word))
53
+ response = requests.get(url)
54
+ soup = BeautifulSoup(response.text, 'html.parser')
55
+ elements = soup.find_all(self._element_tag, self._element_query)
56
+ if not elements:
57
+ raise ElementNotFoundInGetRequest(elements)
58
+
59
+ if 'return_all' in kwargs and kwargs.get('return_all'):
60
+ return [el.get_text(strip=True) for el in elements]
61
+ else:
62
+ return elements[0].get_text(strip=True)
63
+
64
+ def translate_words(self, words, **kwargs):
65
+ if not words:
66
+ raise NotValidPayload(words)
67
+
68
+ translated_words = []
69
+ for word in words:
70
+ translated_words.append(self.translate(payload=word))
71
+ return translated_words
72
+
73
+
74
+ if __name__ == '__main__':
75
+ res = LingueeTranslator(source="en", target="de").translate(word='cute', return_all=False)
76
+ print(res)
77
+
deep_translator/pons.py CHANGED
@@ -36,7 +36,7 @@ class PonsTranslator(BaseTranslator):
36
  @return: mapped value of the language or raise an exception if the language is not supported
37
  """
38
  for language in languages:
39
- if language in PONS_LANGUAGES_TO_CODES.values() or language == 'auto':
40
  yield PONS_CODES_TO_LANGUAGES[language]
41
  elif language in PONS_LANGUAGES_TO_CODES.keys():
42
  yield language
@@ -94,5 +94,4 @@ if __name__ == '__main__':
94
  # ])
95
  # res = PonsTranslator(source="en", target="ar").translate(payload='good')
96
  res = PonsTranslator(source="en", target="ar").translate_words(words=('good', 'cute', 'angry'))
97
-
98
  print(res)
 
36
  @return: mapped value of the language or raise an exception if the language is not supported
37
  """
38
  for language in languages:
39
+ if language in PONS_LANGUAGES_TO_CODES.values():
40
  yield PONS_CODES_TO_LANGUAGES[language]
41
  elif language in PONS_LANGUAGES_TO_CODES.keys():
42
  yield language
 
94
  # ])
95
  # res = PonsTranslator(source="en", target="ar").translate(payload='good')
96
  res = PonsTranslator(source="en", target="ar").translate_words(words=('good', 'cute', 'angry'))
 
97
  print(res)