【Mac】コピーした文章を翻訳してポップアップしてくれるスクリプト


英語の勉強のため英論文を読むが、何よりもテンポ感が大切。

時にはGoogle翻訳様に頼ることで、睡魔に打ち勝つ。

その際、いちいちコピペするよりは、コピーのみで翻訳結果をポップアップ表示してくれたら便利。

ということで作ってみました。
(動作するアプリを選べるようにしたので、関係ないアプリでポップアップが出てイライラすることもない←地味に大切)

こんな感じの動き


↓↓↓↓↓↓↓↓↓↓↓↓↓[Cmd+c]↓↓↓↓↓↓↓↓↓↓↓↓↓

やった!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

手元の環境

  • macOS Catalina 10.15.1
  • Python 3.7.4

必要なパケ

pip install pyperclip
pip install googletrans

実装

translator.py
import os
import time
import pyperclip
from googletrans import Translator
from AppKit import NSWorkspace

# アクティブウィンドウ取得用
workspace=NSWorkspace.sharedWorkspace()

log, sentence = None, None
while True:
    # クリップボードが更新されると抜ける
    while sentence is None or sentence == log:
        time.sleep(0.1)

        # クリップボード取得
        sentence = pyperclip.paste()

        # 放置するとNoneになるので回避
        if sentence is None:
            continue

        # 初期起動時にはポップアップしない
        if log is None:
            log = sentence
            continue

        # ちょっとした整形 (不要なら消してもいい。)
        sentence = sentence.replace("\n"," ")
        sentence = sentence.replace("- ","")

    log = sentence

    # アクティブウィンドウを取得+フィルタ
    appname=workspace.activeApplication()["NSApplicationName"]
    if appname not in ["プレビュー"]:
        continue

    # google翻訳
    translated = Translator().translate(sentence,src = "en" ,dest = "ja").text

    # 翻訳結果をアラート表示
    os.system("osascript -e 'display dialog \"{}\"'".format(translated))

実行

基本動かしっぱなし。

python3 translator.py

ちょっとした解説

pyperclip

クリップボードを取得できます。

import pyperclip
sentence = pyperclip.paste()

googletrans

google翻訳のAPIを叩いてくれるパッケージ。
srcに元の言語、destに翻訳先の言語を入れれば、英和訳以外にも使えます。

from googletrans import Translator
translated = Translator().translate(sentence,src = "en" ,dest = "ja").text

AppKit NSWorkspace

現在のアクティブウィンドウ名を取得できます。
これで翻訳を動作させるアプリを選択。
プレビュー以外で動作させたい場合は、とりあえずappnameを表示してみるべし。

from AppKit import NSWorkspace
workspace=NSWorkspace.sharedWorkspace()
# アクティブウィンドウを取得+フィルタ
appname=workspace.activeApplication()["NSApplicationName"]
# アクティブウィンドウ取得用
if appname not in ["プレビュー"]:
    continue

クリップボード監視

キー入力監視まですればベターかもしれないけれど、とりあえず0.1秒ごとにクリップボードを監視する形で乗り切った。
(バックグラウンドで動くキー監視用のpython3パッケージあったら教えてください。。。)

#クリップボードが更新されると抜ける
# クリップボードが更新されると抜ける
while sentence is None or sentence == log:
    time.sleep(0.1)

    # クリップボード取得
    sentence = pyperclip.paste()

    # 放置するとNoneになるので回避
    if sentence is None:
        continue

    # ちょっとした整形 (不要なら消してもいい。)
    sentence = sentence.replace("\n"," ")
    sentence = sentence.replace("- ","")
log = sentence

ポップアップ通知

色々試した結果、AppleScript経由に落ち着いた。
os.systemを使って、コマンドラインに投げるとポップアップしてくれます。
いと便利あはれたてまつる。

os.system("osascript -e 'display dialog \"{}\"'".format(translated))

最後に

超便利。。。
人としてどんどんダメになっていく気がする。。。