251

Re: AHK: Переводчик онлайн

IE7 не заходит.

252

Re: AHK: Переводчик онлайн

В этом и проблема. Скрипт работает, используя те же компоненты, что и IE. Вроде бы, это можно обойти вот так:

Malcev пишет:

А у кого нету IE или Chrome - прилагать jscript9.dll.

Но я в этом не очень разбираюсь, может, Malcev подскажет, как там что.

DD пишет:

teadrinker, не подскажешь, чем значки упаковывались в текст скрипта? Помню, был код на официальном форуме, сейчас не могу найти.

Если нужен упаковщик, создавай тему, а то тут не в тему.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

253

Re: AHK: Переводчик онлайн

Думаю, в данном случае это не поможет.
Так-как тут пишут:

Для начала должен разочаровать пользователей Windows XP и ниже. Несмотря на то, что Microsoft аргументирует невозможность запуска IE9 под Windows XP тем, что там отсутствует поддержка Direct2D, движок IE9, которому на Direct2D грубо говоря «наплевать», под Windows XP работать все равно не будет. Быть может и возможно откомпилировать движок под Windows XP, но нам доступны только версии движка, которые будут работать лишь в Windows Vista и Windows 7.

https://habrahabr.ru/post/110617/

254

Re: AHK: Переводчик онлайн

Как задействовать вариант без окон программы, где в переменной можно указывать текст и получать перевод в другую переменную? Код почему-то выводит пустые MsgBox.

255

Re: AHK: Переводчик онлайн

MsgBox, % GoogleTranslate("test")

GoogleTranslate(str, from := "", to := "")  {
   JSON := new JSON
   JS := JSON.JS, JS.( GetJScript() )
   
   if (from = "")
      from := RegExMatch(str, "[а-яёА-ЯЁ]") ? "ru" : "auto"
   if (to = "")
      to := from = "ru" ? "en" : "ru"
   
   sJson := SendRequest(JS, str, to, from)
   oJSON := JSON.Parse(sJson)

   if !IsObject(oJSON[2])  {
      for k, v in oJSON[1]
         trans .= v[1]
   }
   else  {
      MainTransText := oJSON[1, 1, 1]
      for k, v in oJSON[2]  {
         trans .= "`n+"
         for i, txt in v[2]
            trans .= (MainTransText = txt ? "" : "`n" . txt)
      }
   }
   if !IsObject(oJSON[2])
      MainTransText := trans := Trim(trans, ",+`n ")
   else
      trans := MainTransText . "`n+`n" . Trim(trans, ",+`n ")

   from := oJSON[3]
   trans := Trim(trans, ",+`n ")
   Return trans
}

SendRequest(JS, str, tl, sl)  {
   ComObjError(false)
   url := "https://translate.google.com/translate_a/single?client=t&sl="
        . sl . "&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=" . JS.("tk").(str)
   body := "q=" . URIEncode(str)
   contentType := "application/x-www-form-urlencoded;charset=utf-8"
   userAgent := "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
   Return JSON.GetFromUrl(url, body, contentType, userAgent)
}

URIEncode(str, encoding := "UTF-8")  {
   VarSetCapacity(var, StrPut(str, encoding))
   StrPut(str, &var, encoding)

   While code := NumGet(Var, A_Index - 1, "UChar")  {
      bool := (code > 0x7F || code < 0x30 || code = 0x3D)
      UrlStr .= bool ? "%" . Format("{:02X}", code) : Chr(code)
   }
   Return UrlStr
}

