如何在不更改 Mac 上的系统语言的情况下使用 applescript 从剪贴板输入俄语文本?

How to type text in Russian from clipboard using applescript without changing the system language on the Mac?

我用拉丁字母表自动填写表格,但在一个地方有一个字段,我需要用俄语输入文本。

填写之前,我用俄语复制了所需的单词,我想在不更改系统语言/编码/字符集的情况下从剪贴板中键入它。

也就是说。只需用俄语字母从剪贴板中输入一个单词,然后继续使用拉丁字母。

如何使用 applescript 完成此操作?

set r to the clipboard
write_string(r as text)

on write_string(the_string)
    tell application "System Events"
        
        repeat with the_character in the_string
            keystroke the_character
            delay (random number from 0.05 to 0.25)
        end repeat
        
    end tell
end write_string

Shell 我是这样使用这部分的吗?

write_string(r as text) encode('utf8')?

仅复制并粘贴俄语单词的解决方案不起作用。需要写。

请指点挖哪条路。有什么想法吗?

System Events 使用 keystrokekey code 时,它在 selected 输入的上下文中这样做来源 列于:系统偏好设置 > 键盘 > 输入源

换句话说,使用Google翻译“如何做到这一点?” 俄语,“Как это можно сделать с помощью?”,复制到剪贴板,我当前的输入源U.S.,然后 系统事件 输出:aaa aaa aaaaa aaaaaaa a aaaaaaa?

要获得“Как это можно сделать с помощью?”需要手动切换或以编程方式将 输入源 切换为例如俄语系统事件 使用 keystroke 来产生所需的结果。

下面显示的示例AppleScript代码在[=65=中进行了测试macOS Catalina 下的 ]Script Editor 以及 System Preferences 中的 Language & Region 设置在系统偏好设置 > 中转到英语(美国)— 主要 和两个 输入源键盘 > 输入源U.S、俄语,以及毫无问题地为我工作1.

  • 1 系统偏好设置 > 安全与隐私[=] 中假定必要且适当的设置115=] > 隐私 已根据需要 set/addressed。

示例 AppleScript 代码:

set the clipboard to "Как это можно сделать с помощью?"

set theRussianText to the clipboard

my writeString(theRussianText)

to writeString(theString)
    set theStringList to characters of theString
    tell application "System Events"
        key code 49 using control down --   ⌃Space
        delay 0.25
        repeat with thisCharacter in theStringList
            keystroke thisCharacter
            delay (random number from 0.05 to 0.25)
        end repeat
        key code 49 using control down --   ⌃Space
    end tell
end writeString

备注:

这使用默认的键盘快捷方式,在系统偏好设置 > 键盘 > 快捷方式 > 输入源,到select上一个输入源,因为我只列出了两个并且已经设置为 U.S., ⌃Space 切换到 俄语 然后又回到 U.S. 第二次执行时.

