1 (изменено: sabir.yanin2014, 2016-03-30 04:14:20)

Тема: AHK:Изменение языка текста с английского на русский и наоборот

Если не владеешь 10-пальцевым методом печати на клавиатуре т.е. не умеешь печатать вслепую, часто сталкиваешься с ситуацией когда напечатав предложение , посмотрев на монитор ,  обнаруживаешь что оно на тарабарском языке. Т.е. ты думал что печатал на английском , а на самом деле печатал на русском и наоборот.
Для ленивых я придумал скрипт который позволяет нажатием клавиши исправить досадную ошибку.
1)При нажатии горячей клавиши Insert::- скрипт выделяет последнее напечатанное слово (или одиночный символ)  и печатает его на другом языке как если бы мы нажимали те же клавиши но при другой раскладке клавиатуры.
2)При нажатии горячей клавиши ^Insert:: (Ctrl+Insert)- cкрипт выделяет все предложение и переводит .
3) При нажатии горячей клавиши +Insert:: (Shift+Insert)- cкрипт выделяет последний символ  и переводит.
4)При нажатии горячей клавиши #Insert:: (Win+Insert)- cкрипт выделяет конец предложения и переводит.

^Ins::
send {Shift Down}{Home}{Shift Up} ;выделяем строку
Gosub, s1
return
Ins::
send {Ctrl Down}{Shift Down}{Left}{Shift Up}{Ctrl Up}
;выделяем слово
Gosub, s1
return
+Ins::
send {Shift Down}{Left}{Shift Up}
;выделяем символ
Gosub, s1
return
#Ins::
send {Shift Down}{End}{Shift Up} ;выделяем конец строки
Gosub, s1
return

s1:
send ^{vk43} ;Ctrl+C
Text=%Clipboard%
V:= ""
EN1=QWERTYUIOP{}qwertyuiop[]
RU1=ЙЦУКЕНГШЩЗХЪйцукенгшщзхъ
EN2=ASDFGHJKL:"asdfghjkl;'
RU2=ФЫВАПРОЛДЖЭфывапролджэ
EN3=ZXCVBNM<>?zxcvbnm,./
RU3=ЯЧСМИТЬБЮ,ячсмитьбю.
EN4=~@#$^&|`
RU4=Ё"№;:?/ё
EN=%EN1%%EN2%%EN3%%EN4%
RU=%RU1%%RU2%%RU3%%RU4%

Loop, parse, Text
{
M1:=A_LoopField

	if InStr(EN, M1)
	{
	L1=%En%
	L2=%RU%
	}
	else if InStr(RU, M1)
	{
	L1=%RU%
	L2=%En%
	}
	else
	{
	V.=A_LoopField
	L1=
	L2=
	}
	
	Loop, parse, L1
	{
	M2:=A_LoopField
	if (Asc(M2)=Asc(M1))
		{
		N:=A_Index
		break
		}
	}
	Loop, parse, L2
	{
	if (N=A_Index)
		{
		V.=A_LoopField
		break
		}
	}	
} 
Clipboard=%V% 
Send ^{vk56} ;Ctrl+V
return

*Очень удобный скрипт. Я его скомпилировал и поставил в меню автозагрузки.

2

Re: AHK:Изменение языка текста с английского на русский и наоборот

sabir.yanin2014, ознакомьтесь с этой темой, отредактируйте свой пост.

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

3

Re: AHK:Изменение языка текста с английского на русский и наоборот

Читайте ещё раз, на этот раз всё и внимательно.

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

4

Re: AHK:Изменение языка текста с английского на русский и наоборот

Уже лучше. Ещё можете сюда заглянуть ради любопытства.

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

5

Re: AHK:Изменение языка текста с английского на русский и наоборот

Пробовал с форума некоторые другие варианты конвертации текста, но они приводили к краху клиент скайпа. Этот вариант работает вроде корректно. Но некорректно переводит знаки, полагаю, из-за пренебрежения виртуальными кодами клавиш в теле сценария. А также при срабатывании съедает пробел. Если исправить эти моменты, думаю, можно пользоваться.

