Sprachen Wechsler

03/10/2014 05:03 md88#1
Hay Communty,
Wie bekomme ich das hin das Ich mit einer Combobox jetzt auswählen kann welche MsgBox als Nächstes erscheint? z.b. ich wähle zwischen Deutsch und englisch, deutsch in der Combobox aus und habe 2 MsgBoxen 1ne mit deutschem Inhalt eine mit Englisch, und wie weil ich in der Combobox Deutsch ausgewählt habe dann auch Deutsch bekommen. Wie geht das? Und wenn das geht, kann man dann auch mit der ComboBox die Sprache in einer Gui und dem MsgBoxen umändern? Oder gibt es da eine einfachere Lösung?
03/10/2014 08:32 alpines#2
Du liest einfach die Combo aus, wenn die auf Deutsch steht settest du alles auf Deutsch und bei Englisch ist es andersherum.
03/10/2014 15:58 Shadow992#3
Quote:
Originally Posted by md88 View Post
Hay Communty,
Wie bekomme ich das hin das Ich mit einer Combobox jetzt auswählen kann welche MsgBox als Nächstes erscheint? z.b. ich wähle zwischen Deutsch und englisch, deutsch in der Combobox aus und habe 2 MsgBoxen 1ne mit deutschem Inhalt eine mit Englisch, und wie weil ich in der Combobox Deutsch ausgewählt habe dann auch Deutsch bekommen. Wie geht das? Und wenn das geht, kann man dann auch mit der ComboBox die Sprache in einer Gui und dem MsgBoxen umändern? Oder gibt es da eine einfachere Lösung?
Schau dir einmal das an, könnte dir helfen:
[Only registered and activated users can see links. Click Here To Register...]
03/10/2014 17:56 alpines#4
FlutterShy, kann es sein das du nur Whitespaces mit %20 replaced? Was ist denn mit anderen Sachen wie einem + Zeichen z.B.? Wenn man das so macht, dann sollte man auf die ganze Palette zurückgreifen und ne UDF schreiben bzw. ziehen in der alles in Hex-Codes umgewandelt wird, aber statt Präfix 0x halt %.
03/10/2014 18:54 alpines#5
Schon besser.
03/10/2014 20:50 alpines#6
Code:
 Local $Temp = _Encode($Text) 
    Local $hSession = _WinHttpOpen($TRANSLATE_USERAGENT) 
    Local $hConnect = _WinHttpConnect($hSession, $TRANSLATE_HOST) 
    Local $HTML = _WinHttpSimpleRequest($hConnect, "GET", "")
zu
Code:
Local $Temp = ..., $hSession = ..., $hConnect = ..., $HTML = ...
03/10/2014 21:58 butter123#7
und nach stringbetween noch @error überprüfen. könte ja sein dass google down ist :D nein aber bei webanwendungen würde ich immer fehler abfangen^^
03/10/2014 22:37 alpines#8
Man sollte den StringBetween überprüfen ob es überhaupt ein Array ist.
03/10/2014 23:13 alpines#9
Gewöhn' dir das mit den tausend Locals ab, das sieht schlecht aus.
Nimm stattdessen

