#AutoIt3Wrapper_Outfile=GoogleTranslator.exe
#AutoIt3Wrapper_Icon=GoogleTranslator.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Comment=
#AutoIt3Wrapper_Res_Description=GoogleTranslator.exe
#AutoIt3Wrapper_Res_Fileversion=0.1.0.0
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n
#AutoIt3Wrapper_Res_LegalCopyright=AZJIO
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Run_Au3check=n
; параллельная разработка AZJIO, ViSiToR, и UDF от Stephen Podhajecki
; ресайз, хоткей поддерживаются, автофокус поля Edit
#include "Encoding.au3"
#include <ComboConstants.au3>
#NoTrayIcon
Opt("GUIResizeMode", 0x0322)
GUIRegisterMsg(0x0214 , "WM_SIZING")
GUIRegisterMsg(0x0024, "WM_GETMINMAXINFO")
$GUI = GUICreate("Google - переводчик", 420, 420, -1, -1, 0x00040000+0x00020000)
If Not @compiled Then GUISetIcon('GoogleTranslator.ico', 0)
$StatusBar = GUICtrlCreateLabel("", 5, 390-20, 410-100, 17)
GUICtrlSetFont(-1, 10, 800)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetResizing(-1, 512 + 256 + 2)
GUICtrlCreateLabel("Выберите язык исходного текста:", 10, 12)
GUICtrlSetResizing(-1, 512 + 256 + 32 + 4)
$Lang_Combo1 = GUICtrlCreateCombo("", 190, 10, 200, 50, BitOr($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
GUICtrlSetResizing(-1, 512 + 256 + 32 + 4)
GUICtrlCreateLabel("Выберите язык перевода:", 10, 37)
GUICtrlSetResizing(-1, 512 + 256 + 32 + 4)
$Lang_Combo2 = GUICtrlCreateCombo("", 190, 35, 200, 50, BitOr($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
GUICtrlSetResizing(-1, 512 + 256 + 32 + 4)
_SetCombo()
$nRe = GUICtrlCreateButton("^v", 395, 10, 20, 48)
GUICtrlSetResizing(-1, 512 + 256 + 32 + 4)
GUICtrlSetTip(-1, 'Инвертировать направление перевода.')
$nInv = GUICtrlCreateButton("^", 315, 210, 20, 20)
GUICtrlSetResizing(-1, 512 + 256 + 4)
GUICtrlSetTip(-1, 'Переместить текст, иногда'&@CRLF&'полезно не zh>ru, а zh>en>ru.'&@CRLF&'Ctrl+Стрелка вниз')
$Test = GUICtrlCreateButton("Проверка", 340, 210, 70, 20)
GUICtrlSetResizing(-1, 512 + 256 + 4)
GUICtrlSetTip(-1, 'Проверка обратным'&@CRLF&'переводом текста.'&@CRLF&'Ctrl+Стрелка вверх')
$Clr = GUICtrlCreateButton("Очистить", 145, 60, 70, 20)
GUICtrlSetResizing(-1, 512 + 256 + 32 + 4)
GUICtrlSetTip(-1, 'Ctrl+Delete')
$Translate1 = GUICtrlCreateButton("Очистить > Вставить > Перевести", 220, 60, 190, 20)
GUICtrlSetResizing(-1, 512 + 256 + 32 + 4)
GUICtrlSetTip(-1, 'Ctrl+Enter')
GUICtrlCreateLabel("Исходный текст:", 10, 64, -1, 17)
$Edit1 = GUICtrlCreateEdit('', 10, 80, 400, 130, 0x0004+0x0040+0x1000+0x00200000)
GUICtrlSetResizing(-1, 7 + 32)
GUICtrlSetData(-1, 'Переводчик имеет ограничение по количеству символов: 350-376.'&@CRLF&'Есть возможность выполнить обратный перевод для проверки качества.') ; закомментировать эту строку, она для теста
GUICtrlSetState(-1, 256)
$L2=GUICtrlCreateLabel("Результат перевода:", 10, 214, -1, 17)
$Edit2 = GUICtrlCreateEdit("", 10, 230, 400, 130, 0x0004+0x0040+0x1000+0x00200000)
GUICtrlSetResizing(-1, 7 + 64)
; GUICtrlSetFont (-1,-1, -1, -1, 'Arial')
$Translate = GUICtrlCreateButton("Перевести", 340, 360, 70, 25)
GUICtrlSetResizing(-1, 512 + 256 + 64 + 4)
GUICtrlSetTip(-1, 'Ctrl+Enter')
Dim $AccelKeys[4][2] = [["^{Enter}", $Translate],["^{UP}", $Test],["^{DEL}", $Clr],["^{DOWN}", $nInv]]
GUISetAccelerators($AccelKeys)
GUISetState()
Send('^+{HOME}')
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $Clr
GUICtrlSetData($Edit1, '')
GUICtrlSetState($Edit1, 256)
Case $nRe
$Lang_Combo01=GUICtrlRead($Lang_Combo1)
$Lang_Combo02=GUICtrlRead($Lang_Combo2)
GUICtrlSetData($Lang_Combo1, $Lang_Combo02)
GUICtrlSetData($Lang_Combo2, $Lang_Combo01)
Case $Test
If GUICtrlRead($Test)='Проверка' Then
$Text = GUICtrlRead($Edit2)
$Lang1 = StringRegExpReplace(GUICtrlRead($Lang_Combo2), " - .*$", '')
$Lang2 = StringRegExpReplace(GUICtrlRead($Lang_Combo1), " - .*$", '')
If $Text = '' Then
MsgBox(0, 'Message', 'Нечего переводить.')
ContinueLoop
EndIf
If $Lang1 = $Lang2 Then
MsgBox(0, 'Сообщение', 'Укажите разные направления перевода.')
ContinueLoop
EndIf
GUICtrlSetBkColor($Edit2, 0xffd7d7)
GUICtrlSetState($Translate, 128)
GUICtrlSetState($Test, 128)
GUICtrlSetData($StatusBar, "Пожалуйста подождите...")
$Result = _GoogleTranslateString($Text, $Lang1 & "|" & $Lang2, True)
GUICtrlSetData($Edit2, $Result)
GUICtrlSetState($Translate, 64)
GUICtrlSetState($Test, 64)
GUICtrlSetData($StatusBar, "Готово")
GUICtrlSetData($Test, 'Отмена')
GUICtrlSetBkColor($Edit2, 0xffffff)
Else
GUICtrlSetData($Edit2, $Text)
GUICtrlSetData($Test, 'Проверка')
EndIf
Case $nInv
GUICtrlSetData($Edit1, GUICtrlRead($Edit2))
Case $Translate1
GUICtrlSetData($Edit1, '')
GUICtrlSetState($Edit1, 256)
Send('+{INS}')
Sleep(100)
ContinueCase
Case $Translate
$Text = GUICtrlRead($Edit1)
$Lang1 = StringRegExpReplace(GUICtrlRead($Lang_Combo1), " - .*$", '')
$Lang2 = StringRegExpReplace(GUICtrlRead($Lang_Combo2), " - .*$", '')
If $Text = '' Then
MsgBox(0, 'Message', 'Нечего переводить.')
ContinueLoop
EndIf
If $Lang1 = $Lang2 Then
MsgBox(0, 'Сообщение', 'Укажите разные направления перевода.')
ContinueLoop
EndIf
$kolSim =StringLen($text)
If $kolSim>376 And MsgBox(4, 'Сообщение', 'Превышено максимальное количество символов, обрезать?'&@CRLF&'Допустимо 350-376 (текущее: ' & $kolSim & ')')=6 Then $text=StringMid($text, 1, 376)
GUICtrlSetBkColor($Edit2, 0xffd7d7)
GUICtrlSetState($Translate, 128)
GUICtrlSetState($Test, 128)
GUICtrlSetData($StatusBar, "Пожалуйста подождите...")
$Result = _GoogleTranslateString($Text, $Lang1 & "|" & $Lang2, True)
GUICtrlSetData($Edit2, $Result)
GUICtrlSetState($Translate, 64)
GUICtrlSetState($Test, 64)
GUICtrlSetData($Test, 'Проверка')
GUICtrlSetData($StatusBar, "Готово")
GUICtrlSetBkColor($Edit2, 0xffffff)
If GUICtrlRead($Edit2)='' Then
$Ping=Ping('translate.google.ru', 250)
If $Ping Then
MsgBox(0, 'Сообщение', 'Интернет доступен, возможно количество'&@CRLF&'символов близко к максимальному (350-376)')
Else
MsgBox(0, 'Сообщение', 'Отсутствует доступ к интернету')
EndIf
EndIf
EndSwitch
WEnd
Func _SetCombo()
Local $vTest = InetRead('http://translate.google.ru/?q=#ru|en|')
If @error Then MsgBox(0, 'Сообщение', 'Возможно интернет отключен')
$vTest = BinaryToString($vTest)
; $vTest=StringRegExp($vTest, '(—</option><option value="az.*?</select></div>)', 3)
$vTest=StringRegExp($vTest, '(<option value=az.*?</select></div>)', 3)
If UBound($vTest)<2 Then
$vTest=$vTest[0]
Else
$vTest=$vTest[1]
EndIf
If StringInStr($vTest, 'value=en>БОЗМЙКУЛЙК<') Then $vTest= _Encoding_KOI8To1251($vTest)
$vTest=StringRegExp($vTest, 'value=(.*?)>(.*?)</option>', 3)
Local $lng = ""
For $i = 0 To UBound($vTest)-1 Step 2
$lng &= $vTest[$i] & " - " & StringUpper(StringLeft($vTest[$i+1], 1)) & StringTrimLeft($vTest[$i+1], 1) & "|"
Next
$vTest = ""
$lng=StringTrimRight($lng, 1)
GUICtrlSetData($Lang_Combo1, 'auto - Определить язык|'&$lng, "en - Английский")
GUICtrlSetData($Lang_Combo2, $lng, "ru - Русский")
EndFunc
Func WM_SIZING()
$aStart = ControlGetPos($GUI, "", $Translate)
$aEdit = ControlGetPos($GUI, "", $Edit1)
$h=($aStart[1] -80)/2-10
$w=$aStart[0]+60
GUICtrlSetPos($Edit1, 10, 80, $w, $h)
GUICtrlSetPos($Edit2, 10, 80+$h+20, $w, $h)
GUICtrlSetPos($L2, 10, 80+$h+4)
GUICtrlSetPos($nInv, $aEdit[2]-85, 80+$h+1)
GUICtrlSetPos($Test, $aEdit[2]-60, 80+$h+1)
EndFunc
Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $wParam
If $hWnd = $GUI Then
Local $tMINMAXINFO = DllStructCreate("int;int;" & _
"int MaxSizeX; int MaxSizeY;" & _
"int MaxPositionX;int MaxPositionY;" & _
"int MinTrackSizeX; int MinTrackSizeY;" & _
"int MaxTrackSizeX; int MaxTrackSizeY", _
$lParam)
DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 420) ; минимальные размеры окна
DllStructSetData($tMINMAXINFO, "MinTrackSizeY", 420)
EndIf
EndFunc
Func _GoogleTranslateString($sText, $sLangPair = -1, $bEncodeURL = False)
If $sLangPair = -1 Then $sLangPair = "auto|en"
If $bEncodeURL Then $sText = _Encoding_URLToHex($sText)
$sResult = BinaryToString(InetRead('http://google.ru/translate_t?langpair=' & $sLangPair & '&text=' & $sText))
If StringRight($sLangPair, 2) = "ru" Or StringRight($sLangPair, 4) = "auto" Then $sResult = _Encoding_KOI8To1251($sResult)
$aResult = StringRegExp($sResult, '(?si)(?:onmouseout=".*?>)(.*?)(?=</SPAN>)', 3)
$sResult = ''
For $i = 0 To UBound($aResult)-1
$sResult &= $aResult[$i]
Next
$sResult = StringReplace($sResult, '
', @CRLF)
If _Encoding_IsUTF8Format($sResult) Then $sResult = _Encoding_UTF8ToANSI($sResult)
If $bEncodeURL Then $sResult = _URLDecode($sResult)
Return $sResult
EndFunc
; #FUNCTION# ==============================================
; Description ...: Decodeds text for use in URLs
; Parameters ....: $sURL - IN - The text to decode
; Return values .: The decoded text
; Author ........: Stephen Podhajecki {gehossafats at netmdc. com}
; Remarks .......: Replaces escaped hex values for url encoding with ascII characters.
; Decoding based on information provided here: http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
; Related .......: _URLEncode
; =========================================================
Func _URLDecode($sURL)
Local $aEncodable[13] = ['"',"'","<",">","\","^","[","]","`","+","$",",","#"]
;decode non-printable and space
Local $sTemp = $sURL
For $x = 0 To 32
$sTemp = StringReplace($sTemp,"%"&Hex($x,2),Chr($x))
Next
;decode "unsafe"
For $x = 0 To UBound($aEncodable)-1
$sTemp = StringReplace($sTemp,"%"&Hex(Asc($aEncodable[$x]),2),$aEncodable[$x])
Next
;decode upper ascii and {}|~_
For $x = 123 To 255
$sTemp = StringReplace($sTemp,"%"&Hex($x,2),Chr($x))
Next
;decode % last
$sTemp = StringReplace($sTemp,"%25","%")
$sTemp = _ConvertEntities($sTemp)
Return $sTemp
EndFunc
; #FUNCTION# =====================================================================================================================
; Description ...: _ConvertEntities
; Parameters ....: $sURL - IN - The Text to convert
; Return values .: Success - Converted string
; Author ........: Stephen Podhajecki {gehossafats at netmdc. com}
; Remarks .......: Replaces HTML escape sequences with character representation
; Based on information found here: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php
; nbsp is changed to 32 instead of 160
; Related .......:
; ================================================================================================================================
Func _ConvertEntities($sURL)
Local $sTemp = $sUrl
Local $aEntities[96][2]=[[""",34],["&",38],["<",60],[">",62],[" ",3],[" ",32] _
,["¡",161],["¢",162],["£",163],["¤",164],["¥",165],["¦",166] _
,["§",167],["¨",168],["©",169],["ª",170],["¬",172],["­",173] _
,["®",174],["¯",175],["°",176],["±",177],["²",178],["³",179] _
,["´",180],["µ",181],["¶",182],["·",183],["¸",184],["¹",185] _
,["º",186],["»",187],["¼",188],["½",189],["¾",190],["¿",191] _
,["À",192],["Á",193],["Ã",195],["Ä",196],["Å",197],["Æ",198] _
,["Ç",199],["È",200],["É",201],["Ê",202],["Ì",204],["Í",205] _
,["Î",206],["Ï",207],["Ð",208],["Ñ",209],["Ò",210],["Ó",211] _
,["Ô",212],["Õ",213],["Ö",214],["×",215],["Ø",216],["Ù",217] _
,["Ú",218],["Û",219],["Ü",220],["Ý",221],["Þ",222],["ß",223] _
,["à",224],["á",225],["â",226],["ã",227],["ä",228],["å",229] _
,["æ",230],["ç",231],["è",232],["é",233],["ê",234],["ë",235] _
,["ì",236],["í",237],["î",238],["ï",239],["ð",240],["ñ",241] _
,["ò",242],["ó",243],["ô",244],["õ",245],["ö",246],["÷",247] _
,["ø",248],["ù",249],["ú",250],["û",251],["ü",252],["þ",254]]
For $x = 0 To Ubound($aEntities)-1
$sTemp = StringReplace($sTemp,$aEntities[$x][0],Chr($aEntities[$x][1]))
Next
For $x = 32 To 255
$sTemp = StringReplace($sTemp,"&#"&$x&";",chr($x))
Next
For $x = 256 To 10000
$sTemp = StringReplace($sTemp,"&#"&$x&";",chrw($x))
Next
Return $sTemp
EndFunc