module GTranslate
class Client
@@translate_url = 'http://translate.google.com/translate_t'
@@result_dom_id = :result_box
@@result_regex = /
]*id=#{@@result_dom_id}[^>]*>(([^<]|
|
)*)/u
@@translation_pairs = {
'ar' => ['en'],
'zh' => ['en'],
'nl' => ['en'],
'en' => ['ar', 'zh', 'nl', 'fr', 'de', 'el', 'it', 'ja', 'ko',
'pt', 'ru', 'es','hi','he'],
'fr' => ['en', 'de'],
'de' => ['en', 'fr'],
'el' => ['en'],
'it' => ['en'],
'ja' => ['en'],
'ko' => ['en'],
'pt' => ['en'],
'ru' => ['en'],
'es' => ['en'],
'hi' => ['en'],
'he' => ['en']
}
# Execute request for google translate
#
# ==== Parameters
# opts:: An options hash (see below)
#
# ==== Options (opts)
# :text:: The source text you want translated
# :source:: Source language in iso_639_2 format
# :target:: Target language in iso_639_2 format
#
# ==== Returns
# String:: The translated text
#--
# @public
def request( opts = {} )
return '' unless translatable?( opts[:source], opts[:target] )
the_language_pair, and_text =
language_pair_for( opts[:source], opts[:target] ), opts[:text]
the_response = get_response_given( the_language_pair, and_text )
return extracted_result_from( the_response )
end
protected
def translatable?( source, target )
@@translation_pairs[source] && @@translation_pairs[source].include?( target )
end
def get_response_given( language_pair, text )
require 'net/http'
require 'uri'
uri = URI.parse(@@translate_url)
http = Net::HTTP.new(uri.host, uri.port)
params = { :langpair => language_pair, :text => text, :hl => 'en', :ie => 'UTF8', :oe => 'UTF8' }
data = params.collect { |k, v| "#{k}=#{ URI.escape(v)}" }.join('&')
resp = http.post(uri.path, data)
resp.body
end
def language_pair_for( source, target )
"#{source}|#{target}".downcase
end
def extracted_result_from( string )
matches = string.match( @@result_regex )
CGI.unescapeHTML( scrub( matches && matches[1] ) )
end
def scrub( string ="")
string.split(/
|
/).collect { |chunk| chunk.strip }.join( "\n" )
end
end
end