Local $aLines = ..., _
$sTemp = ...
03/10/2014 23:17 butter123#10
keine internetverbindung --> $html ist leer. das wäre der einfachste grund warum der code im absturz endet, weil er versucht auf ein array zuzugreifen, was keins ist. ein simples if isarray then verhindert dies.
03/10/2014 23:43 alpines#11
Dasselbe mit den Global Const bei den Sprachen, das sieht nicht schön aus und spaart so keinen Platz.
Außerdem warum muss der UserAgent so sein? Nimm doch einfach gar nichts oder etwas kürzeres.
03/11/2014 06:59 alpines#12
Wenn du die 3.3.10.2 nutzt kannst du sogar folgendes verwenden
Code:
Return (Not IsArray($a_result)?0:$a_result[0]
03/12/2014 00:06 lolkop#13
ich würde empfehlen das ganze so aufzudröseln, das am ende keine scriptblocker mehr übrig bleiben können.

hier ein beispiel:
Code:
TCPStartup()
Global $socket, $answer

InitGoogleTranslation()
RequestTranslation("this is a simple test", "en", "de")

While True
	If ReceiveAnswer() Then
		MsgBox(0, "Answer", ParseAnswer())
		Exit
	EndIf
WEnd

Func InitGoogleTranslation()
	$socket = TCPConnect(TCPNameToIP('translate.google.com'),80)
EndFunc

Func RequestTranslation($content, $from, $to)
	TCPSend($socket, "GET /translate_a/t?client=t&sl="&$from&"&tl="&$to&"&q="&URLEncoding($content)&" HTTP/1.1"&@CRLF&@CRLF)
EndFunc

Func ReceiveAnswer()
	$answer &= TCPRecv($socket,1024)
	If StringRight($answer,5)=0&@CRLF&@CRLF Then Return True
	Return False
EndFunc

Func ParseAnswer()
	Local $return, $exp1, $exp2
	$exp1 = StringRegExp($answer, "\[\[(\[.+?\])\]", 1)
	If Not IsArray($exp1) Then Return False
	$exp2 = StringRegExp($exp1[0], '\["(.+?)",.+?,.+?,.+?\]', 3)
	If Not IsArray($exp2) Then Return False
	For $i=0 To UBound($exp2)-1
		$return&=$exp2[$i]&@CRLF
	Next
	Return StringTrimRight($return,2)
EndFunc

Func URLEncoding($string)
	Local $return, $split = StringToASCIIArray($string, Default, Default, 2)
	For $i=0 To UBound($split) -1
		$return &= '%'&Hex($split[$i],2)
	Next
	Return $return
EndFunc
sicherlich ist das ganze noch optimierungswürdig, sollte aber zb bei nutzung von guis keine probleme mit scriptblockaden verursachen.

Edit:
bsp mit gui:
Code:
TCPStartup()
Global $socket, $answer

InitGoogleTranslation()
GUICreate('Tranlator', 600, 300, Default, Default, 0x10C80000)
$es = GUICtrlCreateEdit('', 10, 10, 270, 260, 0x1044)
$et = GUICtrlCreateEdit('', 320, 10, 270, 260, 0x844)
$go = GUICtrlCreateButton('->', 290, 10, 20, 282)
$cs = GUICtrlCreateCombo('auto', 10, 270, 270, 20, 0x200943)
$ct = GUICtrlCreateCombo('', 320, 270, 270, 20, 0x200943)
FillCombo()

While True
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $go
			RequestTranslation(GUICtrlRead($es), GUICtrlRead($cs), GUICtrlRead($ct))
	EndSwitch
	If ReceiveAnswer() Then GUICtrlSetData($et, ParseAnswer())
WEnd

Func FillCombo()
	Local $tmp, $local=LCIDToLocaleName(0)
	For $i=1 To 0xFF
		$tmp = LCIDToLocaleName($i)
		If $tmp<>'' Then
			GUICtrlSetData($cs, $tmp, 'auto')
			GUICtrlSetData($ct, $tmp, $local)
		EndIf
	Next
EndFunc

Func LCIDToLocaleName($iLCID)
    Local $return = DllCall("Kernel32.dll", "int", "LCIDToLocaleName", "int", $iLCID, "wstr", "", "int", 85, "dword", 0)
    Return StringLeft($return[2],2)
EndFunc

Func InitGoogleTranslation()
	$socket = TCPConnect(TCPNameToIP('translate.google.com'),80)
EndFunc

Func RequestTranslation($content, $from, $to)
	$answer = ''
	TCPSend($socket, "GET /translate_a/t?client=t&sl="&$from&"&tl="&$to&"&q="&URLEncoding($content)&" HTTP/1.1"&@CRLF&@CRLF)
EndFunc

Func ReceiveAnswer()
	$answer &= TCPRecv($socket,1024)
	If StringRight($answer,5)=0&@CRLF&@CRLF Then Return True
	Return False
EndFunc

Func ParseAnswer()
	Local $return, $exp1, $exp2
	$exp1 = StringRegExp($answer, "\[\[(\[.+?\])\]", 1)
	If Not IsArray($exp1) Then Return False
	$exp2 = StringRegExp($exp1[0], '\["(.+?)",.+?\]', 3)
	If Not IsArray($exp2) Then Return False
	For $i=0 To UBound($exp2)-1
		$return&=$exp2[$i]
	Next
	$answer = ''
	Return StringReplace(StringReplace($return,'\r',@CR),'\n',@LF)
EndFunc

Func URLEncoding($string)
	Local $return, $split = StringToASCIIArray($string, Default, Default, 2)
	For $i=0 To UBound($split) -1
		$return &= '%'&Hex($split[$i],2)
	Next
	Return $return
EndFunc
03/12/2014 16:52 YatoDev#14
Quote:
Originally Posted by lolkop View Post
...
Könntest du mir erklären was dein RegExp genau macht ich kann das nicht nachvollziehen. (Habs jetzt nicht getestet aber würde durch deine methode nicht meine multiline func wegfallen)
MultiLine macht komischerweise 2 absätze :o
EDIT : Nicht mehr

TCP hatte ich gestern nacht auch schon eingebaut ich konnte nicht schlafen ^^

Hatte das dann so gelöst (Hab mir deine encode funktion geklaut :p) :

Strings ohne CRLF brauchen bei TCP ~60 ms und bei WinHttp ~280 ms
Mit CRLF bei TCP ~260ms und bei WinHttp ~520 ms
03/12/2014 17:06 lolkop#15
Quote:
Originally Posted by »FlutterShy™ View Post
Strings ohne CRLF brauchen bei TCP ~60 ms und bei WinHttp ~280 ms
Mit CRLF bei TCP ~260ms und bei WinHttp ~520 ms
das liegt darann, das du immer neue anfragen startest, anstatt alles aus einer abzulesen.

letztendlich sollte man das ganze aber immer über post anfragen lösen, da der content dort beliebig lang sein kann. get requests sind aufgrund der url begrenzung stark beschränkt.

schau dir das ergebnis einer mehrzeiligen anfrage bei google doch mal genau an. letzlich brauchst du das ergebnis dann nur nach deinen wünschen zu parsen.

btw deine tcp anfrage wird nach aktuellem code nur selten funktionieren, da du nicht prüfst, ob die antwort vollständig ist, sondern nur ob eine antwort vorliegt.
der tcp stack baut sich je nach verfügbarer banddbreite sehr schnell, oder aber auch sehr langsam auf. es sollte deshalb überprüft werden, ob die rückgabe vollständig ist, bevor sie bearbeitet wird.

die geschwindigkeit ist am ende übrigens egal, da ohnehin alles im hintergrund abläuft.