3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-12-13

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

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

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

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

こんな感じの動き

スクリーンショット 2019-12-13 17.24.24.png
↓↓↓↓↓↓↓↓↓↓↓↓↓[Cmd+c]↓↓↓↓↓↓↓↓↓↓↓↓↓
スクリーンショット 2019-12-13 17.23.19.png
やった!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

手元の環境

  • 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))

最後に

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?