Google翻訳APIで文字列の翻訳と言語の判定を行うモジュール
昨日の続き。Google翻訳APIでは文字列の言語を特定する機能も提供されているので、それを利用して元の言語を自動判定してから翻訳するようにしてみました。これで言語を気にせずにがしがし変換できます。ついでにto_itやto_frなど翻訳可能な言語に対応する変換メソッドもひととおり定義するように修正。
サンプル
翻訳のサンプルは以下。
require 'translate' Translate.set_proxy( "http://proxy.com:80" ) # 必要なら str = "こんにちは こんにちは" # 言語特定 puts str.detect # 翻訳 puts str.to_en puts str.to_it puts str.to_fr
実行結果です。
ja Hello Hello Ciao Ciao Bonjour Bonjour
モジュールのソース
require 'rubygems' require 'json/lexer' require 'httpclient' require 'uri' #Google 翻訳APIで翻訳するモジュール module Translate URL = "http://ajax.googleapis.com/ajax/services/language" LANGUAGES = [ :ar, #アラビア語 :bg, #ブルガリア語 :zh, #中国語 :zh_CN, #中国語簡体 :zh_TW, #中国語繁体 :ca, #カタロニア語 :hr, #クロアチア語 :cs, #チェコ語 :da, #デンマーク語 :en, #英語 :tl, #フィリピノ語 :fi, #フィンランド語 :fr, #フランス語 :de, #ドイツ語 :el, #ギリシャ語 :iw, #ヘブライ語 :hi, #ヒンディー語 :id, #インドネシア語 :it, #イタリア語 :ja, #日本語 :ko, #韓国語 :lv, #ラトビア語 :lt, #リトアニア語 :no, #ノルウェー語 :pl, #ポーランド語 :pt_PT, #ポルトガル語 :ro, #ルーマニア語 :ru, #ロシア語 :es, #スペイン語 :sr, #セルビア語 :sk, #スロバキア語 :sl, #スロベニア語 :sv, #スウェーデン語 :uk, #ウクライナ語 :vi, #ベトナム語 ] @@proxy = ENV["http_proxy"] #プロキシ設定を行なう。 def self.set_proxy( proxy ) @@proxy = proxy @@client = nil end #文字列を指定された言語に翻訳する。 def self.translate( q, from, to ) @@client ||= HTTPClient.new( @@proxy, "client") result = @@client.get( "#{URL}/translate?v=1.0&q=#{URI.encode(q)}&langpair=#{from}%7C#{to}" ) parsed = JSON::Lexer.new(result.content).nextvalue raise parsed["responseDetails"].to_s if parsed["responseStatus"] != 200 parsed["responseData"]["translatedText"] end #文字列の言語を判定する。 def self.detect( q ) @@client ||= HTTPClient.new( @@proxy, "client") result = @@client.get( "#{URL}/detect?v=1.0&q=#{URI.encode(q)}" ) parsed = JSON::Lexer.new(result.content).nextvalue raise parsed["responseDetails"].to_s if parsed["responseStatus"] != 200 parsed["responseData"]["language"].to_sym end end class String # 文字列を翻訳する。 Translate::LANGUAGES.each {|lang| define_method( "to_#{lang}" ) { to = lang.to_s.sub( /_/, "-" ).to_sym str = Translate.translate( self, @language || detect, to ) str.language = to str } } #文字列の言語を判定する。 def detect @language = Translate.detect( self ) end #言語 attr :language, true end