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