vimでgoogle翻訳(perl編)

※2009/12/29追記
「'」「"」のエスケープ処理を追記しました。


※2009/12/27追記
setlocal modifiable
を追記しました。



探してみた

vimで翻訳できないかと探してみたら、以下のページがヒットしました。

VimGoogle翻訳ナレッジエース
http://blog.blueblack.net/item_410

でもこれ別ファイルにrubyスクリプト用意しないといけないんですよねー。ちょっと面倒。


で、たまたま以下のページを見つけて「ワンライナーで出来るのでは?」と。
Google AJAX Language API で翻訳する:楽:勝手Perlリファレンス
http://perl.bayashi.jp/archives/entry/subroutine/get-something/2008/002309.html

初vimscript

上記urlを参考にvimscirptを作ってみました。
vimscriptくせがあって書きずらい…

あとWebService::Simpleが必要なので

cpan WebService::Simple

しておきましょう。

"Google翻訳
function! Google_translate(trn) range
    setlocal previewheight=6
    let tmp = @@
    silent normal gvy
    let tx = @@
    let tx = substitute(tx, "\n", ' ',  'g')
    let tx = substitute(tx, '"',  '""', 'g')
    let tx = substitute(tx, "'",  "''", 'g')
    let dst = "GoogleTranslateOutput"
    " preview
    silent execute ":pedit! " . dst
    wincmd P
    setlocal buftype=nofile
    setlocal noswapfile
    setlocal syntax=none
    setlocal bufhidden=delete
    setlocal wrap
    setlocal modifiable
    " perl one liner
    silent execute ':%! perl -MWebService::Simple -e ''exit if @ARGV==0;my $t = WebService::Simple->new(base_url => "http://ajax.googleapis.com/ajax/services/language/translate",response_parser=>"JSON",params=>{v=>"1.0",langpair=>"'.a:trn.'",});my $r=$t->get({q=>$ARGV[0],}); print $r->parse_response->{responseData}->{translatedText};'' ''' . tx . ''' 2>&1 '
    wincmd P
endfunction
"<Leader>teで英語→日本語翻訳
vnoremap <silent> <Leader>te :call Google_translate("en\|ja")<CR>
"<Leader>tjで日本語→英語翻訳
vnoremap <silent> <Leader>tj :call Google_translate("ja\|en")<CR>

こいつを.vimrcに入れといて、ビジュアルモードでテキストを選択して
英語→日本語翻訳は「te」
日本語→英語翻訳は「tj」
で翻訳できます。*1
せっかくなので相互変換できるようにしてみました。
文字コードによっては化けそうな気もしますが。
まあ自分の環境では問題なく変換できてるので良しとします!

*1:google翻訳自体が微妙なのはナイショだよ!