1 (изменено: pussy, 2017-11-27 15:42:05)

Тема: AHK: Автоматизация google translate

коллеженьки, добрый день.
Захотела автоматизировать свою работу, сама я технарь, но иногда руководство просит перевести документацию.
Собственно можно ли как-то автоматизировать этот процесс? я сейчас сделала только контролцэ контролвэ, уже помогло где-то в два раза время уменьшить
Собственно задача бывает прилетает от руководства перевести текст, сам текст загружается на сайты типа memsource.com Там весь документ разбивается на предложения, и заливается в таблицу. Я тупо копирую английский текст из ячейки этой таблицы, вставляю в гугл транслейт, потом копирую из ячейки гугл транслейт перевод и вставляю обратно в memsource в ячейку перевода.
И так повторяю 100500 раз.
Собственно как автоматизировать такую тему?
Каждая ячейка начинается с номера, то есть в таблице три колонки, номер предложения - оригинал - перевод.
Подскажите куда копать? может можно задать запрос в гугл транслейт, без браузера? или полностью автоматизировать этот процесс? я пробовала автоматизировать по расположению курсора, но проблема в том, что это браузерный редактор, и если курсор сбивается, то копируется вся страница целиком и начинается свистопляска.

Буду рад за любую помощь, если есть коммерческие предложения, то пишите в ЛС

2 (изменено: teadrinker, 2017-11-27 17:49:14)

Re: AHK: Автоматизация google translate

Добрый день, pussy. Функцию перевода текста через Google Translate вы можете найти в скрипте из этого топика (последний вариант). Примеров по чтения/вставки текста в элемент на странице на форуме тоже достаточно, чтобы дать более конкретный совет, нужно знать устройство страницы.

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

3 (изменено: pussy, 2017-11-27 18:25:03)

Re: AHK: Автоматизация google translate

teadrinker
Привет!
Я попробовала пользоваться твоим скриптом, можешь подсказать, как сделать, чтобы перевод сразу копировался в буфер?
сейчас объясню, что я хочу.
я хочу чтобы перевод предложения копировался сразу в буфер, и мне не показывались никакие всплывающие окна
Буквально, если я открою страницу translate.google.com то там два окна, у меня выставлено направление перевода en->ru
В окно en я ctrl-v исходный текст, потом кликаю на окне слева и ctrl-c перевод, и переключаюсь на memsource.com и там вставляю текст в ячейку перевода, и потом уже редактирую, НО обычно все сходится и так, хвала гуглу.

Вот можно мне не показывать всплывающие окна, а сразу по моему ctrl-c(либо другому сочетанию) переводить и вставлять в буфер обмена перевод?

Сейчас у меня что-то типа того

Tab:: Send, ^a^c
Capslock:: Send, ^a^v

4 (изменено: teadrinker, 2019-12-27 06:15:13)

Re: AHK: Автоматизация google translate

В виде функции:

MsgBox, % GoogleTranslate("Hello, World!")