GetJScript()
{
   script =
   (
      var TKK = ((function() {
        var a = 561666268;
        var b = 1526272306;
        return 406398 + '.' + (a + b);
      })());

      function b(a, b) {
        for (var d = 0; d < b.length - 2; d += 3) {
            var c = b.charAt(d + 2),
                c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
                c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
            a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
        }
        return a
      }

      function tk(a) {
          for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
              var c = a.charCodeAt(f);
              128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ?
              (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240,
              g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
          }
          a = h;
          for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
          a = b(a, "+-3^+b+-f");
          a ^= Number(e[1]) || 0;
          0 > a && (a = (a & 2147483647) + 2147483648);
          a `%= 1E6;
          return a.toString() + "." + (a ^ h)
      }
   )
   Return script
}

class JSON
{
   static JS := JSON._GetJScripObject()
   
   Parse(JsonString)  {
      try oJSON := this.JS.("(" JsonString ")")
      catch  {
         MsgBox, Wrong JsonString!
         Return
      }
      Return this._CreateObject(oJSON)
   }
   
   GetFromUrl(url, body := "", contentType := "", userAgent := "")  {
      XmlHttp := ComObjCreate("Microsoft.XmlHttp")
      XmlHttp.Open("GET", url, false)
      ( contentType && XmlHttp.SetRequestHeader("Content-Type", contentType) )
      ( userAgent && XmlHttp.SetRequestHeader("User-Agent", userAgent) )
      XmlHttp.Send(body)
      Return XmlHttp.ResponseText
   }

   _GetJScripObject()  {
      VarSetCapacity(tmpFile, (MAX_PATH := 260) << !!A_IsUnicode, 0)
      DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
      
      FileAppend,
      (
      <component>
      <public><method name='eval'/></public>
      <script language='JScript'></script>
      </component>
      ), % tmpFile
      
      JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
      FileDelete, % tmpFile
      JSON._AddMethods(JS)
      Return JS
   }

   _AddMethods(ByRef JS)  {
      JScript =
      (
         Object.prototype.GetKeys = function () {
            var keys = []
            for (var k in this)
               if (this.hasOwnProperty(k))
                  keys.push(k)
            return keys
         }
         Object.prototype.IsArray = function () {
            var toStandardString = {}.toString
            return toStandardString.call(this) == '[object Array]'
         }
      )
      JS.("delete ActiveXObject; delete GetObject;")
      JS.(JScript)
   }

   _CreateObject(ObjJS)  {
      res := ObjJS.IsArray()
      if (res = "")
         Return ObjJS
      
      else if (res = -1)  {
         obj := []
         Loop % ObjJS.length
            obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
      }
      else if (res = 0)  {
         obj := {}
         keys := ObjJS.GetKeys()
         Loop % keys.length
            k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
      }
      Return obj
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

256 (изменено: DD, 2018-05-18 15:01:16)

Re: AHK: Переводчик онлайн

teadrinker, спасибо! Не будет ли настройки в программе для обхода ограничения на размеры запроса в 5000 символов? Чтобы в случае, когда текст больше допустимого — он разбивался по 5000 в местах окончаний фраз и после перевода, объединялся бы? Не было ли такой возможности в предыдущих версиях?

257

Re: AHK: Переводчик онлайн

В полной версии есть, в этой не делал, может потом руки дойдут.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

258 (изменено: DD, 2018-05-19 06:03:09)

Re: AHK: Переводчик онлайн

Вот так вроде можно переводить большие тексты частями —

if StrLen(SourseText) > 4900
{
   StartPos := 1
   While StartPos := RegExMatch(SourseText, "(.{1,4899}([\.\n\?\!:;, ]|$))|(.{1,4900})", Found, StartPos) + StrLen(Found)
   {
      Sleep, 1000
      TransText := GoogleTranslate(Found1)
      All .= TransText
   }
}
MsgBox, %All%

259

Re: AHK: Переводчик онлайн

Ну, так я бы не стал, слова будут на части разрываться. Разбивать нужно по точкам, или другим знакам препинания.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

260 (изменено: DD, 2018-05-18 23:49:52)

Re: AHK: Переводчик онлайн

Теперь норм?

261

Re: AHK: Переводчик онлайн

Нет, точки или другого ожидаемого знака может просто не оказаться в нужном участке текста.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

262 (изменено: DD, 2018-05-19 06:07:00)

Re: AHK: Переводчик онлайн

А сейчас?) Есть ли возможность расширить диапазон, в котором будут искаться стоп-символы?

263

Re: AHK: Переводчик онлайн

Ещё так: если текст больше 5000 — берётся определенное количество символов с запасом (напр. 4500) и далее дополнительно захватывается текст до ближайших \. \n \? \! : ; , $


Str = 
(
^journalist COLUMNS Released  accuses own lawyers of political show    
COLUMNS Political stalem ate123456789 injjkk Europe    
Frankly, had Masoud Barzani foreseen the course of developments in the recent period, he definitely would have given up the idea of holding an independence referendum. With the public's pressure and expectations regarding the referendum, Barzani went to the polls to prove his leadership. • Yet, what happened over the past 10 days jeopardized his position in the Kurdistan region, let alone consolidating his leadership. But how did the developments end up here? How did Barzani make such wrong calculations what did he depend on? And most importantly, what is awaiting the Iraqi Kurdistan Regional Government (KRG) from now on?
While aspiring to make Kirkuk the capital city of Kurdistan$
)
StartPos := 1
While StartPos := RegExMatch(Str, "(.{1,9}.*?([\.\n\?\!:;,]|$))", Found, StartPos) + StrLen(Found)
   MsgBox, %Found1%

264

Re: AHK: Переводчик онлайн

А как можно завершить этот скрипт (выйти из программы) из другого скрипта AutoHotkey?

265

Re: AHK: Переводчик онлайн

Любой скрипт можно завершить извне, если знать название его файла.

scriptName := "GoogleTranslator.ahk"  ; здесь указать точное имя файла скрипта
CloseScript(scriptName)           ; корректное завершение скрипта
; CloseScript(scriptName, true)   ; некоректное завершение скрипта, в трее останется иконка

CloseScript(scriptName, kill := false)  {
   static WM_COMMAND := 0x111, ID_FILE_TERMINATESCRIPT := 65405
   
   dhw_prev := A_DetectHiddenWindows
   tmm_prev := A_TitleMatchMode
   
   DetectHiddenWindows, On
   SetTitleMatchMode, 2
   WinExist(scriptName)
   if !kill
      PostMessage, WM_COMMAND, ID_FILE_TERMINATESCRIPT
   else  {
      WinGet, PID, PID
      Process, Close, % PID
   }
   DetectHiddenWindows, % dhw_prev
   SetTitleMatchMode, % tmm_prev
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

266

Re: AHK: Переводчик онлайн

teadrinker
Спасибо. Все прекрасно работает.

267

Re: AHK: Переводчик онлайн

teadrinker
Сделал так (чтобы запускать и закрывать одной мультимедийной кнопкой):

sc166::
scriptName := "D:\Prg-for\AutoHotkey\GoogleTranslator.ahk"
DetectHiddenWindows, On
If WinExist(scriptName)
Run, c:\Program Files (x86)\AutoHotkey\AutoHotkeyA32.exe d:\Prg\Prg-for\AutoHotkey\GoogleTranslator_OFF.ahk
Else
Run, c:\Program Files (x86)\AutoHotkey\AutoHotkeyA32.exe d:\Prg\Prg-for\AutoHotkey\GoogleTranslator.ahk
Return

Примитивно, конечно, но работает. А как сделать "по-фэншую", чтобы вписать сюда ваш код, а не запускать его отдельным скриптом, - не соображу.
Может подскажете?

268

Re: AHK: Переводчик онлайн

По фэншую так:

DetectHiddenWindows, On
scriptPath := "D:\Prg-for\AutoHotkey\GoogleTranslator.ahk"
Return

sc166::
If WinExist(scriptPath)
   CloseScript(scriptPath)
Else
   Run, % scriptPath
Return

CloseScript(scriptName, kill := false)  {
   static WM_COMMAND := 0x111, ID_FILE_TERMINATESCRIPT := 65405
   
   dhw_prev := A_DetectHiddenWindows
   tmm_prev := A_TitleMatchMode
   
   DetectHiddenWindows, On
   SetTitleMatchMode, 2
   WinExist(scriptName)
   if !kill
      PostMessage, WM_COMMAND, ID_FILE_TERMINATESCRIPT
   else  {
      WinGet, PID, PID
      Process, Close, % PID
   }
   DetectHiddenWindows, % dhw_prev
   SetTitleMatchMode, % tmm_prev
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

269

Re: AHK: Переводчик онлайн

teadrinker
Сразу скрипт не захотел работать. Вкралась опечатка. В первом скрипте использовалась переменная "scriptName", а во втором - "scriptPath", а далее используется прежняя переменная. Я, конечно исправил, но скрипт не захотел работать. Наш GoogleTranslator после запуска не закрывается. Вернее закрывается  и тут же запускается снова. Решилась проблема перемещением двух первых трочек кода ниже строки с кодом клавиши. Рабочий вариант получился таким:

; Надеюсь ничего тут не намудрил
sc166::
DetectHiddenWindows, On
scriptName := "D:\Prg-for\AutoHotkey\GoogleTranslator.ahk"
If WinExist(scriptName)
   CloseScript(scriptName) 
Else
; Прописал "AutoHotkeyA32.exe", так как расширение ".ahk" я в системе на зарегистрировал - предпочитаю Portable-программы.
Run, AutoHotkeyA32.exe %scriptName% SetWorkingDir, %A_ScriptDir%
Return

CloseScript(scriptName, kill := false)  
{
   static WM_COMMAND := 0x111, ID_FILE_TERMINATESCRIPT := 65405
   
   dhw_prev := A_DetectHiddenWindows
   tmm_prev := A_TitleMatchMode
   
;    DetectHiddenWindows, On	здесь отключил строку - второй раз, наверное, лишний
   SetTitleMatchMode, 2
   WinExist(scriptName)
   if !kill
      PostMessage, WM_COMMAND, ID_FILE_TERMINATESCRIPT
   else  
	{
      WinGet, PID, PID
      Process, Close, % PID
	}
   DetectHiddenWindows, % dhw_prev
   SetTitleMatchMode, % tmm_prev
}

Теперь все работает. Большое спасибо за помощь.

270

Re: AHK: Переводчик онлайн

Никаких ошибок в моём варианте нет, все переменные названы правильно, я проверял скрипт перед отправкой, подставив свой путь к файлу. Единственное, что вам нужно было изменить, это прописать в строчке запуска скрипта свой путь к exe, если расширение ahk не зарегистрировано, остальные изменения бессмысленны.
А здесь

Run, AutoHotkeyA32.exe %scriptName% SetWorkingDir, %A_ScriptDir%

ошибка, в одной строчке нельзя писать две команды.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg