2012年12月20日木曜日

Bing Translator APIを使ったSublime Text 2の翻訳プラグインが無かったので作った話

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

http://www.flickr.com/photos/89031137@N00/5612615769/


Sublime Text 2 Advent Calendar 2012の12/20(木)担当の@sys1yagiです。最近Sublime Text 2に入門しました。

はじめに


Sublime Text 2をちらーっと触って、へーいいんじゃね、と思ってしばらく放置して
また触って、プラグイン入れて、あーいいじゃん、と思ってしばらく放置して
C言語とか触る事になって「SublimeClang」とか「CTags」とか入れてたら前回エントリっつーかAndroid Advent Calendarネタの「aaptを修正してres配下でディレクトリ階層を構築できるようにして、AOSPにrepo uploadした話」でSublime Text 2が活躍しちゃってすっかり離れられなくなった次第というわけで。
そしてプラグインがpythonで書けるという事で。
pythonは何故か無条件で好きなので、せっかくだしプラグイン書いて見ようかと思ってまず書いてみたのが
Sublime Text 2のステータスバー上で素数を数えるだけの画期的なプラグインを作りました。」です。
まぁそれではちょっと味気ないのでもうちょっと使えそうなの作ろうかと思って、まず

Google翻訳APIかTwitterAPIやな!

と思ってたら
Sublime-Text-2-GoogleTranslate-Plugin
とか
Sublime-Tweet
とか
TweetLine(Sublime Text 2 Advent Calendar 9日目 ST2からTwitterに投稿するプラグイン作った@fukayatsuさん作)
とか

既にあるやんけ!

という事で、絶望していたら

無償の Bing Translation APIを使用する(20110407)
Microsoftの翻訳APIはすごいと聞いたので使ってみた。Rubyで。

とか見つけて

よっしゃBing Translator APIで!


という次第。

どんなプラグイン?


Sublime Text 2上で選択したテキストをBing Translator APIで翻訳して、結果を別ファイルに表示するやつ。
これが

こう


詳細は下部でくやしく。

完成!


はい完成!
SublimeBingTranslator
ソースはそんなに長くないけど全部載せると長いので幾つか使ったAPIとかtips的なのをちょい並べます。

日本語に対応する


翻訳プラグインなので英語→日本語に翻訳したりします。
翻訳結果を表示する為にsublimte text 2が提供しているAPIに日本語の文字列を渡すと以下の様なエラーが出てしまします。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
はいはい〜っと
# -*- coding:utf-8 -*-
を追加。
が、ダメ。

最終的にはこれをimport文の後に追加しました。
reload(sys)
sys.setdefaultencoding("utf-8")
これでSublime Text 2の各種APIに日本語が渡せます。

※その代わりにコンソールにprint文やエラーが表示されないので注意
※反映させるにはSublime Text 2を再起動する必要があります。はずす時も。

スレッドを使う


スレッドは普通に使えます。
import threading

settings.thread = threading.Thread(target=self, args=(command, edit, source_text, _from, to,))
settings.thread.setDaemon(True)
settings.thread.start()
targetにメソッド。argsに引数を渡してstartするとスレッドで実行できます。
ここではselfを渡しています。
selfというかオブジェクトを渡した場合は暗黙的に
__call__()メソッドが実行されます。
今回は
__call__(self, command, edit, source_text, _from, to)
というメソッドを実装しました。

スレッドからSublime Text 2 APIを呼び出す


スレッドで処理した後、何らかの結果をSublime Text 2側に返したくなります。
普通にAPIをコールすると怒られるのでsublime.set_timeoutを使ってメインスレッドで実行してもらう様に登録します。
sublime.set_timeout(lambda:self.show_result(edit, source_text, translated), 100)
第一引数にメソッド、第二引数にdelayをミリ秒で指定します。
今回はlambda式で結果表示用メソッドを呼び出しています。

新しいファイルを開き結果を表示する


pluginでというかSublime Text 2で使える結果表示の方法は以下しか選択肢がないっぽいです。

  • クイックパネルに出す
  • ステータスバーに出す
  • ブラウザ等外部アプリケーションを開く
  • 新しいファイルを作成する
  • コード補正の奴で出す
  • アウトプットパネルに出す

  • なんだかなぁと思いつつ、今回はあたらしいfileを開いて結果をinsertする事にしました。
    ファイル操作する場合はTextCommandを使う必要があるっぽいです。
    TextCommandは実行時にEditオブジェクトを渡してくれます。
    これを使ってファイル操作を行います。

    view.insert(edit, 0, result)
    

    viewは新しく作ったファイルのViewオブジェクト。insertメソッドにEditオブジェクトとオフセットと追加する文字列を渡しています。
    先頭に追加する場合はオフセットを常に0にしとけばいいので楽です。

    インストールの仕方


    インストールはpackage_control_channelに登録したので簡単です。
    Sublime Package Controlがインストールされているものとします。

    インストールする


    Cmd+Shift+PでCommand Paletteを開き、"install"を入力


    インストールするプラグインを絞り込む為に"Bing Trasnlator"と入れると出てきます。


    ※インストール後Sublime Text 2の再起動が必要です

    使い方


    Readme読めと言いたい所ですが、簡単なので。

    翻訳設定


    [Preference]-[Package Settings]-[SublimeBingTranslator]-[Settings - Default]
    で翻訳設定をいじれます。
    デフォルトは以下です。
    {
     //Translator Language Codes
     //http://msdn.microsoft.com/en-us/library/hh456380.aspx
        "from" : "en",
        "to" : "ja"
    }
    

    適宜from, toを書き換えて下さい。
    言語コードは以下にあります。
    http://msdn.microsoft.com/en-us/library/hh456380.aspx

    from-to 翻訳する


    cmd + shift + m
    

    選択したテキストを翻訳します。
    from=en
    to=ja
    の場合以下の様になります。

    これが

    こう


    新しいファイルを開き、翻訳前と翻訳後を表示します。
    普通のファイルなので保存してもいいし編集も出来ます。
    このファイルIDを保持しているのでプロセスが生きている間は翻訳結果がこのファイルに追記されていきます。
    なんか翻訳結果が怪しいけど気にしない!

    to-from 翻訳する


    cmd + shift + alt + m
    

    これでto-fromで翻訳出来ます。


    こう


    おわりに


    Sublime Text 2おもろいでー
    あと「Advent Calendarとかまだ自分には早いわー」とか思ってる場合じゃない!
    脊髄反射で飛び込んでこそ面白い体験が待っているのだ。
    とか何とか思った。疲れるけど。

    1 件のコメント:

    1. 英語翻訳プラグインを探していたたどりついたのですが
      Sublime Text 3では使えないでしょうか?

      返信削除