1 (изменено: OmTatSat, 2020-01-09 19:30:02)

Тема: AHK: разделить слившиеся слова, при копировании с двух строк

Здравствуйте, пожалуйста помогите решить проблему.
Использую такой ahk переводчик.

#singleinstance force


~lButton & RButton::
global xbut := 0
translate()
return

translate()
{
   ;ToolTip, xb %xbut%
   if xbut = 1
   {
     lang := "en" 
     ;xbut := 0
  }
  else
   lang := "ru"
   gui, destroy
	Gui +LastFound
KeyWait, lButton , u
sleep, 100
;send,{rbutton up}
;send,{lbutton up}
oCB := ClipboardAll ; save clipboard contents
Send, ^c
ClipWait,1
;ToolTip, %clipboard%
IfEqual, oCB, clipboard 
   Loop, 
   {
      Sleep, 100
      MsgBox, 1 - ==== `n %ClipboardAll% `n%clipboard%
    ToolTip, %ClipboardAll% = %clipboard% 1  
   }
until oCB != clipboard
;Send, ^c
 
;GoogleTranslate(Clipboard, "auto", "ru")
;MsgBox, %ClipboardAll% `n%clipboard%

global str
MsgBox, 1 - ==== `n %ClipboardAll% `n%clipboard%

t := GoogleTranslate(Clipboard, "auto", lang)
if !t
   Loop, 5
   {
      Sleep, 1000
      t := GoogleTranslate(Clipboard, "auto", lang)
      ;ToolTip, жду перевод
   }
until if t

Gui, Font, cFFFF00 s16 ;, Verdana
loop, parse, clipboard, `n, `r
max:=a_index

;msgbox,Total Characters=%a%
;msgbox %max%
if max < 2
{
   Loop, Parse, clipboard
     a++
if a < 100
   row := 1
if a > 100
   row := 2
if a > 200
   row := 2
if a > 300
   row := 3
if a > 400
   row := 4
if a > 500
   row := 5 
if a > 600
   row := 6
if a > 700
   row := 7
if a > 800
   row := 8
if a > 900
   row := 9
Gui, Font, cFFFF00 s16 ;, Verdana
Gui, Add, Edit, vstr -E0x200  r%row%, %t% `n
 }
 else
{
   Gui, Font, cFFFF00 s16 ;, Verdana
   Gui, Add, Edit, vstr -E0x200  , %t% `n
}
 a :=
 row :=
sleep, 100


;Gui, Font, cFFFF00 s16, Verdana
Gui, Color, 000000, 000000
Gui, Add, Text,  x0 y0  0x9 gGuiMove  ; Use a picture control instead
;Gui Margin, 1000, 0




gui, show, AutoSize, Translit
Gui +LastFound 
WinSet, Transparent, 200
WinSet, ExStyle, ^0x80,
;WinSetTitle,test,,%a_space%
 ControlSend,,{left}, Translit
Gui,  +AlwaysOnTop +Resize + DPIScale -Caption -Border -SysMenu  -ToolWindow ;-0x400000
GuiSize:
If A_EventInfo = 1
Return
GuiControl Move, str, % "H" . (A_GuiHeight) . " W" . (A_GuiWidth)
;GuiControl Move, str1, % "H" . (A_GuiHeight) . " W" . (A_GuiWidth)
;sleep, 3000
ClipBoard := oCB ; return original Clipboard contents
return
}
return
;If ( Win_Class = "Shell_TrayWnd" OR Win_Class = "ProgMan" OR Win_Class = "AltDesk1.x" )
;#if !MouseIsOver("Translit")
;#IfWinExist, Translit

;( (MouseIsOver != "Translit") AND (WinExist = "Translit") )
#If WinExist("Translit") AND !MouseIsOver("Translit")
~lbutton::
{
if !MouseIsOver("Translit")
{
gui, destroy
return
}
}

#If WinExist("Translit")
XButton1::
;gui, destroy
global xbut := 1
translate()
return

#If WinExist("Translit") AND MouseIsOver("Translit")
rbutton::
gui, destroy
return

#If WinExist("Translit") AND MouseIsOver("Translit")
~mbutton::
if triger = 
{
gui, show, maximize, Translit
triger = 1
}
else
   {
gui, show, restore, Translit
triger = 
}
return


MouseIsOver(WinTitle) {
MouseGetPos, , , Win
return WinExist(WinTitle . " ahk_id " . Win)
}

GuiMove:

PostMessage, 0xA1, 2,,, A

Return





GoogleTranslate(str, from := "auto", to := "en")  {
   static JS := CreateScriptObj(), _ := JS.( GetJScript() ) := JS.("delete ActiveXObject; delete GetObject;")
   
   json := SendRequest(JS, str, to, from, proxy := "")
   oJSON := JS.("(" . 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(JS, 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=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), 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
}

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
}

CreateScriptObj() {
   static doc
   doc := ComObjCreate("htmlfile")
   doc.write("<meta http-equiv='X-UA-Compatible' content='IE=9'>")
   Return ObjBindMethod(doc.parentWindow, "eval")
}

При переводе текста к примеру с этого документа https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5664031/pdf/foods-06-00092.pdf
В первом абзаце (и между стыком любого другого конца строки и начала следующей) при копировании текста имею "...has receivedinterest from both the medical/scientific..."
Иногда гугл переводчик разъеденяет такие слившиеся слова, но также часто оставляет их слитыми - не переведенными.
Вопрос, как можно исправить такие слившиеся слова?

2

Re: AHK: разделить слившиеся слова, при копировании с двух строк

Решил не заданный вопрос, но целевую задачу с переводом.
Заменой

http.open( "POST", "https://translate.google.com/translate_a/single?client=t&sl="

На

http.open( "POST", "https://translate.google.com/translate_a/single?client=webapp&sl="

3 (изменено: OmTatSat, 2020-01-10 17:23:41)

Re: AHK: разделить слившиеся слова, при копировании с двух строк

stealzy Google тоже смог, только другую ссылку для перевода нужно использовать, я писал выше.
Но вообще у Google бывают странные моменты при переводе, когда он теряет отрицание и пишет утверждение. Типа если перевести оригинал должно быть "...лечение не помогло..." а Google иногда переводит "...лечение помогло...". И это не слабо так мешает((. Благо знаю английский на уровне, при котором такие ляпы легко распознать.

Вы каким переводчиком пользуетесь? Как точность перевода?

4 (изменено: OmTatSat, 2020-01-10 19:33:57)

Re: AHK: разделить слившиеся слова, при копировании с двух строк

stealzy, тоже бывает так делаю. Но когда приходится много текстов перелопатить, то утомляет, на русском весь текст проще всё же.

5

Re: AHK: разделить слившиеся слова, при копировании с двух строк

OmTatSat пишет:

Но вообще у Google бывают странные моменты при переводе, когда он теряет отрицание и пишет утверждение.

Замените:

SendRequest(JS, 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=" . JS.("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
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: разделить слившиеся слова, при копировании с двух строк

teadrinker Спасибо огромное!
Увидел разницу в строке

"&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"
. "&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"

Очень интересно в чём фактическая разница в этих строках? Из-за неё Гугл терял частички отрицания?

7

Re: AHK: разделить слившиеся слова, при копировании с двух строк

Первый вариант просто устаревший, они немного изменили форму запроса. По старому приходит неверный перевод.

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

8

Re: AHK: разделить слившиеся слова, при копировании с двух строк

teadrinker, понял, спасибо, буду использовать.

9

Re: AHK: разделить слившиеся слова, при копировании с двух строк

teadrinker может вы знаете как можно определить язык скопированного текста?
Было бы здоров реализовать, чтобы в случае выбора русского текста переводило на английский, при выборе английского переводило на русский?

10

Re: AHK: разделить слившиеся слова, при копировании с двух строк

Можно через RegEx проверять, есть ли в исходном тексте кириллица.

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

11

Re: AHK: разделить слившиеся слова, при копировании с двух строк

teadrinker отличная идея! Спасибо.

Сделал так.

var := clipboard
var1 := SubStr(var, 1, 5)
if RegExMatch(var1, "[a-zA-Z]")
   lang := "ru"
else
  lang := "en"