Google Übersetzer in GUI nutzen (AHK_H und AHK_L)

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Google Übersetzer in GUI nutzen (AHK_H und AHK_L)

Post by fump2000 » 17 Mar 2016, 10:59

Hallo zusammen :)

Da aus den alten Threads weder das Übersetzen mit Bing noch per Google klappen, hier nun eine funktionierende Lösung mit einer echt guten Google Translater Funktion.

Das Script rennt nur mit AHK_H also bitte hier die aktuelle runterladen und diese nutzen.

Die GUI habe ich nun komplett überarbeitet und weitere Funktionen hinzugefügt.
Eine Sprachauswahl ist vorhanden, wer da mehr benötigt kann dies gerne erweitern.

Man kann das Script per Label nutzen oder per Hotkey. Es ist aber kein Hotkey definiert da ich es aktuell aus einem anderen Script heraus per PostMessage starte.

Hier ein Screenshot der GUI:
Image

Hier der Code:

Code: Select all

;============================================================================
; Übersetzen von Text mit dem Google Translator mit Hilfe einer GUI.
;
; Originalthread zur Funktion von arcticir:
; https://autohotkey.com/boards/viewtopic.php?p=75662#p75662
;
; GUI etc. zum verwenden der Funktion von fump2000 :)
;
; Das Tool startet nur mit AHK_H v2
; Ich habe es getestet mit Version 2.0-a074-H001 vom 12.03.2016
;
;----------------------------------------------------------------------------
;
; Zum starten mehrere Möglichkeiten...
; Per AHK_H DLL laden:
/*
hModule:=DllCall("LoadLibrary","Str",ahkdll:=A_ScriptDir "\AutoHotkey.dll")
DllCall(ahkdll "\ahkdll","Str",A_ScriptDir "\gTranslate.ahk","Str","")

Sprunglabel:
Critical
scr:=DllCall(ahkdll "\ahkgetvar","Str","A_ScriptHwnd","UInt",0,"Str")
detecthiddenwindows,on
settitlematchmode,2
PostMessage, 0x5555, 2,1,,% "ahk_id " scr
detecthiddenwindows,off
settitlematchmode,1
return
*/
; Falls das Script kompiliert genutzt wird ist im Sprunglabel scr = Name der EXE Datei.
; Z. B. scr:="gt.exe" und PostMessage, 0x5555, 2,1,,% scr
; 
; Oder das Label "Start" in einen Hotkey umändern und per AHK_H EXE nutzen.
; Dann wird OnMessage(0x5555, "StartTranslator") im Startbereich nicht benötigt.
;
;----------------------------------------------------------------------------
;
; Alle weiteren Anweisungen zur Funktion zeigt das Tool beim klick auf "info".
; 
; Vielen Dank an HotKeyIt und an just me für Ihre Hilfe beim Umgang mit AHK_H!
;
;============================================================================
#Persistent
#SingleInstance ignore
OnMessage(0x201, "WM_LBUTTONDOWN") ; Necessary for Guis without caption.
OnMessage(0x5555, "StartTranslator") ; Startet die GUI auf zuruf.
CoordMode, Mouse, Screen
To:="en" ; Beim Start wird die Übersetzungssprache auf Englisch festgelegt.
ManAuto:=1 ; Beim Start wird die Übersetzung auf Manuell festgelegt.
Return
;============================================================================
 
;============================================================================
; Aufrufen
;============================================================================
Start:
TransText:=""
TextToT:=GetTextFromClipboard()
If WinExist("Translator")
	{
		GuiControl, GetText:,NewText,%TextToT%
		TransNewCopy:=1
		GoSub NewTranslate
		Return
	}
GoSub StartTranslate
Return
;----------------------------------------------------------------------------
; Funktion um Inhalte zu kopieren.
;----------------------------------------------------------------------------
GetTextFromClipboard()
{
	ClipSaved := ClipboardAll
	Clipboard := ""
	SendInput, ^c
	ClipWait, 0.5
	If ErrorLevel
		{
			Clipboard := ClipSaved
			ClipSaved := ""
			Return
		}
	v := Clipboard
	Clipboard := ClipSaved
	ClipSaved := ""
	Return v
}
;----------------------------------------------------------------------------
; Wurde kein Inhalt kopiert wird nur die GUI aufgerufen.
;----------------------------------------------------------------------------
StartTranslate:
To:="en" ; Wird die GUI geschlossen und neu aufgerufen, wird die Übersetzungssprache wieder auf Englisch gesetzt.
if (TextToT="")
	{
		GoSub GetText
		return
	}
else
	GoSub translate
