Works like a charm for Bing translator...You need to register first @ microsoft site to get the API
And then this code should work.
However I got a mail from Bing that there are changing the API from March 2017.
Code: Select all
#NoEnv
#Persistent
#SingleInstance force
SetWorkingDir %A_ScriptDir%
;--------------------------------------------------
; Translate text using translate.google.com
; after Google Translate API deprecation
;
; Ctrl+C, Ctrl+C
; Author: Anand Gadre
;
;--------------------------------------------------
~^C:: DoublePress()
DoublePress()
{
static pressed1 = 0
if pressed1 and A_TimeSincePriorHotkey <= 500
{
pressed1 = 0
; Translate from any language to Russian and from Russian to English if source was in Russian
; Tooltip, % Translate("sv","en")
GUIit(Translate("da","en"),Clipboard)
}
else
pressed1 = 1
}
; translate to "to" language,
; if source language is "to"
; translate to "anti" language
Translate(To,Anti)
{
UseAnti = 0
TranslateTo := To
if Clipboard =
return
FileRead, OutputVar, C:\Anand\authkey.txt
AccessPos := InStr(OutputVar,"access_token") + 15
ExpirePos := InStr(OutputVar,"expires_in") - 3
AccessToken := Substr(OutputVar,AccessPos,ExpirePos-AccessPos)
;Accesstoken := ;"http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=Translate-DKMS&http%3a%2f%2fschemas.microsoft.com%2faccesscontrolservice%2f2010%2f07%2fclaims%2fidentityp;rovider=https%3a%2f%2fdatamarket.accesscontrol.windows.net%2f&Audience=http%3a%2f%2fapi.microsofttranslator.com&ExpiresOn=1451548006&Issuer=https%3a%2f%2fdatamarket.accesscontrol.windows.net%2f&;HMACSHA256=g2Nbxe8URYN3kR11nBAwHl2VIj7xlYsvKbVHIIU%2fnDA%3d"
ExpireTimePos := InStr(Accesstoken,"ExpiresOn=") + 10
ExpireTim := Substr(Accesstoken,ExpireTimePos,10)
ExpireTime := Unix2Human(ExpireTim)
If ExpireTime - A_now < 0
{
VBSScript := "C:\Anand\Mstrans.vbs"
;RunWait, cscript.exe //nologo "%VBSScript%" ,,Hide
RunWait, c:\windows\system32\cscript.exe c:\Anand\Mstrans.vbs ,,Hide
FileRead, OutputVar, C:\Anand\authkey.txt
AccessPos := InStr(OutputVar,"access_token") + 15
ExpirePos := InStr(OutputVar,"expires_in") - 3
AccessToken := Substr(OutputVar,AccessPos,ExpirePos-AccessPos)
}
XCli := UriEncode(Clipboard)
;xyz = % "appId=""Bearer " . Accesstoken . """&text=""" . XCli . """&from=""da""&to=""en"""
;xyz = % "appId=""Bearer " . Accesstoken . """&text=""" . XCli . """&to=""en"""
Appid := % "Bearer " . Accesstoken
App := UriEncode(Appid)
xyza = % "appId=""Bearer " . Accesstoken
xyz = % "appId=" . App . "&text=""" . XCli . """&from=da&to=en&contentType=text/html"
;MsgBox % App
;MsgBox % xyz
;MsgBox % "The value in the variable named Var is " . Clipboard . "."
;UriCli := UriEncode(xyz)
;MsgBox % UriCli
anti_translate:
;Url := "http://translate.google.com/translate_a/t?client=x&text=" original
; . UriCli . "&tl=" . TranslateTo
Url := "http://api.microsofttranslator.com/V2/Http.svc/Translate?" original . xyz
;MsgBox % Url
;Url := "https://www.bing.com/translator/t?client=x&text="
; . UriCli . "&tl=" . TranslateTo
;Url := "http://translate.google.com/#da/en/&text="
; . UriCli . "&tl=" . TranslateTo
;http://translate.google.com/translate_a/t?client=x&text="DER ER ALIAS FRA LSYSFP TIL LFPRO"
; Simulate Google Chrome
;JsonTrans := UrlDownloadToVar(Url,"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/18.6.872.0 Safari/535.2")
JsonTrans := UrlDownloadToVar(Url,"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/535.2")
;MsgBox % JsonTrans
; thanks to Grey (http://forum.script-coding.com/profile.php?id=25792)
StringReplace, JsonTrans, JsonTrans, \r\n,`r`n, All
StringReplace, JsonTrans, JsonTrans, \", ", All
JsonTrans := Substr(JsonTrans,InStr(JsonTrans,"microsoft.com"))
JsonTrans := Substr(JsonTrans,InStr(JsonTrans,">")+2)
JsonTrans := Substr(JsonTrans,1,InStr(JsonTrans,"</string>")-2)
;MsgBox % JsonTrans
;FromLang:=JSON(JsonTrans, "src")
FromLang:= "da"
ElapsedTime:=JSON(JsonTrans, "server_time")
;if (FromLang == To and TranslateTo <> Anti)
;{
; TranslateTo := Anti
;MsgBox % FromLang . " " . To . " " TranslateTo . " " . Anti
; goto anti_translate
;}
;Loop
;{
; Sentence:=JSON(JsonTrans, "sentences["(A_Index-1)"].trans")
; If Sentence
; TransText.=Sentence
; Else
; Break
;}
TransText := JsonTrans
;MsgBox % TransText
; Convert To UTF-8
BaseFileEnc := A_FileEncoding
FileEncoding
FileDelete, %A_ScriptDir%\Convert.html
FileAppend, %TransText%, %A_ScriptDir%\Convert.html
FileEncoding, UTF-8
FileRead TransText, %A_ScriptDir%\Convert.html
FileDelete, %A_ScriptDir%\Convert.html
FileEncoding, %BaseFileEnc%
; split long line to smaller lines about 40-50 symbols length
t := RegExReplace(transText,".{200,210}(\s)","$0`n")
Loop
{
posand := inStr(t,"
")
if posand > 0
t := substr(t,1,posand-1) . substr(t,posand+6)
else
Break
}
; ToolTip %FromLang%: %t%
; copy result to clipboard
; clipboard := t
Return FromLang ": " t
}
~LButton::
ToolTip
return
UrlDownloadToVar(URL, UserAgent = "", Proxy = "", ProxyBypass = "") {
; Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation 4.0,
; Windows Me, Windows 98, or Windows 95.
; Requires Internet Explorer 3.0 or later.
pFix:=a_isunicode ? "W" : "A"
hModule := DllCall("LoadLibrary", "Str", "wininet.dll")
AccessType := Proxy != "" ? 3 : 0
;INTERNET_OPEN_TYPE_PRECONFIG 0 // use registry configuration
;INTERNET_OPEN_TYPE_DIRECT 1 // direct to net
;INTERNET_OPEN_TYPE_PROXY 3 // via named proxy
;INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY 4 // prevent using java/script/INS
io := DllCall("wininet\InternetOpen" . pFix
, "Str", UserAgent ;lpszAgent
, "UInt", AccessType
, "Str", Proxy
, "Str", ProxyBypass
, "UInt", 0) ;dwFlags
iou := DllCall("wininet\InternetOpenUrl" . pFix
, "UInt", io
, "Str", url
, "Str", "" ;lpszHeaders
, "UInt", 0 ;dwHeadersLength
, "UInt", 0x80000000 ;dwFlags: INTERNET_FLAG_RELOAD = 0x80000000 // retrieve the original item
, "UInt", 0) ;dwContext
If (ErrorLevel != 0 or iou = 0) {
DllCall("FreeLibrary", "UInt", hModule)
return 0
}
VarSetCapacity(buffer, 10240, 0)
VarSetCapacity(BytesRead, 4, 0)
Loop
{
;http://msdn.microsoft.com/library/en-us/wininet/wininet/internetreadfile.asp
irf := DllCall("wininet\InternetReadFile", "UInt", iou, "UInt", &buffer, "UInt", 10240, "UInt", &BytesRead)
VarSetCapacity(buffer, -1) ;to update the variable's internally-stored length
BytesRead_ = 0 ; reset
Loop, 4 ; Build the integer by adding up its bytes. (From ExtractInteger-function)
BytesRead_ += *(&BytesRead + A_Index-1) << 8*(A_Index-1) ;Bytes read in this very DllCall
; To ensure all data is retrieved, an application must continue to call the
; InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero.
If (irf = 1 and BytesRead_ = 0)
break
Else ; append the buffer's contents
{
a_isunicode ? buffer:=StrGet(&buffer, "CP0")
Result .= SubStr(buffer, 1, BytesRead_ * (a_isunicode ? 2 : 1))
}
/* optional: retrieve only a part of the file
BytesReadTotal += BytesRead_
If (BytesReadTotal >= 30000) ; only read the first x bytes
break ; (will be a multiple of the buffer size, if the file is not smaller; trim if neccessary)
*/
}
DllCall("wininet\InternetCloseHandle", "UInt", iou)
DllCall("wininet\InternetCloseHandle", "UInt", io)
DllCall("FreeLibrary", "UInt", hModule)
Return Result
}
JSON(ByRef js, s, v = "") {
j = %js%
Loop, Parse, s, .
{
p = 2
RegExMatch(A_LoopField, "([+\-]?)([^[]+)((?:\[\d+\])*)", q)
Loop {
If (!p := RegExMatch(j, "(?<!\\)(""|')([^\1]+?)(?<!\\)(?-1)\s*:\s*((\{(?:[^{}]++|(?-1))*\})|(\[(?:[^[\]]++|(?-1))*\])|"
. "(?<!\\)(""|')[^\7]*?(?<!\\)(?-1)|[+\-]?\d+(?:\.\d*)?|true|false|null?)\s*(?:,|$|\})", x, p))
Return
Else If (x2 == q2 or q2 == "*") {
j = %x3%
z += p + StrLen(x2) - 2
If (q3 != "" and InStr(j, "[") == 1) {
StringTrimRight, q3, q3, 1
Loop, Parse, q3, ], [
{
z += 1 + RegExMatch(SubStr(j, 2, -1), "^(?:\s*((\[(?:[^[\]]++|(?-1))*\])|(\{(?:[^{\}]++|(?-1))*\})|[^,]*?)\s*(?:,|$)){" . SubStr(A_LoopField, 1) + 1 . "}", x)
j = %x1%
}
}
Break
}
Else p += StrLen(x)
}
}
If v !=
{
vs = "
If (RegExMatch(v, "^\s*(?:""|')*\s*([+\-]?\d+(?:\.\d*)?|true|false|null?)\s*(?:""|')*\s*$", vx)
and (vx1 + 0 or vx1 == 0 or vx1 == "true" or vx1 == "false" or vx1 == "null" or vx1 == "nul"))
vs := "", v := vx1
StringReplace, v, v, ", \", All
js := SubStr(js, 1, z := RegExMatch(js, ":\s*", zx, z) + StrLen(zx) - 1) . vs . v . vs . SubStr(js, z + StrLen(x3) + 1)
}
Return, j == "false" ? 0 : j == "true" ? 1 : j == "null" or j == "nul"
? "" : SubStr(j, 1, 1) == """" ? SubStr(j, 2, -1) : j
}
;-------------------------------------------------
; HTML encode/decode
;------------------------------------------------
StrPutVar(string, ByRef var, encoding)
{
; Ensure capacity.
SizeInBytes := VarSetCapacity( var, StrPut(string, encoding)
; StrPut returns char count, but VarSetCapacity needs bytes.
* ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) )
; Copy or convert the string.
StrPut(string, &var, encoding)
Return SizeInBytes
}
unix2Human(unixTimestamp) {
returnDate = 19700101080000
returnDate += unixTimestamp, s
return returnDate
}
UriEncode(str)
{
b_Format := A_FormatInteger
data := ""
SetFormat,Integer,H
SizeInBytes := StrPutVar(str,var,"utf-8")
Loop, %SizeInBytes%
{
ch := NumGet(var,A_Index-1,"UChar")
If (ch=0)
Break
if ((ch>0x7f) || (ch<0x30) || (ch=0x3d))
s .= "%" . ((StrLen(c:=SubStr(ch,3))<2) ? "0" . c : c)
Else
s .= Chr(ch)
}
SetFormat,Integer,%b_format%
return s
}
GUIit(Text,Clipbord) {
static Close
Gui,99: Destroy
Gui,99: +LastFound -border +AlwaysOnTop +ToolWindow -Caption
Gui,99: Color,black
Gui,99: Font, s20, Calibri
Language := substr(Text,1,3)
Text := Substr(Text,5)
Gui,99: Font, s15, Calibri
Gui,99: Add, Edit, % "x100 y65 w900 H30 cRed ReadOnly Uppercase -E0x200 -VScroll",%Language%
Gui,99: Add, Edit, % "x100 y100 w900 H300 cWhite ReadOnly -E0x200 -VScroll",%Clipbord%
Language := "en:"
Gui,99: Add, Edit, % "x100 y465 w900 H30 cRed ReadOnly Uppercase -E0x200 -VScroll",%Language%
Gui,99: Add, Edit, % "x100 y500 w900 H300 cWhite ReadOnly -E0x200 -VScroll",%Text%
Gui,99: Font, s30, Calibri
Gui,99: Add, Text, % "x1600 y40 vClose g99GuiEscape cC23B22", ⓧ
GuiControl, 99: Focus, Close
WinSet, Transparent, 200
Gui,99: Show, x0 y0 W%A_ScreenWidth% H%A_ScreenHeight%
}
99GuiEscape:
Gui,99: Destroy
Return