http://puu.sh/o3doW/67427a6d8e.gif

6 (изменено: Malcev, 2016-04-02 20:19:32)

Re: AHK:Изменение языка текста с английского на русский и наоборот

Скайп просто определяет границу слова по своему алгоритму.
Пробел съедается потому что тримминг включен.
Так у меня работает:

AutoTrim, off
^Ins::
send {Shift Down}{Home}{Shift Up} ;выделяем строку
Gosub, s1
return
Ins::
if WinActive("ahk_exe Skype.exe")
{
   skype := 1
   send {Shift Down}{Home}{Shift Up} ;выделяем строку
}
else
   send {Ctrl Down}{Shift Down}{Left}{Shift Up}{Ctrl Up}
;выделяем слово
Gosub, s1
return
+Ins::
send {Shift Down}{Left}{Shift Up}
;выделяем символ
Gosub, s1
return
#Ins::
send {Shift Down}{End}{Shift Up} ;выделяем конец строки
Gosub, s1
return

s1:
send ^{vk43} ;Ctrl+C
if skype = 1
{
   RegExMatch(Clipboard, "[^\s]+\s*$", Text)
   Clipboard := SubStr(Clipboard, 1, StrLen(Clipboard)-StrLen(Text))
}
else
   Text=%Clipboard%
V:= ""
EN1=QWERTYUIOP{}qwertyuiop[]
RU1=ЙЦУКЕНГШЩЗХЪйцукенгшщзхъ
EN2=ASDFGHJKL:"asdfghjkl;'
RU2=ФЫВАПРОЛДЖЭфывапролджэ
EN3=ZXCVBNM<>?zxcvbnm,./
RU3=ЯЧСМИТЬБЮ,ячсмитьбю.
EN4=~@#$^&|`
RU4=Ё"№;:?/ё
EN=%EN1%%EN2%%EN3%%EN4%
RU=%RU1%%RU2%%RU3%%RU4%

Loop, parse, Text
{
M1:=A_LoopField

	if InStr(EN, M1)
	{
	L1=%En%
	L2=%RU%
	}
	else if InStr(RU, M1)
	{
	L1=%RU%
	L2=%En%
	}
	else
	{
	V.=A_LoopField
	L1=
	L2=
	}
	
	Loop, parse, L1
	{
	M2:=A_LoopField
	if (Asc(M2)=Asc(M1))
		{
		N:=A_Index
		break
		}
	}
	Loop, parse, L2
	{
	if (N=A_Index)
		{
		V.=A_LoopField
		break
		}
	}	
}
if skype = 1
{
   Clipboard.=v
   skype := ""
} 
else
   Clipboard=%V%
Send ^{vk56} ;Ctrl+V
return

7

Re: AHK:Изменение языка текста с английского на русский и наоборот

becauseim пишет:

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

И что, этот тоже?

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

8

Re: AHK:Изменение языка текста с английского на русский и наоборот

Teadrinker, твой код работает неправильно.
Попробуй написать "[" и нажать ctrl+PgDn.
И еще он работает медленнее, чем у sabir.yanin2014.

9

Re: AHK:Изменение языка текста с английского на русский и наоборот

