Skip to content

Commit bed59d3

Browse files
authored
Update v0.5
- Added Asynchronous version - Fixed translate.com translator
1 parent 2c0ffa6 commit bed59d3

File tree

5 files changed

+186
-4
lines changed

5 files changed

+186
-4
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ print(x.translate("Hi", "si"))
88

99
**py-trans** is a Free Python library for translate text into different languages.
1010

11+
## Features
12+
- Simple and Easy to use
13+
- Synchronous & Asynchronous
14+
- Different Translate Engines to choose
15+
16+
***Less code, translate more***
17+
1118
## Supported Engines
1219
For now py-trans supported for 5 translate engines (providers)
1320
| Engine | Engine Code |

py_trans/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
# Project: py_trans
33

44
from .translator import PyTranslator
5+
from .async_translator import Async_PyTranslator
56

6-
__version__ = "v0.4"
7+
__version__ = "v0.5"

py_trans/async_translator.py

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
# Project: py-trans
2+
# Author: Itz-fork
3+
import aiohttp
4+
from .language_codes import _get_full_lang_name, _get_lang_code
5+
6+
class Async_PyTranslator:
7+
"""
8+
Async PyTranslator Class
9+
10+
Note:
11+
Before Trying to Translate Create an instance of this with provider (Default provider is google)
12+
13+
Providers:
14+
google - Google Translate
15+
libre - LibreTranslate Engine
16+
translate.com - translate.com Translate
17+
my_memory - MyMemory Translate
18+
translate_dict - Translate Dict
19+
20+
Argument(s):
21+
provider - Provider of Translator. (Must be a supported provider)
22+
23+
Example(s):
24+
async_pytranslator = Async_PyTranslator(provider="google")
25+
"""
26+
def __init__(self, provider="google"):
27+
self.providers = ["google", "libre", "translate.com", "my_memory", "translate_dict"]
28+
if provider in self.providers:
29+
self.provider = provider
30+
else:
31+
self.provider = "google"
32+
# Headers
33+
self.gheader = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
34+
self.lheader = {"Origin": "https://libretranslate.com", "Host": "libretranslate.com", "Referer": "https://libretranslate.com/"}
35+
# aiohttp session for translation purpose
36+
self.t_session = aiohttp.ClientSession()
37+
# aiohttp session for detecting source lang (This represents the laziness of me)
38+
self.d_session = aiohttp.ClientSession()
39+
40+
async def translate(self, text, dest_lang="en"):
41+
"""
42+
Translator Function
43+
44+
Argument(s):
45+
text - Source Text (Text that need to be translated)
46+
dest_lang - Destination Language
47+
48+
Example(s):
49+
await async_pytranslator.translate(text="Hi, How are you?", dest_lang="si")
50+
"""
51+
if self.provider == "google":
52+
return await self.google_translate(text, dest_lang)
53+
elif self.provider == "libre":
54+
return await self.libre_translate(text, dest_lang)
55+
elif self.provider == "translate.com":
56+
return await self.translate_com(text, dest_lang)
57+
elif self.provider == "my_memory":
58+
return await self.my_memory(text, dest_lang)
59+
elif self.provider == "translate_dict":
60+
return await self.translate_dict(text, dest_lang)
61+
else:
62+
return
63+
64+
# Google Translate
65+
async def google_translate(self, text, dest_lang):
66+
r_url = f"https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=auto&tl={dest_lang}&q={text}"
67+
try:
68+
async with self.t_session as tr_ses:
69+
async with tr_ses.get(r_url, headers=self.gheader) as get_req:
70+
request_resp = await get_req.json()
71+
translation = request_resp['sentences'][0]['trans']
72+
origin_text = request_resp['sentences'][0]['orig']
73+
origin_lang = await self.get_lang_name(request_resp['src'])
74+
dest_lang_f = await self.get_lang_name(dest_lang)
75+
tr_dict = {"status": "success", "engine": "Google Translate", "translation": translation, "dest_lang": dest_lang_f, "orgin_text": origin_text, "origin_lang": origin_lang}
76+
# Closing unwanted language detection aiohttp session
77+
await self.d_session.close()
78+
return tr_dict
79+
except Exception as e:
80+
return {"status": "failed", "error": e}
81+
82+
# LibreTranslate
83+
async def _detect_lang(self, text, full_name=False):
84+
r_url = "https://libretranslate.com/detect"
85+
ld_data = {"q": str(text)}
86+
try:
87+
async with self.d_session as tr_ses:
88+
async with tr_ses.post(r_url, headers=self.lheader, data=ld_data) as get_req:
89+
request_resp = await get_req.json()
90+
language_code = request_resp[0]["language"]
91+
except:
92+
# If can't detect the language let's think it's just english (RIP moment)
93+
language_code = "en"
94+
if full_name is False:
95+
return language_code
96+
else:
97+
return await self.get_lang_name(language_code)
98+
99+
async def libre_translate(self, text, dest_lang):
100+
r_url = "https://libretranslate.com/translate"
101+
try:
102+
source_lang = await self._detect_lang(text=text, full_name=False)
103+
l_data = {"q": str(text), "source": source_lang, "target": dest_lang}
104+
async with self.t_session as tr_ses:
105+
async with tr_ses.post(r_url, headers=self.lheader, data=l_data) as get_req:
106+
request_resp = await get_req.json()
107+
translation = request_resp["translatedText"]
108+
origin_lang = await self.get_lang_name(source_lang)
109+
dest_lang_f = await self.get_lang_name(dest_lang)
110+
tr_dict = {"status": "success", "engine": "LibreTranslate", "translation": translation, "dest_lang": dest_lang_f, "orgin_text": str(text), "origin_lang": origin_lang}
111+
return tr_dict
112+
except Exception as e:
113+
return {"status": "failed", "error": e}
114+
115+
# Translate.com
116+
async def translate_com(self, text, dest_lang):
117+
r_url = "https://www.translate.com/translator/ajax_translate"
118+
try:
119+
source_lang = await self._detect_lang(text=text, full_name=False)
120+
tr_data = {"text_to_translate": str(text), "source_lang": source_lang, "translated_lang": dest_lang, "use_cache_only": "false"}
121+
async with self.t_session as tr_ses:
122+
async with tr_ses.post(url=r_url, data=tr_data) as get_req:
123+
request_resp = await get_req.json(content_type='text/html')
124+
translation = request_resp["translated_text"]
125+
origin_lang = await self.get_lang_name(text)
126+
dest_lang_f = await self.get_lang_name(dest_lang)
127+
tr_dict = {"status": "success", "engine": "Translate.com", "translation": translation, "dest_lang": dest_lang_f, "orgin_text": origin_lang, "origin_lang": origin_lang}
128+
return tr_dict
129+
except Exception as e:
130+
return {"status": "failed", "error": e}
131+
132+
# My Memory
133+
async def my_memory(self, text, dest_lang):
134+
r_url = "https://api.mymemory.translated.net/get"
135+
try:
136+
source_lang = await self._detect_lang(text=text, full_name=False)
137+
m_params = {"q": text, "langpair": f"{source_lang}|{dest_lang}"}
138+
async with self.t_session as tr_ses:
139+
async with tr_ses.get(r_url, headers=self.lheader, params=m_params) as get_req:
140+
request_resp = await get_req.json()
141+
translation = request_resp["matches"][0]["translation"]
142+
origin_lang = await self.get_lang_name(source_lang)
143+
dest_lang_f = await self.get_lang_name(dest_lang)
144+
tr_dict = {"status": "success", "engine": "MyMemory", "translation": translation, "dest_lang": dest_lang_f, "orgin_text": str(text), "origin_lang": origin_lang}
145+
return tr_dict
146+
except Exception as e:
147+
return {"status": "failed", "error": e}
148+
149+
# Translate Dict
150+
async def translate_dict(self, text, dest_lang):
151+
r_url = f"https://t3.translatedict.com/1.php?p1=auto&p2={dest_lang}&p3={text}"
152+
try:
153+
async with self.t_session as tr_ses:
154+
async with tr_ses.get(r_url) as get_req:
155+
request_resp = await get_req.text()
156+
origin_lang = await self._detect_lang(text=text, full_name=True)
157+
dest_lang_f = await self.get_lang_name(dest_lang)
158+
tr_dict = {"status": "success", "engine": "Translate Dict", "translation": request_resp, "dest_lang": dest_lang_f, "orgin_text": str(text), "origin_lang": origin_lang}
159+
return tr_dict
160+
except Exception as e:
161+
return {"status": "failed", "error": e}
162+
163+
# Get Language Names
164+
async def get_lang_name(self, text):
165+
if len(text) == 2:
166+
return _get_full_lang_name(text)
167+
else:
168+
if len(text) <= 3:
169+
return "Not a full language name"
170+
else:
171+
return _get_lang_code(text)