Return
;----------------------------------------------------------------------------
; Startet die Übersetzung
;----------------------------------------------------------------------------
translate:
TransText:=translate_google(TextToT, To)
StrReplace, TransText, %TransText%, `n, `n`r,,1
if (GuiOn=1)
	GuiControl, GetText:,NewTransText,%TransText%
else
	{
		WithText:=1
		Gosub GetText
	}
Return
;----------------------------------------------------------------------------
; Gui zum anzeigen von übersetzen Text oder zur Eingabe von neuem Text.
;----------------------------------------------------------------------------
GetText:
MouseGetPos, TextX, TextY
Gui, GetText:Color, AAAAAA
Gui, GetText:+LastFound +AlwaysOnTop -Caption +ToolWindow +Border +HWNDh_GetText
Gui, GetText:Font, s8
Gui, GetText:Add, Text, x2 y3 w50 h17 +Left vLine1, Dein Text:
Gui, GetText:Add, Text, x335 y2 w13 h14 +Border cBlue +Center gWithTextGuiClose, X
Gui, GetText:Add, Edit, x0 y18 w350 h80 cBlue vNewText +border gNewTranslate,%TextToT%
Gui, GetText:Add, Text, x2 y102 w65 h17 +Left +ReadOnly, Übersetzung:
Gui, GetText:Add, Text, x100 y101 w60 h16 +Border cGreen +Center vTransGo gNewTranslate, !! GO !!
Gui, GetText:Add, Text, x209 y102 w80 h17, Sprachwahl:
Gui, GetText:Add, DropDownList, x270 y98 w80 h17 vLangChange gLangChange r5 +AltSubmit,Englisch||Deutsch|Italienisch|Französisch|Spanisch
Gui, GetText:Add, Edit, x0 y119 w350 h80 cGreen +border vNewTransText,%TransText%
Gui, GetText:Add, Text, x2 y201 w135 h17, Übersetzungsmodus:   Man.
Gui, GetText:Add, Radio,x137 y201 w13 h13 vManAuto gTransManAuto,
Gui, GetText:Add, Radio,x161 y201 w13 h13 vManAuto2 gTransManAuto,
Gui, GetText:Add, Text, x179 y201 w40 h17, Auto.
Gui, GetText:Add, Text, x237 y200 w35 h15 +Border cWhite +Center gTransInfo, info
Gui, GetText:Add, Text, x275 y200 w35 h15 +Border cWhite +Center gTransClearAll, clear
Gui, GetText:Add, Text, x313 y200 w35 h15 +Border cWhite +Center gWithTextGuiClose, close
Gui, GetText:Font, s12
Gui, GetText:Add, Text, x153 y199 w6 h15, /
if (WithText=1)
	GuiControl, GetText:Focus, Line1
else
	GuiControl, GetText:Focus, NewText
if (ManAuto=1) {
	GuiControl, GetText:,ManAuto,1
	GuiControl, GetText:Show, TransGo
} else {
	GuiControl, GetText:,ManAuto2,1
	GuiControl, GetText:Hide, TransGo
}
Gui, GetText:Show, h216 w350 x%TextX% y%TextY%,Translator
Hotkey, Escape, WithTextGuiClose, on
Return
;----------------------------------------------------------------------------
; Ändern der Sprache
;----------------------------------------------------------------------------
LangChange:
LangChangeSwitch:=1
GuiControlGet, LangChange, GetText:, LangChange
if (LangChange=1)
	To:="en"
if (LangChange=2)
	To:="de"
if (LangChange=3)
	To:="it"
if (LangChange=4)
	To:="fr"
if (LangChange=5)
	To:="es"
GoSub NewTranslate
Return
;----------------------------------------------------------------------------
; Schalter zum ändern des Übersetzungsmodus von automatisch zu manuell.
;----------------------------------------------------------------------------
TransManAuto:
GuiControlGet, ManAuto, GetText:, ManAuto ; 1=Manuell, 0=Automatisch
if (ManAuto=0) {
	GuiControl, GetText:Hide, TransGo
	GoSub NewTranslate
} else {
	GuiControl, GetText:Show, TransGo
}
Return
;----------------------------------------------------------------------------
; Infos zur Verwendung des Tools.
;----------------------------------------------------------------------------
TransInfo:
ToolTip, Informationen zur Verwendung:`n`nIm oberen Feld "Dein Text" gibst du den`nzu übersetzenden Text ein.`n`nIm unteren Feld "Übersetzung" erscheint`nder übersetzte Text.`n`nDer Übersetzungsmodus bestimmt ob deine`nEingabe im oberen Feld "On the fly"`nübersetzt wird oder ob du die Übersetzung`nmanuell per "!! GO !!" Button starten musst.`n`nMit der Sprachauswahl bestimmst du die`nÜbersetzungssprache. Du kannst wählen`nzwischen Englisch - Deutsch - Italienisch -`nFranzösisch und Spanisch. Eine Änderung`nübersetzt deinen Text sofort.`n`nDer "!! GO !!" Button startet die manuelle`nÜbersetzung.`n`nBeim schließen des Fensters werden die`nTextfelder geleert auch die Sprachauswahl`nwird wieder auf Englisch zurückgesetzt.`nDer Übersetzungsmodus bleibt erhalten`nsolange das Tool aktiv ist.`n`nEs wird automatisch übersetzt wenn das Tool`nmit markierten Text gestartet - oder wenn`nneuer Text an das Tool gesendet wird. Dies `nerfolgt unabhängig vom Übersetzungsmodus`naber in gewünschter Sprache sofern das`nFenster geöffnet ist.
SetTimer, ToolTipEntfernen, 30000
Return

