読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

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