crutch-google_translate 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 0
3
+ :patch: 3
4
+ :major: 0
@@ -0,0 +1,26 @@
1
+ #require 'open-uri'
2
+ require 'net/http'
3
+ require 'cgi'
4
+ require 'rubygems'
5
+ require 'json'
6
+
7
+ # google translate API gem
8
+ # This is based on the documentation found here
9
+ # http://code.google.com/apis/ajaxlanguage/documentation/#Versioning
10
+ # look for the paragraph 'Flash and other Non-Javascript Environments'
11
+ #
12
+ # look at the Translator and LanguageDetect class (or README file) for instructions
13
+ module GoogleTranslate
14
+ HOSTNAME = "ajax.googleapis.com"
15
+ PATH ="/ajax/services/language/"
16
+ VERSION = "1.0"
17
+ #USERAGENT = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1'
18
+
19
+ end
20
+
21
+ require 'google_translate/exceptions'
22
+ require 'google_translate/languages'
23
+ require 'google_translate/parsed_response'
24
+ require 'google_translate/api_call'
25
+ require 'google_translate/translator'
26
+ require 'google_translate/language_detect'
@@ -0,0 +1,31 @@
1
+ module GoogleTranslate
2
+ module ApiCall
3
+ def google_api_call(service,params,response_class,get=false)
4
+ data = []
5
+ params.each_pair {|key, value| data << "#{key}=#{value}" }
6
+ data_string = data.join('&')
7
+ headers = {
8
+ 'Referer' => 'http://www.here-goes-a-referreri',
9
+ 'Content-Type' => 'application/x-www-form-urlencoded',
10
+ }
11
+
12
+ if(get)
13
+ require 'uri'
14
+ response = Net::HTTP.get(URI.parse("http://#{HOSTNAME}#{PATH}#{service}?#{data_string}"))
15
+ else
16
+ response = Net::HTTP.new(HOSTNAME).post(PATH + service,data_string,headers)
17
+ end
18
+
19
+ raise GoogleUnavailable if response.nil? || response == ""
20
+ raise GoogleException if !get && response.code.to_i != 200
21
+
22
+ if(get)
23
+ parsed_response = response_class.new(response)
24
+ else
25
+ parsed_response = response_class.new(response.body)
26
+ end
27
+
28
+ parsed_response # return response class
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ module GoogleTranslate
2
+
3
+ # Invalid language (or more specifically not one in existing list)
4
+ class InvalidLanguage < Exception
5
+ end
6
+
7
+ # no response returned to request
8
+ class GoogleUnavailable < Exception
9
+ end
10
+
11
+ # the status of the response indicates an error
12
+ class GoogleException < Exception
13
+ end
14
+
15
+ # the detection of the language is deemed unreliable by google.
16
+ class UnreliableDetection < Exception
17
+ end
18
+
19
+ # if no string is furnished for translation or detection
20
+ class NoGivenString < Exception
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ module GoogleTranslate
2
+ # manage language detection based on a given string of text
3
+ # <b>how to use</b>:
4
+ # language = LanguageDetect.detect("il fait beau aujourd'hui") # returns "fr"
5
+ class LanguageDetect
6
+ extend ApiCall
7
+
8
+ SERVICE = "detect"
9
+ PARAMS = {"v" => "#{VERSION}"}
10
+
11
+ # detect the language of a given text.
12
+ def self.detect(text)
13
+ PARAMS["q"] = CGI.escape(text)
14
+ #the "true" parameter indicates that HTTP GET should be used (POST is only for translation)
15
+ response = google_api_call(SERVICE,PARAMS,DetectResponse,true)
16
+ raise UnreliableDetection if !response.is_reliable
17
+ response.language # return value
18
+ end
19
+ end
20
+
21
+ # to handle the detection response
22
+ class DetectResponse < ParsedResponse
23
+ attr_reader :language, :is_reliable, :confidence
24
+ def initialize(string)
25
+ super(string)
26
+ @language = @response_data['language']
27
+ @is_reliable = @response_data['isReliable']
28
+ @confidence = @response_data['confidence']
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,45 @@
1
+ module GoogleTranslate
2
+
3
+ ARABIC = "ar"
4
+ BULGARIAN = "bg"
5
+ CATALAN = "ca"
6
+ CHINESE = "zh"
7
+ CHINESE_SIMPLIFIED = "zh-CN"
8
+ CHINESE_TRADITIONAL = "zh-TW"
9
+ CROATIAN = "cr"
10
+ CZECH = "cs"
11
+ DANISH = "da"
12
+ DUTCH = "nl"
13
+ ENGLISH = "en"
14
+ FILIPINO = "tl"
15
+ FINNISH = "fi"
16
+ FRENCH = "fr"
17
+ GERMAN = "de"
18
+ GREEK = "el"
19
+ HEBREW = "iw"
20
+ HINDI = "hi"
21
+ INDONESIAN = "id"
22
+ ITALIAN = "it"
23
+ JAPANESE = "ja"
24
+ KOREAN = "ko"
25
+ LATVIAN = "lv"
26
+ LITHUANIAN = "lt"
27
+ NORWEGIAN = "no"
28
+ POLISH = "pl"
29
+ PORTUGESE = "pt"
30
+ ROMANIAN = "ro"
31
+ RUSSIAN = "ru"
32
+ SERBIAN = "sr"
33
+ SLOVAK = "sk"
34
+ SLOVENIAN = "sl"
35
+ SPANISH = "es"
36
+ SWEDISH = "sv"
37
+ UKRANIAN = "uk"
38
+ VIETNAMESE = "vi"
39
+
40
+ LANGUAGES = [ARABIC, BULGARIAN, CATALAN, CHINESE, CHINESE_SIMPLIFIED,CHINESE_TRADITIONAL,
41
+ CROATIAN, CZECH, DANISH, DUTCH, ENGLISH, FILIPINO, FRENCH, GERMAN, GREEK, HEBREW,
42
+ ITALIAN, JAPANESE, KOREAN, LATVIAN, LITHUANIAN, NORWEGIAN, POLISH, PORTUGESE,
43
+ ROMANIAN, RUSSIAN, SERBIAN, SLOVAK, SLOVENIAN, SPANISH, SWEDISH, UKRANIAN, VIETNAMESE]
44
+
45
+ end
@@ -0,0 +1,12 @@
1
+ module GoogleTranslate
2
+ # superclass for parsing the response: contains the common elements
3
+ class ParsedResponse
4
+ #attr_reader :status, :details
5
+ def initialize(string)
6
+ json = JSON.parse(string)
7
+ #@status = json['responseStatus']
8
+ #@details = json['responseDetails']
9
+ @response_data = json['responseData']
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,49 @@
1
+ module GoogleTranslate
2
+ # manage translation of a given string from a given language to another language
3
+ # <b>How to use</b>:
4
+ # translator = Translator.new("en","fr") # so several translations can be performed with this new object
5
+ # result = translator.translate("nice day today") # returns "belle journÃe aujourd'hui"
6
+ class Translator
7
+ include ApiCall
8
+
9
+ SERVICE = "translate"
10
+ PARAMS = {"v" => "#{VERSION}"}
11
+
12
+ # initialize the translator with the language to translate from (from) and the language to translate to (to)
13
+ def initialize(from,to)
14
+ raise InvalidLanguage if !is_language?(from)
15
+ raise InvalidLanguage if !is_language?(to)
16
+ @from = from
17
+ @to = to
18
+ end
19
+
20
+ # translate a string in the given languages
21
+ # options so far:
22
+ # - html: if html encoding is desirable (for immediate display on a web page for instance)
23
+ # then this option needs to have a true value (:html => true)
24
+ def translate(text,options = {})
25
+ PARAMS["langpair"] = "#{@from}%7C#{@to}"
26
+ PARAMS["q"] = CGI.escape(text)
27
+ response = google_api_call(SERVICE, PARAMS, TranslationResponse)
28
+ translation = options[:html] ? response.translation : CGI.unescapeHTML(response.translation)
29
+ translation # return value
30
+ end
31
+
32
+ private
33
+ def is_language?(lang)
34
+ return true if lang == ""
35
+ LANGUAGES.include?(lang)
36
+ end
37
+ end
38
+
39
+ # to handle the translation response
40
+ class TranslationResponse < ParsedResponse
41
+ attr_reader :translation
42
+ def initialize(string)
43
+ super(string)
44
+ # here we unescape html escaped characters BUT if it's required to keep html format,
45
+ # an extra option should be added
46
+ @translation = @response_data['translatedText'] if @response_data
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe GoogleTranslate, 'detect' do
4
+ it "should detect the language of a string" do
5
+ LanguageDetect.detect("il fait beau aujourd'hui").should be == "fr"
6
+ end
7
+
8
+ it "should raise an error if no string" do
9
+ lambda {
10
+ LanguageDetect.detect(nil)
11
+ }.should raise_error(NoGivenString)
12
+ end
13
+
14
+ it "should raise an error if language not recognized" do
15
+ lambda {
16
+ LanguageDetect.detect("bliiiioaarg oqsdkqsdf")
17
+ }.should raise_error(UnreliableDetection)
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ gem 'rspec', '~> 1.1.3'
3
+ require 'spec'
4
+
5
+ # add lib directory
6
+ $:.unshift File.dirname(__FILE__) + '/../lib'
7
+
8
+ Spec::Runner.configure do |config|
9
+ config.mock_with :mocha
10
+ end
11
+
12
+ require 'google_translate'
13
+ include GoogleTranslate
14
+
15
+
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe GoogleTranslate, 'translate' do
4
+ it "should raise an error if the from language is missing or doesn't exist" do
5
+ lambda {
6
+ Translator.new(nil,'en')
7
+ }.should raise_error(InvalidLanguage)
8
+ end
9
+
10
+ it "should raise an error if the to language is missing or doen't exist" do
11
+ lambda {
12
+ Translator.new('en','wk') # wookie speak
13
+ }.should raise_error(InvalidLanguage)
14
+ end
15
+
16
+ it "should translate a string" do
17
+ translator = Translator.new('en','fr')
18
+ result = translator.translate("nice day today")
19
+ result.should be == "belle journée aujourd'hui"
20
+ end
21
+
22
+ it "should raise an error if no response" do
23
+ translator = Translator.new('en','fr')
24
+ translator.stubs(:open).yields(StringIO.new) # stub empty response
25
+ lambda {
26
+ result = translator.translate("nice day today")
27
+ }.should raise_error(GoogleUnavailable)
28
+ end
29
+
30
+ # think how to handle this ... should it give a signal if the
31
+ # translation == the input ?
32
+ it "should not translate if untranslateable string" do
33
+ translator = Translator.new('en','fr')
34
+ result = translator.translate("blaargh")
35
+ result.should be == "blaargh"
36
+ end
37
+
38
+ it "should leave html encoding if required" do
39
+ translator = Translator.new('en','fr')
40
+ result = translator.translate("nice day today", :html => true)
41
+ result.should be == "belle journée aujourd&#39;hui"
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: crutch-google_translate
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Elise Huard
8
+ - Michal Barla
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-08-26 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: Google Translate Ruby API - based on google documentation
18
+ email: michal.barla@gmail.com
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files: []
24
+
25
+ files:
26
+ - VERSION.yml
27
+ - lib/google_translate
28
+ - lib/google_translate/api_call.rb
29
+ - lib/google_translate/exceptions.rb
30
+ - lib/google_translate/language_detect.rb
31
+ - lib/google_translate/languages.rb
32
+ - lib/google_translate/parsed_response.rb
33
+ - lib/google_translate/translator.rb
34
+ - lib/google_translate.rb
35
+ - spec/detect_spec.rb
36
+ - spec/spec_helper.rb
37
+ - spec/translate_spec.rb
38
+ has_rdoc: true
39
+ homepage: http://github.com/crutch/google_translate
40
+ post_install_message:
41
+ rdoc_options:
42
+ - --inline-source
43
+ - --charset=UTF-8
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ requirements: []
59
+
60
+ rubyforge_project:
61
+ rubygems_version: 1.2.0
62
+ signing_key:
63
+ specification_version: 2
64
+ summary: Google Translate Ruby API
65
+ test_files: []
66
+