ToolTipEntfernen:
SetTimer, ToolTipEntfernen, Off
ToolTip
return
;----------------------------------------------------------------------------
; Löscht alle Felder und setzt die Optionen zurück.
;----------------------------------------------------------------------------
TransClearAll:
GuiControl, GetText:, NewText,
GuiControl, GetText:, NewTransText,
GuiControl, GetText:Choose, LangChange,1
GuiControl, GetText:, ManAuto,1
GuiControl, GetText:Show, TransGo
GuiControl, GetText:Focus, NewText
To:="en"
ManAuto:=1
Return
;----------------------------------------------------------------------------
; Bei der Eingabe von neuem Text wird direkt neu Übersetzt sofern ManAuto=0 ist.
;----------------------------------------------------------------------------
NewTranslate:
if (ManAuto=0 || LangChangeSwitch=1 || A_GuiControl="TransGo" || TransNewCopy=1) {
	GuiControl, GetText:, NewTransText,
	GuiControlGet, NewText, GetText:, NewText
	if (NewText="") {
		GuiControl, GetText:,NewTransText,
		Return
	}
	GuiOn:=1
	TextToT:=NewText
	TransText:=""
	LangChangeSwitch:=0
	TransNewCopy:=0
	GoSub translate
}
Return
;----------------------------------------------------------------------------
; Schließt die GUI und leert die Var's.
;----------------------------------------------------------------------------
WithTextGuiClose:
GuiOn:=0
WithText:=0
TransText:=""
Gui, GetText:Destroy
Hotkey, Escape, WithTextGuiClose, off
Return
;----------------------------------------------------------------------------
 
;============================================================================
; Funktionen für Google
;============================================================================
translate_google(str,tl:="",sl:="",proxy:=""){
	ComObjError(false)
	http	:= ComObjCreate("WinHttp.WinHttpRequest.5.1")
	proxy?http.SetProxy(2,proxy):"",tl?"":tl:="de"
	http.open("POST","https://translate.google.com/translate_a/single?client=t&sl=" (sl?sl:"auto") "&tl=" tl "&hl=" tl "&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=3&tsel=3&pc=1&kc=2&tk=" translate_tl(str),1)
 
	http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
	http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
	http.send("q=" Uri_Encode(str))
	http.WaitForResponse(-1)
	if IsObject(Result:=so(http.responsetext,0)) && IsObject(Result.1) && Result.1.Length()
	for i,n in Result.1
	text.= n.1 " "
	Return text
}