Почему неправильно? Может, просто символ не учтён. Слово [hjv конвертирует. Код выше основан на отправке клавиатурных сочетаний, а они не везде срабатывают, особенно для русского текста, например в редакторах кода. И что, действительно крашит Скайп? У меня нет.

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

10

Re: AHK:Изменение языка текста с английского на русский и наоборот

Скайп не крашит, но и слово '[ (эх) не переводит.

11

Re: AHK:Изменение языка текста с английского на русский и наоборот

А во что он должен его перевести? А тот код как переводит? Кроме того, тот код не меняет раскладку после конвертации.

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

12

Re: AHK:Изменение языка текста с английского на русский и наоборот

А, понял с эх, есть косяк.

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

13

Re: AHK:Изменение языка текста с английского на русский и наоборот

Я конечно не специалист, но зачем изобретать велосипед.
Есть специальный программы, которые переводят текст, если ты ввел его на неправильной раскладке клавиатуры.

14

Re: AHK:Изменение языка текста с английского на русский и наоборот

Есть только одна специальная программа?

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

15

Re: AHK:Изменение языка текста с английского на русский и наоборот

teadrinker
Ну я точно знаю одну программу. Просто ей пользовался.
Возможно есть еще, но эта самая популярная так сказать.

16

Re: AHK:Изменение языка текста с английского на русский и наоборот

Ну, может не все её знают. Или для кого-то её функционал избыточен.

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

17

Re: AHK:Изменение языка текста с английского на русский и наоборот

У нас тут есть еще один заменитель Punto Switcher'a. А альтернативных программ таких навалом - ArumSwitсher, Keyboard Ninja, Опечатка, Text Converter и т.д.

18

Re: AHK:Изменение языка текста с английского на русский и наоборот

Malcev пишет:

Teadrinker, твой код работает неправильно.
Попробуй написать "[" и нажать ctrl+PgDn.
И еще он работает медленнее, чем у sabir.yanin2014.

Исправлено.

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

19 (изменено: sabir.yanin2014, 2016-04-16 09:10:20)

Re: AHK:Изменение языка текста с английского на русский и наоборот

Другой,  модифицированный вариант. Возможность исправлять ошибки. При повторном нажатии горячей клавиши в одном месте (слово , предложение или символ) скрипт перебирает и выдает все возможные варианты. Так если набрать "б" и несколько раз нажать Ins , скрипт будет показывать варианты: "," , "?" , "б".
К сожалению не удалось переводить маленькую "ё" , так как скрипт почему то не видит "`".  Если кто понимает в чем дело, помогите.


EN1=QWERTYUIOP{}qwertyuiop[]
RU1=ЙЦУКЕНГШЩЗХЪйцукенгшщзхъ
EN2=ASDFGHJKL:"asdfghjkl;'
RU2=ФЫВАПРОЛДЖЭфывапролджэ
EN3=ZXCVBNM<>zxcvbnm,.
RU3=ЯЧСМИТЬБЮячсмитьбю
EN4=~#|`
RU4=Ё№/ё
EN_Alt=$^?/@
RU_Alt=;:,."
EN=%EN1%%EN2%%EN3%%EN4%
RU=%RU1%%RU2%%RU3%%RU4%

^Ins:: ;выделяем строку от курсора влево
send {Shift Down}{Home}{Shift Up} 
Gosub, s1
return
Ins:: ;выделяем слово от курсора влево
send {Ctrl Down}{Shift Down}{Left}{Shift Up}{Ctrl Up} 
Gosub, s1
return
+Ins:: ;выделяем символ от курсора влево
send {Shift Down}{Left}{Shift Up} 
Gosub, s1
return
^#Ins:: ;выделяем строку от курсора вправо
send {Shift Down}{End}{Shift Up} 
Gosub, s1
return
#Ins:: ;выделяем слово от курсора вправо
send {Ctrl Down}{Shift Down}{Right}{Shift Up}{Ctrl Up} 
Gosub, s1
return
+#Ins:: ;выделяем символ от курсора вправо
send {Shift Down}{Right}{Shift Up} 
Gosub, s1
return

s1:
Clipboard=
send ^{vk43} ;Ctrl+C
V:="",English:=EN,Russian:=RU,Text:=Clipboard
Gosub, s2

if V=%Clipboard_OLD%
{
V:="",English:=EN_Alt,Russian:=RU_Alt,Text:=Clipboard_OLD
Gosub, s2
}
Clipboard_OLD:=Clipboard,Clipboard:=V
Send ^{vk56} ;Ctrl+V
return

s2:
Loop, parse, Text
{
M1:=A_LoopField

	if InStr(English, M1)
	L1:=English,L2:=Russian
	else if InStr(Russian, M1)
	L1:=Russian,L2:=English
	else
	V.=A_LoopField,L1:="",L2:=""
	
	Loop, parse, L1
	{
	M2:=A_LoopField
	if (Asc(M2)=Asc(M1))
		{
		N:=A_Index
		break
		}
	}
	Loop, parse, L2
	{
	if (N=A_Index)
		{
		V.=A_LoopField
		break
		}
	}	
} 
return

20

Re: AHK:Изменение языка текста с английского на русский и наоборот

http://www.script-coding.com/AutoHotkey/EscapeChar.html

21

Re: AHK:Изменение языка текста с английского на русский и наоборот

sabir.yanin2014, у нас принято реагировать на требования модераторов.
Напоминаю.
Если хотите продолжать пользоваться форумом, внесите исправления в неверно оформленный пост.

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

22 (изменено: sabir.yanin2014, 2016-04-16 09:22:38)

Re: AHK:Изменение языка текста с английского на русский и наоборот

Спасибо, Malcev! Все заработало, теперь "ё" переводит


#EscapeChar \
EN1=QWERTYUIOP{}qwertyuiop[]
RU1=ЙЦУКЕНГШЩЗХЪйцукенгшщзхъ
EN2=ASDFGHJKL:"asdfghjkl;'
RU2=ФЫВАПРОЛДЖЭфывапролджэ
EN3=ZXCVBNM<>zxcvbnm,.
RU3=ЯЧСМИТЬБЮячсмитьбю
EN4=~#|`
RU4=Ё№/ё
EN_Alt=$^?/@
RU_Alt=;:,."
EN=%EN1%%EN2%%EN3%%EN4%
RU=%RU1%%RU2%%RU3%%RU4%

^Ins:: ;выделяем строку от курсора влево
send {Shift Down}{Home}{Shift Up} 
Gosub, s1
return
Ins:: ;выделяем слово от курсора влево
send {Ctrl Down}{Shift Down}{Left}{Shift Up}{Ctrl Up} 
Gosub, s1
return
+Ins:: ;выделяем символ от курсора влево
send {Shift Down}{Left}{Shift Up} 
Gosub, s1
return
^#Ins:: ;выделяем строку от курсора вправо
send {Shift Down}{End}{Shift Up} 
Gosub, s1
return
#Ins:: ;выделяем слово от курсора вправо
send {Ctrl Down}{Shift Down}{Right}{Shift Up}{Ctrl Up} 
Gosub, s1
return
+#Ins:: ;выделяем символ от курсора вправо
send {Shift Down}{Right}{Shift Up} 
Gosub, s1
return

s1:
Clipboard=
send ^{vk43} ;Ctrl+C
V:="",English:=EN,Russian:=RU,Text:=Clipboard
Gosub, s2

if V=%Clipboard_OLD%
{
V:="",English:=EN_Alt,Russian:=RU_Alt,Text:=Clipboard_OLD
Gosub, s2
}
Clipboard_OLD:=Clipboard,Clipboard:=V
Send ^{vk56} ;Ctrl+V
return

s2:
Loop, parse, Text
{
M1:=A_LoopField

	if InStr(English, M1)
	L1:=English,L2:=Russian
	else if InStr(Russian, M1)
	L1:=Russian,L2:=English
	else
	V.=A_LoopField,L1:="",L2:=""
	
	Loop, parse, L1
	{
	M2:=A_LoopField
	if (Asc(M2)=Asc(M1))
		{
		N:=A_Index
		break
		}
	}
	Loop, parse, L2
	{
	if (N=A_Index)
		{
		V.=A_LoopField
		break
		}
	}	
} 
return

23

Re: AHK:Изменение языка текста с английского на русский и наоборот

sabir.yanin2014, не хватает переключения раскладки после конвертации. Добавьте, пожалуйста.

24

Re: AHK:Изменение языка текста с английского на русский и наоборот

becauseim, может, откроете секрет, чем вариант в коллекции плох? Просто интересно, может, подправить надо?

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

25 (изменено: becauseim, 2016-04-17 17:56:36)

Re: AHK:Изменение языка текста с английского на русский и наоборот

teadrinker, однажды я искал альтернативу программе Punto Switcher в виде сценария AHK, но из всех найденных вариантов на этом форуме мне, к сожалению, ни один не подошел. Кажется, я находил около трех вариантов. Как минимум два варианта из трех у меня роняли Skype при срабатывании. Вероятно, проблема была в моем компьютере, например в системе Win 10, не знаю. Этот вариант, кажется, не конфликтует с мессенджером. Возможно, стоит вновь попробовать вариант из коллекции.

26

Re: AHK:Изменение языка текста с английского на русский и наоборот

teadrinker, вариант из коллекции работает корректно, но в разы медленнее.

27

Re: AHK:Изменение языка текста с английского на русский и наоборот

А вы давно проверяли?

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

28

Re: AHK:Изменение языка текста с английского на русский и наоборот

teadrinker, только что.

29

Re: AHK:Изменение языка текста с английского на русский и наоборот

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

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

30

Re: AHK:Изменение языка текста с английского на русский и наоборот

teadrinker, только что скачал вновь отсюда и запустил. Это старая версия?

31

Re: AHK:Изменение языка текста с английского на русский и наоборот

А почему бы не попробовать код из последнего поста в топике? Это, вроде, логичнее, не правда ли?

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

32

Re: AHK:Изменение языка текста с английского на русский и наоборот

teadrinker, я взял приведенную ссылку из Вашего сообщения в этой теме и даже не обратил внимания на последнее обновление. Новая версия работает быстро и стабильно. Спасибо!

33 (изменено: sabir.yanin2014, 2016-04-21 19:20:32)

Re: AHK:Изменение языка текста с английского на русский и наоборот

becauseim,
Следующий скрипт меняет язык  раскладки в активном окне после каждой конвертации:


#EscapeChar \
EN1=QWERTYUIOP{}qwertyuiop[]
RU1=ЙЦУКЕНГШЩЗХЪйцукенгшщзхъ
EN2=ASDFGHJKL:"asdfghjkl;'
RU2=ФЫВАПРОЛДЖЭфывапролджэ
EN3=ZXCVBNM<>zxcvbnm,.
RU3=ЯЧСМИТЬБЮячсмитьбю
EN4=~#|`
RU4=Ё№/ё
EN_Alt=$^?/@
RU_Alt=;:,."
EN=%EN1%%EN2%%EN3%%EN4%
RU=%RU1%%RU2%%RU3%%RU4%

^Ins:: ;выделяем строку от курсора влево
send {Shift Down}{Home}{Shift Up} 
Gosub, s1
return
Ins:: ;выделяем слово от курсора влево
send {Ctrl Down}{Shift Down}{Left}{Shift Up}{Ctrl Up} 
Gosub, s1
return
+Ins:: ;выделяем символ от курсора влево
send {Shift Down}{Left}{Shift Up} 
Gosub, s1
return
^#Ins:: ;выделяем строку от курсора вправо
send {Shift Down}{End}{Shift Up} 
Gosub, s1
return
#Ins:: ;выделяем слово от курсора вправо
send {Ctrl Down}{Shift Down}{Right}{Shift Up}{Ctrl Up} 
Gosub, s1
return
+#Ins:: ;выделяем символ от курсора вправо
send {Shift Down}{Right}{Shift Up} 
Gosub, s1
return

s1:
If DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", "0")) = 0x4190419
PostMessage, 0x50, 0, 0x4090409,, A ;английский
Else
PostMessage, 0x50, 0, 0x4190419,, A ;русский
Clipboard=
send ^{vk43} ;Ctrl+C
V:="",English:=EN,Russian:=RU,Text:=Clipboard
Gosub, s2

if V=%Clipboard_OLD%
{
V:="",English:=EN_Alt,Russian:=RU_Alt,Text:=Clipboard_OLD
Gosub, s2
}
Clipboard_OLD:=Clipboard,Clipboard:=V
Send ^{vk56} ;Ctrl+V
return

s2:
Loop, parse, Text
{
M1:=A_LoopField

	if InStr(English, M1)
	L1:=English,L2:=Russian
	else if InStr(Russian, M1)
	L1:=Russian,L2:=English
	else
	V.=A_LoopField,L1:="",L2:=""
	
	Loop, parse, L1
	{
	M2:=A_LoopField
	if (Asc(M2)=Asc(M1))
		{
		N:=A_Index
		break
		}
	}
	Loop, parse, L2
	{
	if (N=A_Index)
		{
		V.=A_LoopField
		break
		}
	}	
} 
return

*Также нажатие Insert можно использовать как замену Alt+Shift для переключения раскладки

34

Re: AHK:Изменение языка текста с английского на русский и наоборот

Небольшое изменение (способ смены раскладки) позволяет коду работать в Windows 10


#EscapeChar \
EN1=QWERTYUIOP{}qwertyuiop[]
RU1=ЙЦУКЕНГШЩЗХЪйцукенгшщзхъ
EN2=ASDFGHJKL:"asdfghjkl;'
RU2=ФЫВАПРОЛДЖЭфывапролджэ
EN3=ZXCVBNM<>zxcvbnm,.
RU3=ЯЧСМИТЬБЮячсмитьбю
EN4=~#|`
RU4=Ё№/ё
EN_Alt=$^?/@
RU_Alt=;:,."
EN=%EN1%%EN2%%EN3%%EN4%
RU=%RU1%%RU2%%RU3%%RU4%

^Ins:: ;выделяем строку от курсора влево
send {Shift Down}{Home}{Shift Up} 
Gosub, s1
return
Ins:: ;выделяем слово от курсора влево
send {Ctrl Down}{Shift Down}{Left}{Shift Up}{Ctrl Up} 
Gosub, s1
return
+Ins:: ;выделяем символ от курсора влево
send {Shift Down}{Left}{Shift Up} 
Gosub, s1
return
^#Ins:: ;выделяем строку от курсора вправо
send {Shift Down}{End}{Shift Up} 
Gosub, s1
return
#Ins:: ;выделяем слово от курсора вправо
send {Ctrl Down}{Shift Down}{Right}{Shift Up}{Ctrl Up} 
Gosub, s1
return
+#Ins:: ;выделяем символ от курсора вправо
send {Shift Down}{Right}{Shift Up} 
Gosub, s1
return

s1:
If DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", "0"))=0x4190419
{
ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A")
PostMessage, 0x50, 0, 0x4090409, %CtrlFocus% ;английский
}
else
{
ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A")
PostMessage, 0x50, 0, 0x4190419, %CtrlFocus% ;русский
}
Clipboard=
send ^{vk43} ;Ctrl+C
V:="",English:=EN,Russian:=RU,Text:=Clipboard
Gosub, s2

if V=%Clipboard_OLD%
{
V:="",English:=EN_Alt,Russian:=RU_Alt,Text:=Clipboard_OLD
Gosub, s2
}
Clipboard_OLD:=Clipboard,Clipboard:=V
Send ^{vk56} ;Ctrl+V
return

s2:
Loop, parse, Text
{
M1:=A_LoopField

	if InStr(English, M1)
	L1:=English,L2:=Russian
	else if InStr(Russian, M1)
	L1:=Russian,L2:=English
	else
	V.=A_LoopField,L1:="",L2:=""
	
	Loop, parse, L1
	{
	M2:=A_LoopField
	if (Asc(M2)=Asc(M1))
		{
		N:=A_Index
		break
		}
	}
	Loop, parse, L2
	{
	if (N=A_Index)
		{
		V.=A_LoopField
		break
		}
	}	
} 
return