py_trans/translator.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def __init__(self, provider="google"):
3333
self.gheader = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
3434
self.lheader = {"Origin": "https://libretranslate.com", "Host": "libretranslate.com", "Referer": "https://libretranslate.com/"}
3535

36+
3637
def translate(self, text, dest_lang="en"):
3738
"""
3839
Translator Function
@@ -99,9 +100,10 @@ def libre_translate(self, text, dest_lang):
99100
# Translate.com
100101
def translate_com(self, text, dest_lang):
101102
try:
102-
r_url = requests.post("https://www.translate.com/translator/ajax_translate", data={"text_to_translate": str(text), "translated_lang": dest_lang}).json()
103+
source_lang = self._detect_lang(text=text, full_name=False)
104+
r_url = requests.post(url="https://www.translate.com/translator/ajax_translate", data={"text_to_translate": str(text), "source_lang": source_lang, "translated_lang": dest_lang, "use_cache_only": "false"}).json()
103105
translation = r_url["translated_text"]
104-
origin_lang = self.get_lang_name(text)
106+
origin_lang = self.get_lang_name(source_lang)
105107
dest_lang_f = self.get_lang_name(dest_lang)
106108
tr_dict = {"status": "success", "engine": "Translate.com", "translation": translation, "dest_lang": dest_lang_f, "orgin_text": origin_lang, "origin_lang": origin_lang}
107109
return tr_dict

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
requests
1+
requests
2+
aiohttp

0 commit comments

Comments
 (0)