so(s,n:=""){
	static JSON,JSONS,d,y:="`"",j:="`" `t",m:={"\b":Chr(08),"\\":"\","\t":"`t","\n":"`n","\f":Chr(12),"\r":"`r"},gu:="āЁξ"
	if (Type(s)="Object")
	{
		for i,n in s
			str.= (Type(i)="Object"?so(i,1):i+0=""?(gu i gu):i)  ":"  (Type(n)="Object"?so(n,1): n+0=""?(gu n gu):n)  ","
		if !n
		{
			StrReplace, str, %str%,/,\/
			for c,z in m 
				IF InStr(str,z)
				StrReplace, str, %str%,% z,% c
			StrReplace, str, %str%,% y,% "\" y
			StrReplace, str, %str%,% gu,% y
		}
		Return "{" RTrim(str,",") "}"
	}
	if (Type(s)="string")
	{
		f:=[],i:=1
		if n
			b:=StrLen(s)
		else
		{
			if !(s:=Trim(s)) or !regexmatch(s, "[\[\{]")
				Return s
			if JSON:=(n=0) ; so(s,0) JSON
			{
				for c,z in m
					if InStr(s,c)
						StrReplace,s,% s,% c,% z
				StrReplace, s, %s%,\/,/
 
 
				if e:=InStr(s,"\u")
					for e,n in StrSplit(SubStr(s, e+2), "\u")
						IF n and !f[b:=SubStr(n, 1, 4)]
						{
							IF d := Abs("0x" b)
								StrReplace,s,% s,% "\u" b,% Chr(d)
							f[b]:=1
						}
			}
			f:=[],b:=StrLen(s),n:=SubStr(s,i,1),d:=0,JSONS:=JSON?"\":"``"
		}
 
		if (n="{")
			loop
			{
				if ((r?r[0]:"") = "}") or !i or !( i:=RegExMatch(s,"\S",n,i+1) ) or ((n:=n[0]) = "}")
					Return d:=i,f
 
				if InStr("[{",n)
					 (k:=so(SubStr(s,i),n),i+=d,i:=RegExMatch(s,"\S",t,InStr(s,":",,i)+1),(InStr("[{",t:=i?t[0]:"")
						? (f[SO_JSON(K,JSON) ""]:=so(SubStr(s,i),t),i:=RegExMatch(s,",|\}",r,i+d))
						: ( ((t=y) 	? (p:=InStr(s,y,,i+1),p:=RegExMatch(s,",|\}",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
										: (p:=RegExMatch(s,",|\}",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0))
									,f[SO_JSON(K,JSON) ""]:=SO_JSON(K,JSON),i:=p)) )
				else
					 (x:=InStr(s,":",,(n=y)?InStr(s,y,,i,2):i))
						? (k:= ((n=y)?SubStr(s,i+1,x-i-2):SubStr(s,i,x-i))
							,k:=(n=y ? Trim(k) : n="(" ? SO_Try(Trim(k,"() `t")):Trim(k)),i:=RegExMatch(s,"\S",t,x+1)
							,InStr("[{",t:=i?t[0]:"")
								? (f[SO_JSON(K,JSON)  ""]:=so(SubStr(s,i),t),i:=RegExMatch(s,",|\}",r,i+d))
								: ( ((t=y) 	? (p:=so_InStr(s,i,JSONS),p:=RegExMatch(s,",|\}",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
										: (p:=RegExMatch(s,",|\}",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0))
									,f[SO_JSON(K,JSON)  ""]:=SO_JSON(Z,JSON),i:=p))
						: i:=0
			}
 
		if (n = "[")
			loop
			{
				if ((r?r[0]:"") = "]") or !i or !( i:=RegExMatch(s,"\S",n,i+1) ) or ((n:=n[0]) = "]")
					Return d:=i,f
				(InStr("[{",n)
					? (f.Push(so(SubStr(s,i),n)),i:=RegExMatch(s,",|\]",r,i+d))
					: (  (n=y) ? (p:=so_InStr(s,i,JSONS),p:=RegExMatch(s,",|\]",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
						: (p:=RegExMatch(s,",|\]",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0),i:=p
						,f.Push(SO_JSON(Z,JSON))))
			}
	}
}
 
SO_JSON(s,JSON){
	static J:="\`"",P:="`""
	Return JSON AND InStr(s,J)?StrReplace(S,J,P):S
}
 
SO_InStr(s,i,JSONS){
	while (p:=InStr(s,"`"",,i+1)) and (SubStr(s,p-1,1)=JSONS)
		i:=p
	Return p
}
 
SO_Try(f){
	global
	Try
	Return  (%f%)
}
 
Uri_Encode(str){
	n := StrPutVar(str, UTF8, "UTF-8"),f:={"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"2d":1,"2e":1,"4a":1,"4b":1,"4c":1,"4d":1,"4e":1,"4f":1,"5a":1,"5f":1,"6a":1,"6b":1,"6c":1,"6d":1,"6e":1,"6f":1,"7a":1,"7e":1}
	loop, strlen(hex:=BintoHex(&UTF8,n))/2-1
		Res .= f[r:=substr(hex, A_index*2-1,2)]?Chr("0x" r):"`%" r
	return Res
}
 
translate_tl(string){
	a := b :=datediff(time?time:A_NowUTC,"19700101","hours")
	n:= StrPutVar(string,utf8,"UTF-8")
	loop, strlen(hex:=BintoHex(&UTF8, n))/2-1
		a := translate_rl(a + ("0x" substr(hex, A_index*2-1,2)), "+-a^+6")
	a := Mod((0 > (a := translate_rl(a, "+-3^+b+-f"))) ? (a := (a & 2147483647) + 2147483648) : a,10 ** 6)
	return a "." (a ^ b)
}
 
translate_rl(a, b){
	c := 0
	while c < StrLen(b) - 2
	{
		d := SubStr(b, c+3, 1),d := (d >= "a") ? Ord(d) - 87 : d+0
		,d := (SubStr(b, c+2, 1) ==  "+") ? a >> d : a << d
		,a := (SubStr(b, c+1, 1) == "+") ? (a + d & 4294967295) : a ^ d
		,c += 3
	}
	return ToInt(a)
}
 
ToInt(ByRef num,buf:=0){
	return num:=NumGet(getvar(buf:=num+0),"Int")
}
 
StrPutVar(Str, ByRef Var, Enc := "")
{
   Len := StrPut(Str, Enc) * (Enc = "UTF-16" || Enc = "CP1200" ? 2 : 1)
   VarSetCapacity(Var, Len, 0)
   Return, StrPut(Str, &Var, Enc)
}
 
BinToHex(addr,len) { ; Thanks Laszo
  static b2h
  if !b2h
    b2h:=McodeH(A_PtrSize=8?"4C8BC94585C0744F458BD00F1F440000440FB6024983C10248FFC241C0E8044180E80A410FB6C0C0E805442AC04180C041458841FE0FB64AFF80E10F80E90A0FB6C1C0E8052AC880C14149FFCA418849FF75BD458811C3C60100C3":"558BEC578B7D1085FF74398B4D08568B750C8A06C0E8042C0A8AD0C0EA052AC2044188018A06240F2C0A8AD0C0EA052AC204418841014683C1024F75D55EC601005F5DC38B4508C600005F5DC3","i==ttui")
  VarSetCapacity(hex,2 * len + 1),b2h[&hex,addr,len]
  Return StrGet(&hex,"CP0")
}
 
MCodeH(h,def,p*){
static f,DynaCalls
If !f
f:={},DynaCalls:={}
If DynaCalls.HasKey(h)
return DynaCalls[h]
f.Push(h),f.SetCapacity(f.Length(),len:=StrLen(h)//2)
DllCall("VirtualProtect","PTR",addr:=f.GetAddress(f.Length()),"Uint",len,"UInt",64,"Uint*",0)
Loop len
NumPut("0x" SubStr(h,2*A_Index-1,2),addr,A_Index-1,"Char")
if p.Length()
Return DynaCalls[h]:=DynaCall(addr,def,p*)
else Return DynaCalls[h]:=DynaCall(addr,def)
}
;============================================================================
; OnMessage Funktionen
;============================================================================
WM_LBUTTONDOWN()
{
	if (A_Gui="GetText")
		{
			If (A_GuiControl = "") ; Klick auf den Hintergrund der GUI
				PostMessage, 0xA1, 2, 0 ; sehr sehr alter Trick von SKAN: 0xA1 = WM_NCLBUTTONDOWN
		}
}

StartTranslator(wParam, lParam)
	{
		If (wParam=2 && lParam=1)
			GoSub Start
	}
Download AHK_H v2: siehe einen Post tiefer...


Wünsche viel Spaß damit ;)

MfG
fump



-----------------------------------------------------------------------------------

just me war so nett und hat die Funktion auf AHK_L portiert.
Daher gibts hier nun auch eine Version die mit 1.1 funktioniert.

Statt OnMessage hab ich nun wieder auf Hotkey Strg+T umgestellt.

Code: Select all

;============================================================================
; Übersetzen von Text mit dem Google Translator mit Hilfe einer GUI.
;
; Originalthread zur Funktion von arcticir:
; https://autohotkey.com/boards/viewtopic.php?p=75662#p75662
;
; Die Funktion wurde vom User "just me" auf AHK_L 1.1 portiert. Vielen Dank dafür!
;
; GUI by fump2000
;
; Getestet auf Win10 x64 mit AHK_L 1.1.23.01
; 
;----------------------------------------------------------------------------
;
; Alle weiteren Anweisungen zur Funktion zeigt das Tool beim klick auf "info".
;
;============================================================================
#NoEnv
#Persistent
#SingleInstance, force
SetBatchLines,-1
OnMessage(0x201, "WM_LBUTTONDOWN") ; Necessary for Guis without caption.
CoordMode, Mouse, Screen
To:="en" ; Beim Start wird die Übersetzungssprache auf Englisch festgelegt.
ManAuto:=1 ; Beim Start wird die Übersetzung auf Manuell festgelegt.
Return
;============================================================================
 
;============================================================================
; Aufrufen
;============================================================================
^t::
TransText:=""
TextToT:=GetTextFromClipboard()
If WinExist("PWM Translator")
	{
		GuiControl, GetText:,NewText,%TextToT%
		TransNewCopy:=1
		GoSub NewTranslate
		Return
	}
GoSub StartTranslate
Return
;----------------------------------------------------------------------------
; Funktion um Inhalte zu kopieren.
;----------------------------------------------------------------------------
GetTextFromClipboard()
{
	ClipSaved := ClipboardAll
	Clipboard := ""
	SendInput, ^c
	ClipWait, 0.5
	If ErrorLevel
		{
			Clipboard := ClipSaved
			ClipSaved := ""
			Return
		}
	v := Clipboard
	Clipboard := ClipSaved
	ClipSaved := ""
	Return v
}
;----------------------------------------------------------------------------
; Wurde kein Inhalt kopiert wird nur die GUI aufgerufen.
;----------------------------------------------------------------------------
StartTranslate:
To:="en" ; Wird die GUI geschlossen und neu aufgerufen, wird die Übersetzungssprache wieder auf Englisch gesetzt.
if (TextToT="")
	{
		GoSub GetText
		return
	}
else
	GoSub translate
Return
;----------------------------------------------------------------------------
; Startet die Übersetzung
;----------------------------------------------------------------------------
translate:
TransText:=translate_google(TextToT, To)
StringReplace, TransText, TransText, \n, `n`r, 1
if (GuiOn=1)
	GuiControl, GetText:,NewTransText,%TransText%
else
	{
		WithText:=1
		Gosub GetText
	}
Return
;----------------------------------------------------------------------------
; Gui zum anzeigen von übersetzen Text oder zur Eingabe von neuem Text.
;----------------------------------------------------------------------------
GetText:
MouseGetPos, TextX, TextY
Gui, GetText:Color, AAAAAA
Gui, GetText:+LastFound +AlwaysOnTop -Caption +ToolWindow +Border +HWNDh_GetText
Gui, GetText:Font, s8
Gui, GetText:Add, Text, x2 y3 w50 h17 +Left vLine1, Dein Text:
Gui, GetText:Add, Text, x335 y2 w13 h14 +Border cBlue +Center gWithTextGuiClose, X
Gui, GetText:Add, Edit, x0 y18 w350 h80 cBlue vNewText +border gNewTranslate,%TextToT%
Gui, GetText:Add, Text, x2 y102 w65 h17 +Left +ReadOnly, Übersetzung:
Gui, GetText:Add, Text, x100 y101 w60 h16 +Border cGreen +Center vTransGo gNewTranslate, !! GO !!
Gui, GetText:Add, Text, x209 y102 w80 h17, Sprachwahl:
Gui, GetText:Add, DropDownList, x270 y98 w80 h17 vLangChange gLangChange r5 +AltSubmit,Englisch||Deutsch|Italienisch|Französisch|Spanisch
Gui, GetText:Add, Edit, x0 y119 w350 h80 cGreen +border vNewTransText,%TransText%
Gui, GetText:Add, Text, x2 y201 w135 h17, Übersetzungsmodus:   Man.
Gui, GetText:Add, Radio,x137 y201 w13 h13 vManAuto gTransManAuto,
Gui, GetText:Add, Radio,x161 y201 w13 h13 vManAuto2 gTransManAuto,
Gui, GetText:Add, Text, x179 y201 w40 h17, Auto.
Gui, GetText:Add, Text, x237 y200 w35 h15 +Border cWhite +Center gTransInfo, info
Gui, GetText:Add, Text, x275 y200 w35 h15 +Border cWhite +Center gTransClearAll, clear
Gui, GetText:Add, Text, x313 y200 w35 h15 +Border cWhite +Center gWithTextGuiClose, close
Gui, GetText:Font, s12
Gui, GetText:Add, Text, x153 y199 w6 h15, /
if (WithText=1)
	GuiControl, GetText:Focus, Line1
else
	GuiControl, GetText:Focus, NewText
if (ManAuto=1) {
	GuiControl, GetText:,ManAuto,1
	GuiControl, GetText:Show, TransGo
} else {
	GuiControl, GetText:,ManAuto2,1
	GuiControl, GetText:Hide, TransGo
}
Gui, GetText:Show, h216 w350 x%TextX% y%TextY%,PWM Translator
Hotkey, Escape, WithTextGuiClose, on
Return
;----------------------------------------------------------------------------
; Ändern der Sprache
;----------------------------------------------------------------------------
LangChange:
LangChangeSwitch:=1
GuiControlGet, LangChange, GetText:, LangChange
if (LangChange=1)
	To:="en"
if (LangChange=2)
	To:="de"
if (LangChange=3)
	To:="it"
if (LangChange=4)
	To:="fr"
if (LangChange=5)
	To:="es"
GoSub NewTranslate
Return
;----------------------------------------------------------------------------
; Schalter zum ändern des Übersetzungsmodus von automatisch zu manuell.
;----------------------------------------------------------------------------
TransManAuto:
GuiControlGet, ManAuto, GetText:, ManAuto ; 1=Manuell, 0=Automatisch
if (ManAuto=0) {
	GuiControl, GetText:Hide, TransGo
	GoSub NewTranslate
} else {
	GuiControl, GetText:Show, TransGo
}
Return
;----------------------------------------------------------------------------
; Infos zur Verwendung des Tools.
;----------------------------------------------------------------------------
TransInfo:
ToolTip, Informationen zur Verwendung:`n`nIm oberen Feld "Dein Text" gibst du den`nzu übersetzenden Text ein.`n`nIm unteren Feld "Übersetzung" erscheint`nder übersetzte Text.`n`nDer Übersetzungsmodus bestimmt ob deine`nEingabe im oberen Feld "On the fly"`nübersetzt wird oder ob du die Übersetzung`nmanuell per "!! GO !!" Button starten musst.`n`nMit der Sprachauswahl bestimmst du die`nÜbersetzungssprache. Du kannst wählen`nzwischen Englisch - Deutsch - Italienisch -`nFranzösisch und Spanisch. Eine Änderung`nübersetzt deinen Text sofort.`n`nDer "!! GO !!" Button startet die manuelle`nÜbersetzung.`n`nBeim schließen des Fensters werden die`nTextfelder geleert auch die Sprachauswahl`nwird wieder auf Englisch zurückgesetzt.`nDer Übersetzungsmodus bleibt erhalten`nsolange das Tool aktiv ist.`n`nEs wird automatisch übersetzt wenn das Tool`nmit markierten Text gestartet - oder wenn`nneuer Text an das Tool gesendet wird. Dies `nerfolgt unabhängig vom Übersetzungsmodus`naber in gewünschter Sprache sofern das`nFenster geöffnet ist.
SetTimer, ToolTipEntfernen, 30000
Return

ToolTipEntfernen:
SetTimer, ToolTipEntfernen, Off
ToolTip
return
;----------------------------------------------------------------------------
; Löscht alle Felder und setzt die Optionen zurück.
;----------------------------------------------------------------------------
TransClearAll:
GuiControl, GetText:, NewText,
GuiControl, GetText:, NewTransText,
GuiControl, GetText:Choose, LangChange,1
GuiControl, GetText:, ManAuto,1
GuiControl, GetText:Show, TransGo
GuiControl, GetText:Focus, NewText
To:="en"
ManAuto:=1
Return
;----------------------------------------------------------------------------
; Bei der Eingabe von neuem Text wird direkt neu Übersetzt sofern ManAuto=0 ist.
;----------------------------------------------------------------------------
NewTranslate:
if (ManAuto=0 || LangChangeSwitch=1 || A_GuiControl="TransGo" || TransNewCopy=1) {
	GuiControl, GetText:, NewTransText,
	GuiControlGet, NewText, GetText:, NewText
	if (NewText="") {
		GuiControl, GetText:,NewTransText,
		Return
	}
	GuiOn:=1
	TextToT:=NewText
	TransText:=""
	LangChangeSwitch:=0
	TransNewCopy:=0
	GoSub translate
}
Return
;----------------------------------------------------------------------------
; Schließt die GUI und leert die Var's.
;----------------------------------------------------------------------------
WithTextGuiClose:
GuiOn:=0
WithText:=0
TransText:=""
Gui, GetText:Destroy
Hotkey, Escape, WithTextGuiClose, off
Return
;----------------------------------------------------------------------------
 
;============================================================================
; Funktionen für Google
;============================================================================
; ==================================================================================================================================
; Originally released as "[H2] Google Translate API" by arcticir -> https://autohotkey.com/boards/viewtopic.php?f=6&t=14757
; Modified by just me for AHK 1.1
; ==================================================================================================================================
translate_google(str, tl := "", sl := "", proxy := "") {
   ; ComObjError(False)
   Static http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
   If (proxy)
      http.SetProxy(2, proxy)
   If !(tl)
      tl := "de"
   http.open("POST", "https://translate.google.com/translate_a/single?client=t"
                     . "&sl=" . (sl ? sl : "auto") . "&tl=" . tl . "&hl=" . tl
                     . "&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=3&tsel=3"
                     . "&pc=1&kc=2&tk=" . translate_tl(str), 1)
   http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
   http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
   http.send("q=" . Uri_Encode(str))
   http.WaitForResponse(-1)
   If IsObject(Result := so(http.responsetext, 0)) && IsObject(Result.1) && Result.1.Length()
      For i, n in Result.1
         text .= n.1 . " "
   Return text
}
; ----------------------------------------------------------------------------------------------------------------------------------
so(s, n := ""){
   Static JSON
        , JSONS
        , d
        , y := """"
        , j := """ `t"
        , m := {"\b": Chr(08), "\\": "\", "\t": "`t", "\n": "`n", "\f": Chr(12), "\r": "`r"}
        , gu := "āЁξ"
   If IsObject(s)
   {
      For i, n In s
         str .= (IsObject(i) ? so(i, 1) : i + 0 = "" ? (gu . i . gu) : i)
              . ":"
              . (IsObject(n) ? so(n, 1) : n + 0 = "" ? (gu . n . gu) : n) . ","
      If !(n)
      {
         str := StrReplace(str, "/", "\/")
         For c, z In m
            If InStr(str, z)
               str := StrReplace(str, z, c)
         str := StrReplace(str, y, "\" . y)
         str := StrReplace(str, gu, y)
      }
      Return "{" . RTrim(str, ",") . "}"
   }
   Else
   {
      f := []
      i := 1
      If (n)
      {
         b := StrLen(s)
      }
      Else
      {
         If !(s := Trim(s)) Or !RegExMatch(s, "[\[\{]")
         {
            Return s
         }
         If (JSON := (n = 0)) ; so(s,0) JSON
         {
            For c, z In m
               If InStr(s, c)
                  s := StrReplace(s, c, z)
            s := StrReplace(s, "\/", "/")
            If (e := InStr(s, "\u"))
            {
               For e, n In StrSplit(SubStr(s, e+2), "\u")
               {
                  If (n And !f[b := SubStr(n, 1, 4)])
                  {
                     If (d := Abs("0x" . b))
                        s := StrReplace(s, "\u" . b, Chr(d))
                     f[b] := 1
                  }
               }
            }
         }
         f := []
         , b := StrLen(s)
         , n := SubStr(s, i, 1)
         , d := 0
         , JSONS := JSON ? "\" : "`" ; "``"
      }
      If (n = "{")
      {
         Loop
         {
            If (r = "}") or !(i) or !(i :=RegExMatch(s, "\S", n, i+1)) or (n = "}")
               Return f, d := i
            If InStr("[{",n)
            {
               k := so(SubStr(s, i), n)
               , i += d
               , i := RegExMatch(s, "\S", t, InStr(s, ":", , i) + 1)
               If InStr("[{", i ? t : "")
               {
                  f[SO_JSON(k, JSON) ""] := so(SubStr(s, i), t)
                  , i := RegExMatch(s, ",|\}", r, i+d)
               }
               Else
               {
                  If (t = y)
                  {
                     p := InStr(s, y, , i+1)
                     , p := RegExMatch(s, ",|\}", r, p)
                     , z := Trim(SubStr(s, i+1, p-i-2))
                  }
                  Else
                  {
                     p := RegExMatch(s, ",|\}", r, i)
                     , z := Trim(SubStr(s, i, p-i))
                     , z := z+0 = "" ? SO_Try(z) : z+0
                  }
                  soj := SO_JSON(k, JSON)
                  , f[soj . ""] := soj
                  , i := p
               }
            }
            Else
            {
               If (x := InStr(s, ":", , (n = y) ? InStr(s, y, , i, 2) : i))
               {
                  k := ((n = y) ? SubStr(s, i+1, x-i-2) : SubStr(s, i, x-i))
                  , k := (n = y ? Trim(k) : n = "(" ? SO_Try(Trim(k, "() `t")) : Trim(k))
                  , i := RegExMatch(s, "\S", t, x+1)
                  If InStr("[{",i ? t : "")
                  {
                     f[SO_JSON(k, JSON) . ""] := so(SubStr(s, i) ,t)
                     , i := RegExMatch(s, ",|\}", r, i+d)
                  }
                  Else
                  {
                     If (t = y)
                     {
                        p := so_InStr(s, i, JSONS)
                        , p := RegExMatch(s, ",|\}", r, p)
                        , z := Trim(SubStr(s, i+1, p-i-2))
                     }
                     Else
                     {
                        p := RegExMatch(s, ",|\}", r, i)
                        , z := Trim(SubStr(s, i, p-i))
                        , z := z + 0 = "" ? SO_Try(z) : z + 0
                     }
                     f[SO_JSON(k, JSON)  "" ]:= SO_JSON(z, JSON)
                     , i := p
                  }
               }
               Else
               {
                  i := 0
               }
            }
         }
      }
      If (n = "[")
      {
         Loop
         {
            If (r = "]") or !(i) or !(i := RegExMatch(s, "\S", n, i+1)) or (n = "]")
               Return f, d := i
            If InStr("[{", n)
            {
               f.Push(so(SubStr(s, i), n))
               , i := RegExMatch(s, ",|\]", r, i+d)
            }
            Else
            {
               If (n = y)
               {
                  p := so_InStr(s, i, JSONS)
                  , p := RegExMatch(s, ",|\]", r, p)
                  , z := Trim(SubStr(s, i+1, p-i-2))
               }
               Else
               {
                  p := RegExMatch(s, ",|\]", r, i)
                  , z := Trim(SubStr(s, i, p-i))
                  , z := z + 0 = "" ? SO_Try(z) : z+0
                  , i := p
               }
               f.Push(SO_JSON(z, JSON))
            }
         }
      }
   }
}
; ----------------------------------------------------------------------------------------------------------------------------------
SO_JSON(s, JSON) {
   Static j := "\"""
        , p := """"
   Return JSON And InStr(s, j) ? StrReplace(s, j, p) : s
}
; ----------------------------------------------------------------------------------------------------------------------------------
SO_InStr(s, i, JSONS) {
   While (p := InStr(s, """", , i+1)) And (SubStr(s, p-1, 1) = JSONS)
      i := p
   Return p
}
; ----------------------------------------------------------------------------------------------------------------------------------
SO_Try(f) {
   Global
   Try
   Return (%f%)
}
; ----------------------------------------------------------------------------------------------------------------------------------
Uri_Encode(str) {
   Static f := {0x30:1,0x31:1,0x32:1,0x33:1,0x34:1,0x35:1,0x36:1,0x37:1,0x38:1,0x39:1,0x41:1,0x42:1,0x43:1,0x44:1,0x45:1,0x46:1
               ,0x47:1,0x48:1,0x49:1,0x50:1,0x51:1,0x52:1,0x53:1,0x54:1,0x55:1,0x56:1,0x57:1,0x58:1,0x59:1,0x61:1,0x62:1,0x63:1
               ,0x64:1,0x65:1,0x66:1,0x67:1,0x68:1,0x69:1,0x70:1,0x71:1,0x72:1,0x73:1,0x74:1,0x75:1,0x76:1,0x77:1,0x78:1,0x79:1
               ,0x2d:1,0x2e:1,0x4a:1,0x4b:1,0x4c:1,0x4d:1,0x4e:1,0x4f:1,0x5a:1,0x5f:1,0x6a:1,0x6b:1,0x6c:1,0x6d:1,0x6e:1,0x6f:1
               ,0x7a:1,0x7e:1}
   VarSetCapacity(utf8, StrPut(str, "UTF-8"), 0)  ; StrPutVar()
   Loop, % StrPut(str, &utf8, "UTF-8") - 1
      Res .= f[r := NumGet(utf8, A_Index - 1, "UChar")] ? Chr(r) : Format("%{:02X}", r)
   Return Res
}
; ----------------------------------------------------------------------------------------------------------------------------------
translate_tl(string) {
   a := A_NowUTC ; DateDiff()
   a -= 19700101, H
   b := a
   VarSetCapacity(utf8, StrPut(string, "UTF-8"), 0) ; StrPutVar()
   Loop, % StrPut(string, &utf8, "UTF-8") - 1
      a := translate_rl(a + NumGet(utf8, A_Index - 1, "UChar"), "+-a^+6")
   a := Mod((0 > (a := translate_rl(a, "+-3^+b+-f"))) ? (a := (a & 2147483647) + 2147483648) : a, 10 ** 6)
   Return a "." (a ^ b)
}
; ----------------------------------------------------------------------------------------------------------------------------------
translate_rl(a, b){
   c := 0
   While c < (StrLen(b) - 2)
   {
      d := SubStr(b, c+3, 1)
      , d := (d >= "a") ? Ord(d) - 87 : d + 0
      , d := (SubStr(b, c+2, 1) = "+") ? a >> d : a << d
      , a := (SubStr(b, c+1, 1) = "+") ? (a + d & 4294967295) : a ^ d
      , c += 3
   }
   VarSetCapacity(i, 4, 0) ; ToInt()
   NumPut(a, i, "Int")
   Return NumGet(i, "Int")
}
;============================================================================
; OnMessage Funktionen
;============================================================================
WM_LBUTTONDOWN()
{
	if (A_Gui="GetText")
		{
			If (A_GuiControl = "") ; Klick auf den Hintergrund der GUI
				PostMessage, 0xA1, 2, 0 ; sehr sehr alter Trick von SKAN: 0xA1 = WM_NCLBUTTONDOWN
		}
}
MfG
fump
Last edited by fump2000 on 18 Mar 2016, 09:01, edited 2 times in total.
User avatar
Gerdi
Posts: 102
Joined: 03 Aug 2015, 18:48
GitHub: grrdi
Location: Germany

Re: Google Übersetzer in GUI nutzen (AHK_H und AHK_L)

Post by Gerdi » 25 Nov 2017, 20:53

Ich bekomme in der unteren Fensterhaelfte nichts angezeigt.
Ueber den Debugger sehe ich zwar wie irgenwelche Zahlen verarbeitet werden, die untere Fensterhaelfte bleibt jedoch leer.
Ahk-Version die neueste.
Win 10 Home (x64) or Win 7 Enterprise
https://github.com/Grrdi/ZackZackOrdner ... master.zip --> get folders on the quick
Post Reply

Return to “Skripte und Funktionen”