GoogleTranslate(str, from := "", to := "")  {
   if (from = "")
      from := RegExMatch(str, "[а-яёА-ЯЁ]") ? "ru" : "auto"
   if (to = "")
      to := from = "ru" ? "en" : "ru"
   
   json := SendRequest(str, to, from, proxy:="")
   JS := new ActiveScript("JScript")
   JS.eval("delete ActiveXObject; delete GetObject;")
   oJSON := JS.eval("(" . JSON . ")")

   if !IsObject(oJSON[1])
      Loop % oJSON[0].length
         trans .= oJSON[0][A_Index - 1][0]
   else  {
      MainTransText := oJSON[0][0][0]
      Loop % oJSON[1].length  {
         trans .= "`n+"
         obj := oJSON[1][A_Index-1][1]
         Loop % obj.length  {
            txt := obj[A_Index - 1]
            trans .= (MainTransText = txt ? "" : "`n" txt)
         }
      }
   }
   if !IsObject(oJSON[1])
      MainTransText := trans := Trim(trans, ",+`n ")
   else
      trans := MainTransText . "`n+`n" . Trim(trans, ",+`n ")

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

SendRequest(str, tl, sl, proxy) {
   ComObjError(false)
   http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
   ( proxy && http.SetProxy(2, proxy) )
   http.open( "POST", "https://translate.google.com/translate_a/single?client=webapp&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=0&ssel=0&tsel=0&pc=1&kc=1"
      . "&tk=" . TK(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=" . URIEncode(str))
   http.WaitForResponse(-1)
   Return http.responsetext
}

TK(string)  {
   js := new ActiveScript("JScript")
   js.Exec(GetJScript())
   Return js.tk(string)
}

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 ActiveScript extends ActiveScript._base
{
    __New(Language)
    {
        if this._script := ComObjCreate(Language, ActiveScript.IID)
            this._scriptParse := ComObjQuery(this._script, ActiveScript.IID_Parse)
        if !this._scriptParse
            throw Exception("Invalid language", -1, Language)
        this._site := new ActiveScriptSite(this)
        this._SetScriptSite(this._site.ptr)
        this._InitNew()
        this._objects := {}
        this.Error := ""
        this._dsp := this._GetScriptDispatch()  ; Must be done last.
        try
            if this.ScriptEngine() = "JScript"
                this.SetJScript58()
    }

    SetJScript58()
    {
        static IID_IActiveScriptProperty := "{4954E0D0-FBC7-11D1-8410-006008C3FBFC}"
        if !prop := ComObjQuery(this._script, IID_IActiveScriptProperty)
            return false
        VarSetCapacity(var, 24, 0), NumPut(2, NumPut(3, var, "short") + 6)
        hr := DllCall(NumGet(NumGet(prop+0)+4*A_PtrSize), "ptr", prop, "uint", 0x4000
            , "ptr", 0, "ptr", &var), ObjRelease(prop)
        return hr >= 0
    }

    Eval(Code)
    {
        pvar := NumGet(ComObjValue(arr:=ComObjArray(0xC,1)) + 8+A_PtrSize)
        this._ParseScriptText(Code, 0x20, pvar)  ; SCRIPTTEXT_ISEXPRESSION := 0x20
        return arr[0]
    }

    Exec(Code)
    {
        this._ParseScriptText(Code, 0x42, 0)  ; SCRIPTTEXT_ISVISIBLE := 2, SCRIPTTEXT_ISPERSISTENT := 0x40
        this._SetScriptState(2)  ; SCRIPTSTATE_CONNECTED := 2
    }

    AddObject(Name, DispObj, AddMembers := false)
    {
        static a, supports_dispatch ; Test for built-in IDispatch support.
            := a := ((a:=ComObjArray(0xC,1))[0]:=[42]) && a[0][1]=42
        if IsObject(DispObj) && !(supports_dispatch || ComObjType(DispObj))
            throw Exception("Adding a non-COM object requires AutoHotkey v1.1.17+", -1)
        this._objects[Name] := DispObj
        this._AddNamedItem(Name, AddMembers ? 8 : 2)  ; SCRIPTITEM_ISVISIBLE := 2, SCRIPTITEM_GLOBALMEMBERS := 8
    }

    _GetObjectUnk(Name)
    {
        return !IsObject(dsp := this._objects[Name]) ? dsp  ; Pointer
            : ComObjValue(dsp) ? ComObjValue(dsp)  ; ComObject
            : &dsp  ; AutoHotkey object
    }

    class _base
    {
        __Call(Method, Params*)
        {
            if ObjHasKey(this, "_dsp")
                try
                    return (this._dsp)[Method](Params*)
                catch e
                    throw Exception(e.Message, -1, e.Extra)
        }

        __Get(Property, Params*)
        {
            if ObjHasKey(this, "_dsp")
                try
                    return (this._dsp)[Property, Params*]
                catch e
                    throw Exception(e.Message, -1, e.Extra)
        }

        __Set(Property, Params*)
        {
            if ObjHasKey(this, "_dsp")
            {
                Value := Params.Pop()
                try
                    return (this._dsp)[Property, Params*] := Value
                catch e
                    throw Exception(e.Message, -1, e.Extra)
            }
        }
    }

    _SetScriptSite(Site)
    {
        hr := DllCall(NumGet(NumGet((p:=this._script)+0)+3*A_PtrSize), "ptr", p, "ptr", Site)
        if (hr < 0)
            this._HRFail(hr, "IActiveScript::SetScriptSite")
    }

    _SetScriptState(State)
    {
        hr := DllCall(NumGet(NumGet((p:=this._script)+0)+5*A_PtrSize), "ptr", p, "int", State)
        if (hr < 0)
            this._HRFail(hr, "IActiveScript::SetScriptState")
    }

    _AddNamedItem(Name, Flags)
    {
        hr := DllCall(NumGet(NumGet((p:=this._script)+0)+8*A_PtrSize), "ptr", p, "wstr", Name, "uint", Flags)
        if (hr < 0)
            this._HRFail(hr, "IActiveScript::AddNamedItem")
    }

    _GetScriptDispatch()
    {
        hr := DllCall(NumGet(NumGet((p:=this._script)+0)+10*A_PtrSize), "ptr", p, "ptr", 0, "ptr*", pdsp)
        if (hr < 0)
            this._HRFail(hr, "IActiveScript::GetScriptDispatch")
        return ComObject(9, pdsp, 1)
    }

    _InitNew()
    {
        hr := DllCall(NumGet(NumGet((p:=this._scriptParse)+0)+3*A_PtrSize), "ptr", p)
        if (hr < 0)
            this._HRFail(hr, "IActiveScriptParse::InitNew")
    }

    _ParseScriptText(Code, Flags, pvarResult)
    {
        VarSetCapacity(excp, 8 * A_PtrSize, 0)
        hr := DllCall(NumGet(NumGet((p:=this._scriptParse)+0)+5*A_PtrSize), "ptr", p
            , "wstr", Code, "ptr", 0, "ptr", 0, "ptr", 0, "uptr", 0, "uint", 1
            , "uint", Flags, "ptr", pvarResult, "ptr", 0)
        if (hr < 0)
            this._HRFail(hr, "IActiveScriptParse::ParseScriptText")
    }

    _HRFail(hr, what)
    {
        if e := this.Error
        {
            this.Error := ""
            throw Exception("`nError code:`t" this._HRFormat(e.HRESULT)
                . "`nSource:`t`t" e.Source "`nDescription:`t" e.Description
                . "`nLine:`t`t" e.Line "`nColumn:`t`t" e.Column
                . "`nLine text:`t`t" e.LineText, -3)
        }
        throw Exception(what " failed with code " this._HRFormat(hr), -2)
    }

    _HRFormat(hr)
    {
        return Format("0x{1:X}", hr & 0xFFFFFFFF)
    }

    _OnScriptError(err) ; IActiveScriptError err
    {
        VarSetCapacity(excp, 8 * A_PtrSize, 0)
        DllCall(NumGet(NumGet(err+0)+3*A_PtrSize), "ptr", err, "ptr", &excp) ; GetExceptionInfo
        DllCall(NumGet(NumGet(err+0)+4*A_PtrSize), "ptr", err, "uint*", srcctx, "uint*", srcline, "int*", srccol) ; GetSourcePosition
        DllCall(NumGet(NumGet(err+0)+5*A_PtrSize), "ptr", err, "ptr*", pbstrcode) ; GetSourceLineText
        code := StrGet(pbstrcode, "UTF-16"), DllCall("OleAut32\SysFreeString", "ptr", pbstrcode)
        if fn := NumGet(excp, 6 * A_PtrSize) ; pfnDeferredFillIn
            DllCall(fn, "ptr", &excp)
        wcode := NumGet(excp, 0, "ushort")
        hr := wcode ? 0x80040200 + wcode : NumGet(excp, 7 * A_PtrSize, "uint")
        this.Error := {HRESULT: hr, Line: srcline, Column: srccol, LineText: code}
        static Infos := "Source,Description,HelpFile"
        Loop Parse, % Infos, `,
            if pbstr := NumGet(excp, A_Index * A_PtrSize)
                this.Error[A_LoopField] := StrGet(pbstr, "UTF-16"), DllCall("OleAut32\SysFreeString", "ptr", pbstr)
        return 0x80004001 ; E_NOTIMPL (let Exec/Eval get a fail result)
    }

    __Delete()
    {
        if this._script
        {
            DllCall(NumGet(NumGet((p:=this._script)+0)+7*A_PtrSize), "ptr", p)  ; Close
            ObjRelease(this._script)
        }
        if this._scriptParse
            ObjRelease(this._scriptParse)
    }

    static IID := "{BB1A2AE1-A4F9-11cf-8F20-00805F2CD064}"
    static IID_Parse := A_PtrSize=8 ? "{C7EF7658-E1EE-480E-97EA-D52CB4D76D17}" : "{BB1A2AE2-A4F9-11cf-8F20-00805F2CD064}"
}

class ActiveScriptSite
{
    __New(Script)
    {
        ObjSetCapacity(this, "_site", 3 * A_PtrSize)
        NumPut(&Script
        , NumPut(ActiveScriptSite._vftable("_vft_w", "31122", 0x100)
        , NumPut(ActiveScriptSite._vftable("_vft", "31125232211", 0)
            , this.ptr := ObjGetAddress(this, "_site"))))
    }

    _vftable(Name, PrmCounts, EIBase)
    {
        if p := ObjGetAddress(this, Name)
            return p
        ObjSetCapacity(this, Name, StrLen(PrmCounts) * A_PtrSize)
        p := ObjGetAddress(this, Name)
        Loop Parse, % PrmCounts
        {
            cb := RegisterCallback("_ActiveScriptSite", "F", A_LoopField, A_Index + EIBase)
            NumPut(cb, p + (A_Index-1) * A_PtrSize)
        }
        return p
    }
}

_ActiveScriptSite(this, a1:=0, a2:=0, a3:=0, a4:=0, a5:=0)
{
    Method := A_EventInfo & 0xFF
    if A_EventInfo >= 0x100  ; IActiveScriptSiteWindow
    {
        if Method = 4  ; GetWindow
        {
            NumPut(0, a1+0) ; *phwnd := 0
            return 0 ; S_OK
        }
        if Method = 5  ; EnableModeless
        {
            return 0 ; S_OK
        }
        this -= A_PtrSize     ; Cast to IActiveScriptSite
    }
    ;else: IActiveScriptSite
    if Method = 1  ; QueryInterface
    {
        iid := _AS_GUIDToString(a1)
        if (iid = "{00000000-0000-0000-C000-000000000046}"  ; IUnknown
         || iid = "{DB01A1E3-A42B-11cf-8F20-00805F2CD064}") ; IActiveScriptSite
        {
            NumPut(this, a2+0)
            return 0 ; S_OK
        }
        if (iid = "{D10F6761-83E9-11cf-8F20-00805F2CD064}") ; IActiveScriptSiteWindow
        {
            NumPut(this + A_PtrSize, a2+0)
            return 0 ; S_OK
        }
        NumPut(0, a2+0)
        return 0x80004002 ; E_NOINTERFACE
    }
    if Method = 5  ; GetItemInfo
    {
        a1 := StrGet(a1, "UTF-16")
        , (a3 && NumPut(0, a3+0))  ; *ppiunkItem := NULL
        , (a4 && NumPut(0, a4+0))  ; *ppti := NULL
        if (a2 & 1) ; SCRIPTINFO_IUNKNOWN
        {
            if !(unk := Object(NumGet(this + A_PtrSize*2))._GetObjectUnk(a1))
                return 0x8002802B ; TYPE_E_ELEMENTNOTFOUND
            ObjAddRef(unk), NumPut(unk, a3+0)
        }
        return 0 ; S_OK
    }
    if Method = 9  ; OnScriptError
        return Object(NumGet(this + A_PtrSize*2))._OnScriptError(a1)

    ; AddRef and Release don't do anything because we want to avoid circular references.
    ; The site and IActiveScript are both released when the AHK script releases its last
    ; reference to the ActiveScript object.

    ; All of the other methods don't require implementations.
    return 0x80004001 ; E_NOTIMPL
}

_AS_GUIDToString(pGUID)
{
    VarSetCapacity(String, 38*2)
    DllCall("ole32\StringFromGUID2", "ptr", pGUID, "str", String, "int", 39)
    return String
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: kamelotto, 2019-11-25 03:27:21)

Re: AHK: Автоматизация google translate

teadrinker
Спасибо огромное за проделанную работу по скрипту! Я попробовал разные варианты. Всё очень здорово!
Автору респект!
Но есть один нюанс, который хотелось бы подправить. Посылаю вашим скриптом (В виде функции) запрос и получаю ответ в буфер обмена. Для этого я изменил начало  кода:


TxtIn:=Clipboard  
Clipboard= % GoogleTranslate(TxtIn)

Но ответ бывает с кучей вариантов. Например:
Запрос — Installation
Ответ   — Установка
+
установка
оборудование
сборка
сооружение
настройка
проводка
введение в должность
устройство на место
водворение на место
вселение.
-------------------------------
А как сделать так, чтобы приходил только основной вариант, без дополнительных?
Запрос — Installation
Ответ   — Установка

6 (изменено: teadrinker, 2019-11-25 07:01:21)

Re: AHK: Автоматизация google translate

Честно говоря, не знаю, есть ли такой вариант. Проще отсечь всё лишнее:

MsgBox, % RegExReplace(GoogleTranslate("Installation"), "s)\R\+.*")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: kamelotto, 2019-11-25 19:00:04)

Re: AHK: Автоматизация google translate

teadrinker
Если я Вас правильно понял, вы предлагаете выводить, из принятого ответа всё, что до знака "+".
Но как быть, если в запросе был "+"? Тогда всё, что после него , отметётся?
Знаете, я заметил, что переводчик возвращает каждый вариант в новой строке. Может можно, как то использовать эту особенность? Ведь основной вариант, он возвращает в первой строке. Думаю, это не изменится. Но как это применить?

Простите. Кажется зря я опасался. Почему то работает)). И с плюсом обратно приходит без проблем.

Понравилось, как переводится Ваш ник))

8

Re: AHK: Автоматизация google translate

kamelotto пишет:

вы предлагаете выводить, из принятого ответа всё, что до знака "+".

Нет, паттерн "s)\R\+.*" означает "перенос строки, затем +, затем всё остальное"

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

9

Re: AHK: Автоматизация google translate

teadrinker
А что означает " s) " ? Искал. Возможно пропустил где-то. Но искал по всей справке. Не нашёл

10

Re: AHK: Автоматизация google translate

https://www.autohotkey.com/docs/misc/Re … .htm#opt_s

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

11

Re: AHK: Автоматизация google translate

teadrinker
Простите, я русский. И не стану учить язык, что бы выяснить только один, или даже несколько вопросов. Я бы не обратил внимания на выложенный скрипт, если бы владел английским.
В русской справке есть вариант " \s ". В английском " s ". А здесь " s) ".
Я об этом спрашиваю. В чём разница?

12

Re: AHK: Автоматизация google translate

\s Matches any single whitespace character, mainly space, tab, and newline (`r and `n). Conversely, capital \S means "any non-whitespace character".

Гугл-перводчик нам поможет.
\s Соответствует любому одиночному пробельному символу. Чаще всего используют, чтобы найти пробел, табуляцию и перевод строки (`r и `n). И наоборот, заглавная \S означает "любой непробельный символ".


Есть ещё нюанс с сочетанием `r`n, который обсуждался в теме AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]. Несколько сообщений, начиная с 15-го.

13 (изменено: kamelotto, 2019-11-30 13:14:37)

Re: AHK: Автоматизация google translate

ypppu
Информация и ссылка на тему, которую Вы дали, действительно интересны. Полезно знать нюансы пробельных символов. Спасибо!
Но это не отвечает на мой вопрос. 
" \s " и " s) ".
Вы чувствуете разницу между слешем и закрывающейся круглой скобкой? Вопрос не в букве "s", или в "S". С ней всё понятно из текста русской справки.
Вопрос, почему у вас в коде стоит "s)", в начале паттерна? Почему круглая закрывающая скобка?

14

Re: AHK: Автоматизация google translate

В 10-ом сообщении teadrinker дал ссылку. Там говорится о нескольких символах в начале регулярного выражения с последующей закрывающейся скобкой. Эта штука называется "опции" (опять же, не поленитесь забить в переводчик), среди них есть и опция s.

15 (изменено: ypppu, 2019-11-30 15:08:30)

Re: AHK: Автоматизация google translate

Исправлено
Может создать в коммерческом разделе тему с просьбами перевести ту или иную статью? С миру по нитке, так постепенно и переведётся.

16 (изменено: kamelotto, 2019-11-30 15:01:45)

Re: AHK: Автоматизация google translate

ypppu
Да. Статья действительно отсутствует в русском варианте.
Но я нашёл описание опций в русском разделе RegExMatch() v1.0.45+.
Осталось только уточнить, применимы ли эти опции к "RegExReplace() не только версии [v1.0.45+]" и  к "SetTitleMatchMode"?
Или это касается только "RegExReplace() не только версии [v1.0.45+]", но и более свежих?

17

Re: AHK: Автоматизация google translate

А, точно! Перевод на нашем сайте есть, а я искал по CHM-справке и не нашёл.
Регулярные выражения (RegEx) - краткий справочник
RegExReplace() [v1.0.45+]
RegExMatch() [v1.0.45+]


Вообще, в оригинале справки опции описываются в статье "RegEx - краткий справочник". Опции относятся как к RegExMatch(), так и и к RegExReplace(). Но на нашем сайте они почему-то находятся в статье "RegExMatch()".

18 (изменено: kamelotto, 2019-11-30 16:04:16)

Re: AHK: Автоматизация google translate

ypppu
Хорошо бы отредактировать в общем разделе. А то... Это я такой дотошный. Представляю сколько людей сдались и ушли с обгрызенными ногтями, вместо результата.
Давайте, всё таки добьём так, что бы вопросов уже не оставалось. К команде "SetTitleMatchMode", описанные опции тоже применимы?

19

Re: AHK: Автоматизация google translate

Почитал SetTitleMatchMode. Да, похоже, что после команды SetTitleMatchMode, RegEx такие параметры, как WinTitle, WinText и т. д. нужно задавать в виде шаблона. Который составляется согласно статье RegEx.

20 (изменено: kamelotto, 2019-12-23 03:45:52)

Re: AHK: Автоматизация google translate

teadrinker
И снова здравствуйте.
Не понимаю что происходит. Я написал цикл построчной отправки, в вашу функцию английского текста и такой же построчной записи переведённых строк, в новый файл. Обрадовался, что всё работает и пошёл спокойно по делам, с утра. А вечером прихожу, делаю те же самые действия, с теми же файлами и вылетает ошибка:

Error: 
Error code: 0x800A03EA
Source: Ошибка компиляции Microsoft JScript
Description: Синтаксическая ошибка
Line: 1
Column: 1
Line text: (<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

Line#
102: if (from = "") 
103: from := RegExMatch(str, "[а-яёА-ЯЁ]") ? "ru" : "auto"
104: if (to = "") 
105: to := from = "ru" ? "en" : "ru"
107: json := SendRequest(str, to, from, proxy:="")
108: JS := new ActiveScript("JScript")
109: JS.eval("delete ActiveXObject; delete GetObject;") 
---> 110: oJSON := JS.eval("(" . JSON . ")")
112: if !IsObject(oJSON[1]) 
113: Loop,oJSON[0].length
114: trans .= oJSON[0][A_Index - 1][0] 
115: Else
116: {
117: MainTransText := oJSON[0][0][0]
118: Loop,oJSON[1].length

The current thread will exit.
-------------------------------------
Стесняюсь спросить, а как с этим бороться?

21

Re: AHK: Автоматизация google translate

Скорее всего Гугл из-за частых вызовов перестал присылать вам результат, а присылает вместо этого страницу с капчей. Бороться можно через try-catch.

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

22 (изменено: kamelotto, 2019-12-23 15:52:46)

Re: AHK: Автоматизация google translate

teadrinker

teadrinker пишет:

Бороться можно через try-catch.

Простите, я не понял ответа. Можно чуть подробнее?

23

Re: AHK: Автоматизация google translate

try oJSON := JS.eval("(" . JSON . ")")
catch
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24

Re: AHK: Автоматизация google translate

teadrinker
И что мне делать с этим загадочным кусочком кода?
О Пьющий чай! — Лаконичнейший из лаконичнейших!

25

Re: AHK: Автоматизация google translate

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

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

26

Re: AHK: Автоматизация google translate

teadrinker
Спасибо. Воспользоваться не пришлось. Почему то прекратилось это безобразие через день. Но если снова будет сбоить, попробую и отпишусь.
А сейчас другая странность. Некоторые фразы через функцию не переводятся, или переводятся не полностью. Хотя, если воспользоваться переводчиком в браузере, всё переводится. Значит это не Гугла капризы. Что это может быть? Вот фразы, которые возвращаются не корректно:
Box Shape, Mesh Shape, Linear Damping, Angular Damping, Material Spinning Friction, Ccd Swept Sphere Radius Factor

27

Re: AHK: Автоматизация google translate

Честно говоря, не знаю, почему так происходит.

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

28

Re: AHK: Автоматизация google translate

http://forum.script-coding.com/viewtopi … 09#p136409

29

Re: AHK: Автоматизация google translate

А, точно, здесь же старый вариант, возможно, отсюда и проблемы были. Обновил.

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

30

Re: AHK: Автоматизация google translate

teadrinker
О-о! Заработало! Теперь только одну фразу, пока не переводит: Collision Group.
Но её и переводчик в браузере не хочет брать. Зато, с этим справляется переводчик Bin от Microsoft.
В связи с этим вопрос: А есть ли возможность переделать скрипт так, что бы сотрудничать с другими переводчиками онлайн?

31

Re: AHK: Автоматизация google translate

Можно наверно добавить какие-то переводчики, но это не так просто. Так что ждите энтузиастов.

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

32

Re: AHK: Автоматизация google translate

Bing просто:

text := "Collision Group"
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("POST", "https://www.bing.com/ttranslatev3", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP.SetRequestHeader("Content-type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send("fromLang=en&to=ru&text=" text)
HTTP.WaitForResponse()
msgbox % HTTP.ResponseText

33

Re: AHK: Автоматизация google translate

Malcev
прикольный ответ в МСбоксе
---------------------------
[{"detectedLanguage":{"language":"en","score":1.0},"translations":[{"text":"Группа коллизий","to":"ru"}]}]
---------------------------
Доставать перевод из строки надо регулярным выражением?

34

Re: AHK: Автоматизация google translate

Хоть регуляркой, хоть json парсером.

35

Re: AHK: Автоматизация google translate

Malcev пишет:

Хоть регуляркой, хоть json парсером.

Json парсер, это тоже какая то функция AHK?

36

Re: AHK: Автоматизация google translate

Нет. Ищите на форуме.

37

Re: AHK: Автоматизация google translate

Malcev пишет:

Bing просто:

А про DeepL, что нибудь можете сказать? Это самый качественный переводчик на сегодняшний день. Вот бы его оседлать.

38 (изменено: Malcev, 2019-12-29 00:34:59)

Re: AHK: Автоматизация google translate

Лень копаться.
Либо сами смотрите, что посылает-отправляет броузер либо заказывайте платно у teadrinkerа.

39

Re: AHK: Автоматизация google translate

Кстати, если кто-то захочет добавить новые переводчики, то тут автор уже покопался в запросах/ответах.
https://github.com/NightlyRevenger/Tata … ranslation

40

Re: AHK: Автоматизация google translate

Так это ж си-шарп, не особо поможет.

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

41

Re: AHK: Автоматизация google translate

Почему не поможет?
Тут же главное алгоритм.