lib/google_translate/google_translate.rb in google-translate-0.8.8 vs lib/google_translate/google_translate.rb in google-translate-1.0.0
- old
+ new
@@ -1,71 +1,82 @@
-# google_translate.rb
+#encoding: UTF-8
-require 'open-uri'
-
-require 'cgi'
+require 'net/http'
require 'json'
+require 'tempfile'
class GoogleTranslate
GOOGLE_TRANSLATE_SERVICE_URL = "http://translate.google.com"
- def self.Exception(*names)
- cl = Module === self ? self : Object
+ def supported_languages
+ response = call_service GOOGLE_TRANSLATE_SERVICE_URL
- names.each { |n| cl.const_set(n, Class.new(Exception)) }
+ from_languages = collect_languages response.body, 0, 'sl', 'gt-sl'
+ to_languages = collect_languages response.body, 1, 'tl', 'gt-tl'
+
+ [from_languages, to_languages]
end
- Exception :MissingFromLanguage, :MissingToLanguage, :MissingTextLanguage, :TranslateServerIsDown,
- :InvalidResponse, :MissingText, :MissingTestText
+ def translate(from_lang, to_lang, text, options={})
+ raise("Missing 'from' language") unless from_lang
+ raise("Missing 'to' language") unless to_lang
+ raise("Missing text for translation") unless text
- def translate(from, to, from_text, options={})
- raise(MissingFromLanguage) if from.nil?
- raise(MissingToLanguage) if to.nil?
- raise(MissingTextLanguage) if from_text.nil?
+ result = JSON.parse(call_translate_service(from_lang, to_lang, text))
- begin
- url = GOOGLE_TRANSLATE_SERVICE_URL + "/translate_a/t?client=t&text=#{from_text}&hl=#{from}&sl=#{from}&tl=#{to}&multires=1&prev=btn&ssel=0&tsel=4&uptl=#{to}&alttl=#{from}&sc=1"
+ raise("Translate Server is down") if (!result || result.empty?)
- open(URI.escape(url)) do |stream|
- content = stream.read
+ result
+ end
- s = content.split(',').collect { |s| s == '' ? "\"\"" : s }.join(",")
+ def say lang, text
+ speech_content = call_speech_service(lang, text)
- result = JSON.parse(s)
+ file = Tempfile.new('.google_translate_speech')
- raise(TranslateServerIsDown) if (!result || result.empty?)
+ file.write(speech_content)
- # raise(InvalidResponse, result["responseDetails"]) if response.code.to_i != 200 # success
+ file.close
- r1 = result[0][0][0]
- r2 = result[0][0][2]
+ system "afplay #{file.path}"
- [r1, r2]
- end
- rescue Exception => e
- raise(TranslateServerIsDown)
- end
+ file.unlink
end
- def supported_languages
- fetch_languages(GOOGLE_TRANSLATE_SERVICE_URL, [])
+ private
+
+ def translate_url(from_lang, to_lang)
+ "#{GOOGLE_TRANSLATE_SERVICE_URL}/translate_a/t?client=t&sl=#{from_lang}&tl=#{to_lang}&hl=pl&sc=2&ie=UTF-8&oe=UTF-8&prev=enter&ssel=0&tsel=0&"
end
- private
+ def speech_url(lang)
+ "#{GOOGLE_TRANSLATE_SERVICE_URL}/translate_tts?tl=#{lang}&ie=UTF-8&oe=UTF-8"
+ end
- def fetch_languages(request, keys)
- response = {}
- open(URI.escape(request)) do |stream|
- content = stream.read
+ def call_service url, text=nil
+ uri = URI.parse(URI.escape(url))
- from_languages = collect_languages content, 0, 'sl', 'gt-sl'
- to_languages = collect_languages content, 1, 'tl', 'gt-tl'
+ http = Net::HTTP.new(uri.host, uri.port)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.set_form_data(text: text)
- response[:from_languages] = from_languages
- response[:to_languages] = to_languages
- end
+ http.request(request)
+ end
- response
+ def call_translate_service from_lang, to_lang, text
+ url = translate_url(from_lang, to_lang)
+
+ response = call_service url, text
+
+ response.body.split(',').collect { |s| s == '' ? "\"\"" : s }.join(",") # fix json object
+ end
+
+ def call_speech_service lang, text
+ url = speech_url(lang)
+
+ response = call_service url, text
+
+ response.body
end
def collect_languages buffer, index, tag_name, tag_id
languages = []