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 )
0 commit comments