lib/google_translate.rb in google-translate-0.7.2 vs lib/google_translate.rb in google-translate-0.8.0

- old
+ new

@@ -3,100 +3,81 @@ require 'open-uri' require 'cgi' require 'json' module Google + Language = Struct.new(:name, :code) do def to_s "(" + code + ": " + name + ")" end end class Translator + GOOGLE_TRANSLATE_SERVICE_URL = "http://translate.google.com" + def self.Exception(*names) cl = Module === self ? self : Object names.each {|n| cl.const_set(n, Class.new(Exception))} end Exception :MissingFromLanguage, :MissingToLanguage, :MissingTextLanguage, :TranslateServerIsDown, :InvalidResponse, :MissingText, :MissingTestText - URL_STRING = "http://ajax.googleapis.com/ajax/services/language/" - URL2_STRING = "http://translate.google.com" - def translate(from, to, from_text, options={}) raise(MissingFromLanguage) if from.nil? raise(MissingToLanguage) if to.nil? raise(MissingTextLanguage) if from_text.nil? - request = URL_STRING + "translate?v=1.0&langpair=#{from}%7C#{to}&q=" + CGI.escape(from_text) - begin - response = call_service(request, [:response_status, :response_details, :response_data]) + url = GOOGLE_TRANSLATE_SERVICE_URL + "/translate_a/t?client=t&text=#{from_text}&hl=#{from}&tl=#{to}" + # &sl=auto&multires=1&prev=btn&ssel=0&tsel=4&uptl=ru&alttl=en&sc=1 - raise(TranslateServerIsDown) if response.empty? + open(URI.escape(url)) do |stream| + content = stream.read - raise(InvalidResponse, response[:response_details]) if response[:response_status] != 200 # success + s = content.split(',').collect {|s| s == '' ? "\"\"" : s}.join(",") - to_text = response[:response_data]['translatedText'] + result = JSON.parse(s) - (options[:html]) ? CGI.unescapeHTML(to_text) : to_text - rescue OpenURI::HTTPError - raise(TranslateServerIsDown) - end - end + raise(TranslateServerIsDown) if (!result || result.empty?) - def detect_language(test_text) - raise(MissingTestText) if test_text.nil? + # raise(InvalidResponse, result["responseDetails"]) if response.code.to_i != 200 # success - request = URL_STRING + "detect?v=1.0&q=" + CGI.escape(test_text) - - begin - response = call_service(request, [:response_data]) - response_data = response[:response_data] - - raise(TranslateServerIsDown) if response.empty? - - response_data - rescue OpenURI::HTTPError - raise(TranslateServerIsDown) + to_text = result[0][0][0] + translit = result[0][0][2] + (options[:html]) ? CGI.unescapeHTML(translit) : translit + end + rescue Exception => e + raise(TranslateServerIsDown) end end + +# def detect_language(test_text) + # raise(MissingTestText) if test_text.nil? + + # begin + # response = self.class.get("/detect", :query => {:q => test_text}) + # response = (response && response.parsed_response) ? response.parsed_response : nil + # raise(TranslateServerIsDown) if (!response || response.empty?) + # response_data = response["responseData"] + # return response_data + # rescue HTTParty::ResponseError + # raise(TranslateServerIsDown) + # end + #end + def supported_languages - call_service2(URL2_STRING , []) + fetch_languages(GOOGLE_TRANSLATE_SERVICE_URL , []) end private - def camelize(str) - words = str.split('_') - - words[0] + words[1..-1].map {|w| w.capitalize}.join - end - - def call_service(request, keys) + def fetch_languages(request, keys) response = {} - open(request) do |stream| - content = stream.read - - unless content.nil? - json = JSON.parse(content) - - keys.each do |key| - response[key] = json[camelize(key.to_s)] - end - end - end - - response - end - - def call_service2(request, keys) - response = {} - open(URI.escape(request)) do |stream| content = stream.read from_languages = collect_languages content, 0, 'sl', 'gt-sl' to_languages = collect_languages content, 1, 'tl', 'gt-tl' @@ -130,11 +111,15 @@ pos = text.index(stopper) text = text[0..pos] end re2 = /<option(\s*)value="([a-z|A-Z|-]*)">([a-z|A-Z|\(|\)|\s]*)<\/option>/ - matches = text.gsub(/selected/i, '').squeeze.scan(re2) + + if matches.size == 0 + re2 = /<option(\s*)value=([a-z|A-Z|-]*)>([a-z|A-Z|\(|\)|\s]*)<\/option>/ + matches = text.gsub(/selected/i, '').squeeze.scan(re2) + end matches.each do |m| languages << Language.new(m[2], m[1]) end