google-translate 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +30 -0
- data/README +16 -0
- data/Rakefile +66 -0
- data/bin/t +6 -0
- data/bin/translate +75 -0
- data/bin/translate.bat +6 -0
- data/google-translate.gemspec +34 -0
- data/lib/google_translate.rb +133 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/translate_spec.rb +58 -0
- metadata +73 -0
data/CHANGES
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
= Google-Translate Changelog
|
3
|
+
|
4
|
+
== Version 0.5.5
|
5
|
+
|
6
|
+
* Initial release.
|
7
|
+
|
8
|
+
== Version 0.5.6
|
9
|
+
|
10
|
+
* Adding support for ruby 1.9.x
|
11
|
+
|
12
|
+
== Version 0.5.7
|
13
|
+
|
14
|
+
* Removing text duplication from help
|
15
|
+
|
16
|
+
== Version 0.5.8
|
17
|
+
|
18
|
+
* Merging changes from bragi: removing warnings, adding exceptions
|
19
|
+
|
20
|
+
== Version 0.5.9
|
21
|
+
|
22
|
+
* Adding alias: "t" for "translate" command
|
23
|
+
|
24
|
+
== Version 0.6.1
|
25
|
+
|
26
|
+
* Adding error handling
|
27
|
+
|
28
|
+
== Version 0.6.2
|
29
|
+
|
30
|
+
* Reflecting changes in how google returns supported languages list
|
data/README
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
= Google-Translate -- Client for Google Translate API
|
2
|
+
|
3
|
+
= Installing Google-Translate
|
4
|
+
|
5
|
+
== Installing the Gem
|
6
|
+
$ sudo gem sources -a http://gems.github.com
|
7
|
+
$ sudo gem install google-translate
|
8
|
+
|
9
|
+
== Usage
|
10
|
+
|
11
|
+
translate list - displays the list of supported languages
|
12
|
+
translate detect "hello world" - detects language of text
|
13
|
+
translate en:ru "hello world" - or
|
14
|
+
translate en:ru hello world - translates from en to ru
|
15
|
+
translate ru "hello world" - or
|
16
|
+
translate ru hello world - translated from auto-detected language to ru
|
data/Rakefile
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Rakefile for google-translate
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'rake/testtask'
|
6
|
+
require 'spec/rake/spectask'
|
7
|
+
require 'rake/rdoctask'
|
8
|
+
require 'rcov/rcovtask'
|
9
|
+
|
10
|
+
spec_name = 'google-translate.gemspec'
|
11
|
+
|
12
|
+
SPEC = Gem::Specification.load(spec_name)
|
13
|
+
|
14
|
+
Rake::GemPackageTask.new(SPEC) do |pkg|
|
15
|
+
#pkg.need_tar = true
|
16
|
+
#pkg.need_zip = true
|
17
|
+
end
|
18
|
+
|
19
|
+
Spec::Rake::SpecTask.new do |task|
|
20
|
+
task.libs << 'lib'
|
21
|
+
task.pattern = 'spec/**/*_spec.rb'
|
22
|
+
task.verbose = false
|
23
|
+
end
|
24
|
+
|
25
|
+
Rake::RDocTask.new do |rdoc|
|
26
|
+
rdoc.rdoc_dir = 'rdoc'
|
27
|
+
rdoc.title = 'teststuff'
|
28
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
29
|
+
rdoc.rdoc_files.include('README*')
|
30
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
31
|
+
end
|
32
|
+
|
33
|
+
Rcov::RcovTask.new do |task|
|
34
|
+
task.libs << 'test'
|
35
|
+
task.test_files = FileList['test/**/*_test.rb']
|
36
|
+
task.verbose = true
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Run gem code locally"
|
40
|
+
task :"run:gem" do
|
41
|
+
command = "bin/translate " + (ENV['params'].nil? ? '' : ENV['params'])
|
42
|
+
puts ruby("#{command}")
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "test gem compatibility with github"
|
46
|
+
task :"github:validate" do
|
47
|
+
require 'yaml'
|
48
|
+
|
49
|
+
require 'rubygems/specification'
|
50
|
+
data = File.read(spec_name)
|
51
|
+
spec = nil
|
52
|
+
|
53
|
+
if data !~ %r{!ruby/object:Gem::Specification}
|
54
|
+
Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
|
55
|
+
else
|
56
|
+
spec = YAML.load(data)
|
57
|
+
end
|
58
|
+
|
59
|
+
spec.validate
|
60
|
+
|
61
|
+
puts spec
|
62
|
+
puts "OK"
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
task :default => :rcov
|
data/bin/t
ADDED
data/bin/translate
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift(File::join(File::dirname(File::dirname(__FILE__)), "lib"))
|
4
|
+
|
5
|
+
require 'rubygems' unless RUBY_VERSION =~ /1.9.*/
|
6
|
+
require 'google_translate'
|
7
|
+
|
8
|
+
#$KCODE='u'
|
9
|
+
|
10
|
+
class Translate
|
11
|
+
|
12
|
+
USAGE= <<-TEXT
|
13
|
+
Usage:
|
14
|
+
translate list - displays the list of supported languages
|
15
|
+
translate detect "hello world" - detects language of text
|
16
|
+
translate en:ru "hello world" - translates from en to ru
|
17
|
+
translate ru "hello world" - translated from auto-detected language to ru
|
18
|
+
TEXT
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@translator = Google::Translator.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def print_languages list, title
|
25
|
+
puts title
|
26
|
+
puts list.join(', ')
|
27
|
+
end
|
28
|
+
|
29
|
+
def display text
|
30
|
+
if RUBY_PLATFORM =~ /mswin32/
|
31
|
+
File.open("temp.txt", "w") {|f| f.write text }
|
32
|
+
%x[notepad temp.txt]
|
33
|
+
else
|
34
|
+
puts text
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def run
|
39
|
+
if(ARGV.size == 0)
|
40
|
+
puts USAGE and return
|
41
|
+
end
|
42
|
+
|
43
|
+
case ARGV.shift
|
44
|
+
|
45
|
+
when 'list' then
|
46
|
+
hash = @translator.supported_languages
|
47
|
+
|
48
|
+
print_languages hash[:from_languages], "From Languages:"
|
49
|
+
print_languages hash[:to_languages], "To Languages:"
|
50
|
+
when 'detect' then
|
51
|
+
language = @translator.detect_language(ARGV.shift)
|
52
|
+
|
53
|
+
puts "Language: #{language.inspect}"
|
54
|
+
when /(..):(..)/ then
|
55
|
+
from_text = ARGV.join(' ')
|
56
|
+
from = $1
|
57
|
+
to = $2
|
58
|
+
|
59
|
+
display(@translator.translate(from.to_sym, to.to_sym, from_text))
|
60
|
+
when /(..)/ then
|
61
|
+
from_text = ARGV.join(' ')
|
62
|
+
|
63
|
+
from = @translator.detect_language(from_text)['language']
|
64
|
+
to = $1
|
65
|
+
|
66
|
+
begin
|
67
|
+
display(@translator.translate(from.to_sym, to.to_sym, from_text))
|
68
|
+
rescue Exception => e
|
69
|
+
puts "Error: " + e.message
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
Translate.new.run
|
data/bin/translate.bat
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{google-translate}
|
5
|
+
s.version = "0.6.3"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
|
9
|
+
s.authors = ["Alexander Shvets"]
|
10
|
+
s.date = %q{2009-01-21}
|
11
|
+
s.description = %q{Simple client for Google Translate API.}
|
12
|
+
s.email = %q{alexander.shvets@gmail.com}
|
13
|
+
|
14
|
+
s.files = ["CHANGES", "google-translate.gemspec", "Rakefile", "README", "lib/google_translate.rb",
|
15
|
+
"bin/translate", "bin/translate.bat", "spec/spec_helper.rb" , "spec/translate_spec.rb"]
|
16
|
+
|
17
|
+
s.has_rdoc = true
|
18
|
+
s.homepage = %q{http://github.com/shvets/google-translate}
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.rubyforge_project = %q{google-translate}
|
21
|
+
s.rubygems_version = %q{1.3.2}
|
22
|
+
s.summary = %q{Simple client for Google Translate API.}
|
23
|
+
|
24
|
+
if s.respond_to? :specification_version then
|
25
|
+
s.specification_version = 2
|
26
|
+
end
|
27
|
+
|
28
|
+
s.executables = ['translate', 't']
|
29
|
+
s.platform = Gem::Platform::RUBY
|
30
|
+
s.requirements = ["none"]
|
31
|
+
s.bindir = "bin"
|
32
|
+
|
33
|
+
s.add_dependency("json_pure", ">= 1.1.4")
|
34
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# google_translate.rb
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
require 'cgi'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
module Google
|
8
|
+
Language = Struct.new(:name, :code) do
|
9
|
+
def to_s
|
10
|
+
"(" + code + ": " + name + ")"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Translator
|
15
|
+
def self.Exception(*names)
|
16
|
+
cl = Module === self ? self : Object
|
17
|
+
names.each {|n| cl.const_set(n, Class.new(Exception))}
|
18
|
+
end
|
19
|
+
|
20
|
+
Exception :MissingFromLanguage, :MissingToLanguage, :MissingTextLanguage,
|
21
|
+
:TranslateServerIsDown, :InvalidResponse, :MissingText, :MissingTestText
|
22
|
+
|
23
|
+
URL_STRING = "http://ajax.googleapis.com/ajax/services/language/"
|
24
|
+
URL2_STRING = "http://translate.google.com"
|
25
|
+
|
26
|
+
def translate(from, to, from_text, options={})
|
27
|
+
raise(MissingFromLanguage) if from.nil?
|
28
|
+
raise(MissingToLanguage) if to.nil?
|
29
|
+
raise(MissingTextLanguage) if from_text.nil?
|
30
|
+
|
31
|
+
request = URL_STRING + "translate?v=1.0&langpair=#{from}%7C#{to}&q=" + CGI.escape(from_text)
|
32
|
+
|
33
|
+
begin
|
34
|
+
response = call_service(request, [:response_status, :response_details, :response_data])
|
35
|
+
|
36
|
+
raise(TranslateServerIsDown) if response.empty?
|
37
|
+
|
38
|
+
raise(InvalidResponse, response[:response_details]) if response[:response_status] != 200 # success
|
39
|
+
|
40
|
+
to_text = response[:response_data]['translatedText']
|
41
|
+
|
42
|
+
(options[:html]) ? CGI.unescapeHTML(to_text) : to_text
|
43
|
+
rescue OpenURI::HTTPError
|
44
|
+
raise(TranslateServerIsDown)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def detect_language(test_text)
|
49
|
+
raise(MissingTestText) if test_text.nil?
|
50
|
+
|
51
|
+
request = URL_STRING + "detect?v=1.0&q=" + CGI.escape(test_text)
|
52
|
+
|
53
|
+
begin
|
54
|
+
response = call_service(request, [:response_data])
|
55
|
+
response_data = response[:response_data]
|
56
|
+
|
57
|
+
raise(TranslateServerIsDown) if response.empty?
|
58
|
+
|
59
|
+
response_data
|
60
|
+
rescue OpenURI::HTTPError
|
61
|
+
raise(TranslateServerIsDown)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def supported_languages
|
66
|
+
call_service2(URL2_STRING , [])
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def camelize(str)
|
72
|
+
words = str.split('_')
|
73
|
+
|
74
|
+
words[0] + words[1..-1].map {|w| w.capitalize}.join
|
75
|
+
end
|
76
|
+
|
77
|
+
def call_service(request, keys)
|
78
|
+
response = {}
|
79
|
+
|
80
|
+
open(request) do |stream|
|
81
|
+
content = stream.read
|
82
|
+
|
83
|
+
unless content.nil?
|
84
|
+
json = JSON.parse(content)
|
85
|
+
|
86
|
+
keys.each do |key|
|
87
|
+
response[key] = json[camelize(key.to_s)]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
response
|
93
|
+
end
|
94
|
+
|
95
|
+
def call_service2(request, keys)
|
96
|
+
response = {}
|
97
|
+
|
98
|
+
open(URI.escape(request)) do |stream|
|
99
|
+
content = stream.read
|
100
|
+
|
101
|
+
from_languages = collect_languages content, 'sl', 'old_sl'
|
102
|
+
to_languages = collect_languages content, 'tl', 'old_tl'
|
103
|
+
|
104
|
+
response[:from_languages] = from_languages
|
105
|
+
response[:to_languages] = to_languages
|
106
|
+
end
|
107
|
+
|
108
|
+
response
|
109
|
+
end
|
110
|
+
|
111
|
+
def collect_languages buffer, tag_name, tag_id
|
112
|
+
languages = []
|
113
|
+
|
114
|
+
spaces = '\s?'
|
115
|
+
quote = '(\s|\'|")?'
|
116
|
+
text = '(.*)'
|
117
|
+
|
118
|
+
re1 = /<select#{spaces}name=#{quote}#{tag_name}#{quote}#{spaces}id=#{quote}#{tag_id}#{quote}#{spaces}tabindex=#{spaces}#{quote}0#{quote}#{spaces}>(.*)<\/select>/
|
119
|
+
text = re1.match(buffer)[7]
|
120
|
+
|
121
|
+
re2 = /<option(\s*)value="([a-z|A-Z]*)">([a-z|A-Z]*)<\/option>/
|
122
|
+
|
123
|
+
matches = text.scan(re2)
|
124
|
+
|
125
|
+
matches.each do |m|
|
126
|
+
languages << Language.new(m[2], m[1])
|
127
|
+
end
|
128
|
+
|
129
|
+
languages
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# translate_spec.rb
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
4
|
+
|
5
|
+
require 'google_translate'
|
6
|
+
|
7
|
+
module Google
|
8
|
+
|
9
|
+
describe Translator do
|
10
|
+
before :each do
|
11
|
+
@translator = Translator.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should raise an error if one of parameters is missing" do
|
15
|
+
lambda {
|
16
|
+
@translator.translate(nil, :ru)
|
17
|
+
}.should raise_error
|
18
|
+
|
19
|
+
lambda {
|
20
|
+
@translator.translate(:en, nil)
|
21
|
+
}.should raise_error
|
22
|
+
|
23
|
+
lambda {
|
24
|
+
@translator.translate(:en, :ru, nil)
|
25
|
+
}.should raise_error
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should translate test string from one language to another" do
|
29
|
+
r = @translator.translate(:en, :ru, "hello world!")
|
30
|
+
|
31
|
+
puts r
|
32
|
+
|
33
|
+
r.size.should be > 0
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should detect the language of a string" do
|
37
|
+
@translator.detect_language("bonjour tout le monde")['language'].should be == "fr"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should raise an error if no string" do
|
41
|
+
lambda {
|
42
|
+
@translator.detect_language(nil)
|
43
|
+
}.should raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return unreliable flag if language is not recognized" do
|
47
|
+
@translator.detect_language("azafretmkldt")['isReliable'].should be_false
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should return list of supportd languages" do
|
51
|
+
languages = @translator.supported_languages
|
52
|
+
|
53
|
+
languages[:from_languages].size.should > 0
|
54
|
+
languages[:to_languages].size.should > 0
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: google-translate
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alexander Shvets
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-01-21 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: json_pure
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.1.4
|
24
|
+
version:
|
25
|
+
description: Simple client for Google Translate API.
|
26
|
+
email: alexander.shvets@gmail.com
|
27
|
+
executables:
|
28
|
+
- translate
|
29
|
+
- t
|
30
|
+
extensions: []
|
31
|
+
|
32
|
+
extra_rdoc_files: []
|
33
|
+
|
34
|
+
files:
|
35
|
+
- CHANGES
|
36
|
+
- google-translate.gemspec
|
37
|
+
- Rakefile
|
38
|
+
- README
|
39
|
+
- lib/google_translate.rb
|
40
|
+
- bin/translate
|
41
|
+
- bin/translate.bat
|
42
|
+
- spec/spec_helper.rb
|
43
|
+
- spec/translate_spec.rb
|
44
|
+
has_rdoc: true
|
45
|
+
homepage: http://github.com/shvets/google-translate
|
46
|
+
licenses: []
|
47
|
+
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
version:
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: "0"
|
64
|
+
version:
|
65
|
+
requirements:
|
66
|
+
- none
|
67
|
+
rubyforge_project: google-translate
|
68
|
+
rubygems_version: 1.3.5
|
69
|
+
signing_key:
|
70
|
+
specification_version: 2
|
71
|
+
summary: Simple client for Google Translate API.
|
72
|
+
test_files: []
|
73
|
+
|