コマンドラインから英和・和英翻訳をする

少し前に、Google翻訳サービスでインクリメント翻訳ができるようになりました。タイプするそばから翻訳されていくのは見てておもしろいし、いちいち翻訳ボタンを押さなくても良いので便利になりました。でも、ちょっと意味を確認したいだけなのに、Google翻訳のページに行くのが面倒くさい... (*゚0゚)ハッ!! Google翻訳で英和・和英翻訳するコマンドがあれば良くね?ってことで作りました。Pythonで。以下のソースをe2jというファイル名で保存してください。ちなみに実行環境はUbuntu 9.10、Python 2.6.4です。

#!/usr/bin/python
#-*- coding:utf8 -*-

import sys 
import urllib
import urllib2
import json
import pynotify

def translate(from_lang='en', to_lang='ja', word=''):
    url = 'http://ajax.googleapis.com/ajax/services/language/translate'
    values = {'v': 1.0,
              'q': word,
              'langpair': from_lang + '|' + to_lang}
    str_GET = urllib.urlencode(values)
    req = urllib2.Request(url, str_GET)
    res = urllib2.urlopen(req)
    data = json.loads(res.read())
    if data['responseStatus'] == 200:
        return data['responseData']['translatedText']
    else:
        msg = data['responseDetails'] if data['responseDetails'] else str(data['responseStatus'])
        return 'error: ' + msg 


if __name__ == '__main__':
    result = translate('en', 'ja', sys.argv[1])  # 英語を日本語に
    print sys.argv[1] + ':' + result
    pynotify.init('e2j')
    n = pynotify.Notification(sys.argv[1], result, "dialog-information")
    n.set_timeout(3000)  # 3秒だけ表示されるらしいが...
    n.show()

実行の仕方は、ファイルに実行権限を与えて

 % e2j system

と、実行すればsystemという単語の日本語訳が表示されます。このスクリプトで行っているのはGoogle翻訳APIを用いて翻訳を行い、JSON形式で返ってきた翻訳結果を表示します。ですが、結果の表示をコマンドラインに表示するだけなのはおもしろくなかったので、pynotifyというパッケージを使ってみました。Google翻訳APIについては以下のページを参考にしました。

pynotifyは /usr/share/doc/python-notify/examples の中にあったサンプルプログラムを参考にしました。
プログラムを実行すると、こんなのが画面の右上に現れるはずです。

左側のアイコンはプログラム中のpynotify.Notification()メソッドの第三引数で指定できます。具体的にどこからアイコン画像を取って来ているかわかりませんが、/usr/share/icons/gnome/scalable の中にあるactionsとかstatusemotesフォルダ内のアイコン名を指定するとアイコンが表示されます。

これで完成したと思ってたけど、set_timeout()メソッドで翻訳結果が表示される時間を指定できるらしいができてない orz
set_timeout()の値を大きくしても、小さくしても10秒間(デフォルト?)表示し続けてしまう(´・ω・`)ショボーン
10秒も表示されるのはウザいので、set_timeout(0)にした。こうすると、翻訳結果が以下のように表示されるようになる。

(´〜`)うーん、何で表示時間を指定できないのだろうか...。まぁ、とりあえずこれで完成ってことにしよう。ちなみに、和英にするにはtranslate()関数呼び出しの部分を、

result = translate('ja', 'en', sys.argv[1])  # 日本語を英語に

って書き換えるだけです。なので、仏日・日仏翻訳などもすぐに作れると思います。多分。