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
+ DD

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%