如果在系统偏好设置 > 键盘 > [中有两个以上的输入源 > Input Sources,那么您将需要以不同的方式进行处理。

作为示例,我使用了第三方实用程序 InputSourceSelector,如下示例 AppleScript 代码:

set the clipboard to "Как это можно сделать с помощью?"

set theRussianText to the clipboard

my writeString(theRussianText)

to writeString(theString)
    set theStringList to characters of theString
    my switchInputSourceTo("com.apple.keylayout.Russian")
    delay 0.25
    tell application "System Events"
        repeat with thisCharacter in theStringList
            keystroke thisCharacter
            delay (random number from 0.05 to 0.25)
        end repeat
    end tell
    my switchInputSourceTo("com.apple.keylayout.US")
end writeString

to switchInputSourceTo(thisInputSource)
    do shell script ¬
        "/usr/local/bin/InputSourceSelector" & ¬
        space & "select" & space & thisInputSource
end switchInputSourceTo


正如您在脚本编辑器截取的屏幕截图底部看到的那样,以紫色文本显示“Как это можно сделать с помощью?”已输入。



注意:示例 AppleScript code 就是这样,没有任何包含的 错误处理 不包含任何额外的 错误处理 可能是适当的。用户有责任根据需要或需要添加任何 错误处理 。查看 try statement and error statement in the AppleScript Language Guide. See also, Working with Errors. Additionally, the use of the delay 命令 在适当的事件之间可能是必要的,例如delay 0.5,适当设置延迟

user3439894,您好!对于临时语言更改,您的 Big Sur 代码有效。谢谢你。我只做了一些小改动(延迟+命令)。

set the clipboard to " Как это можно сделать с помощью?"
set r to the clipboard
write_string(r as text)

on write_string(the_string)
    
    tell application "System Events"
        key code 49 using command down --   ⌃Space
        delay 0.5
        repeat with the_character in the_string
            keystroke the_character
            delay (random number from 0.05 to 0.25)
        end repeat
        delay 0.5
        key code 49 using command down --   ⌃Space
    end tell
    
end write_string

但我想在算法本身理解以何种编码写入复制的文本时找到解决方案。例如,如果我复制日语字符而不是俄语(我已经安装在系统中),并且算法将准确地将日语字符输入到字段中,您认为这可能吗? 也许 javascript?

此解决方案使用由 jackjr300 in his answer: Is it possible to keystroke special characters in AppleScript?

编写的 代码

使用 Xcode,我创建了 命令行工具 TypeCharacters 并将其复制到 /usr/local/bin/

然后我将它合并到下面的 example AppleScript code:

set the clipboard to "Русские персонажи & 日本語の文字"

set thisText to the clipboard

tell application "Safari" to activate
delay 0.5

my typeCharactersOf(thisText)

to typeCharactersOf(thisString)
    set theStringList to characters of thisString
    repeat with thisCharacter in theStringList
        do shell script ¬
            "/usr/local/bin/TypeCharacters " & ¬
            quoted form of thisCharacter
        delay (random number from 0.05 to 0.25)
    end repeat
end typeCharactersOf

其输出为:


备注:

我使用 Google Translate 将“俄语字符”翻译成 俄语、Русские персонажи 和“日语字符”转 日语、日本语の文字.

通过将此网站上的 Safari 写入答案文本框进行测试,无论 输入源 是什么,结果都是一样的设置为。

示例 AppleScript 代码,如上所示,已在 [=58= macOS Catalina 下的 ]Script Editor 以及 System Preferences 中的 Language & Region 设置到 英语(美国)— 系统偏好设置 > 中的主要 和两个 输入源键盘 > 输入源U.S、俄语,以及毫无问题地为我工作1.

  • 1 系统偏好设置 > 安全与隐私[=] 中假定必要且适当的设置92=] > 隐私 已根据需要 set/addressed。

链接答案中用于创建 命令行工具 TypeCharacters Xcode 的代码:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        if (argc > 1) {
            NSString *theString = [NSString stringWithUTF8String:argv[1]];
            UniChar uChar;
            CGEventRef keyEvent = CGEventCreateKeyboardEvent(nil, 0, true);
            for (int i = 0; i < [theString length]; i++)
            {
                uChar = [theString characterAtIndex:i];
                CGEventKeyboardSetUnicodeString(keyEvent, 1, &uChar);
                CGEventPost(kCGHIDEventTap, keyEvent); // key down
                CGEventSetType(keyEvent, kCGEventKeyUp);
                CGEventPost(kCGHIDEventTap, keyEvent); // key up (type the character)
                CGEventSetType(keyEvent, kCGEventKeyDown);
                [NSThread sleepForTimeInterval:0.001]; // wait 1/1000 of second, no need of this line on my computer, I use 0.001 to be safe, increase it If you still have issues
            }
            CFRelease(keyEvent);
        }
    }
    return 0;
}


注意:示例 AppleScript code 就是这样,没有任何包含的 错误处理 不包含任何额外的 错误处理 可能是适当的。用户有责任根据需要或需要添加任何 错误处理 。查看 try statement and error statement in the AppleScript Language Guide. See also, Working with Errors. Additionally, the use of the delay 命令 在适当的事件之间可能是必要的,例如delay 0.5,适当设置延迟