google-translate 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +9 -9
- data/.idea/google-translate.iml +154 -13
- data/.idea/workspace.xml +766 -220
- data/CHANGES +5 -1
- data/Gemfile +5 -4
- data/Gemfile.lock +22 -16
- data/README.md +4 -0
- data/Rakefile +1 -1
- data/bin/translate +4 -1
- data/google-translate.gemspec.erb +1 -1
- data/lib/google_translate/google_translate.rb +14 -20
- data/lib/google_translate/result_parser.rb +83 -0
- data/lib/google_translate/translate_cli.rb +33 -22
- data/lib/google_translate/version.rb +1 -1
- data/spec/google_translate_spec.rb +7 -6
- metadata +35 -20
data/CHANGES
CHANGED
data/Gemfile
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
3
|
group :default do
|
4
|
-
gem "json_pure"
|
5
|
-
gem "
|
4
|
+
gem "json_pure", "~>1.8"
|
5
|
+
gem "resource_accessor", "~>1.2"
|
6
|
+
gem "thor", "~>0.19"
|
6
7
|
end
|
7
8
|
|
8
9
|
group :development do
|
9
|
-
gem "gemspec_deps_gen"
|
10
|
-
gem "gemcutter"
|
10
|
+
gem "gemspec_deps_gen", "~>1.1"
|
11
|
+
gem "gemcutter", "~>0.7"
|
11
12
|
end
|
12
13
|
|
13
14
|
group :test do
|
data/Gemfile.lock
CHANGED
@@ -2,30 +2,36 @@ GEM
|
|
2
2
|
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
4
|
awesome_print (1.2.0)
|
5
|
-
diff-lcs (1.2.
|
5
|
+
diff-lcs (1.2.5)
|
6
6
|
file_utils (1.0.7)
|
7
7
|
gemcutter (0.7.1)
|
8
|
-
gemspec_deps_gen (1.1.
|
8
|
+
gemspec_deps_gen (1.1.2)
|
9
9
|
bundler
|
10
10
|
file_utils
|
11
|
-
json_pure (1.8.
|
12
|
-
|
13
|
-
|
14
|
-
rspec-
|
15
|
-
rspec-
|
16
|
-
|
17
|
-
rspec-
|
18
|
-
|
19
|
-
rspec-
|
20
|
-
|
11
|
+
json_pure (1.8.1)
|
12
|
+
resource_accessor (1.2.3)
|
13
|
+
rspec (3.0.0)
|
14
|
+
rspec-core (~> 3.0.0)
|
15
|
+
rspec-expectations (~> 3.0.0)
|
16
|
+
rspec-mocks (~> 3.0.0)
|
17
|
+
rspec-core (3.0.4)
|
18
|
+
rspec-support (~> 3.0.0)
|
19
|
+
rspec-expectations (3.0.4)
|
20
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
21
|
+
rspec-support (~> 3.0.0)
|
22
|
+
rspec-mocks (3.0.4)
|
23
|
+
rspec-support (~> 3.0.0)
|
24
|
+
rspec-support (3.0.4)
|
25
|
+
thor (0.19.1)
|
21
26
|
|
22
27
|
PLATFORMS
|
23
28
|
ruby
|
24
29
|
|
25
30
|
DEPENDENCIES
|
26
31
|
awesome_print
|
27
|
-
gemcutter
|
28
|
-
gemspec_deps_gen
|
29
|
-
json_pure
|
32
|
+
gemcutter (~> 0.7)
|
33
|
+
gemspec_deps_gen (~> 1.1)
|
34
|
+
json_pure (~> 1.8)
|
35
|
+
resource_accessor (~> 1.2)
|
30
36
|
rspec
|
31
|
-
thor
|
37
|
+
thor (~> 0.19)
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ version = GoogleTranslate::VERSION
|
|
10
10
|
project_name = File.basename(Dir.pwd)
|
11
11
|
|
12
12
|
task :gen do
|
13
|
-
generator = GemspecDepsGen.new
|
13
|
+
generator = GemspecDepsGen.new
|
14
14
|
|
15
15
|
generator.generate_dependencies "spec", "#{project_name}.gemspec.erb", "#{project_name}.gemspec"
|
16
16
|
end
|
data/bin/translate
CHANGED
@@ -15,6 +15,7 @@ elsif ARGV.size == 1
|
|
15
15
|
else
|
16
16
|
params = []
|
17
17
|
say = ENV['say'] ? (ENV['say'] == 'true') : false
|
18
|
+
extra = ENV['extra'] ? (ENV['extra'] == 'true') : false
|
18
19
|
|
19
20
|
index = 0
|
20
21
|
|
@@ -23,6 +24,8 @@ else
|
|
23
24
|
|
24
25
|
if param =~ /--say/ or param =~ /-s/
|
25
26
|
say = true
|
27
|
+
elsif param =~ /--extra/ or param =~ /-e/
|
28
|
+
extra = true
|
26
29
|
else
|
27
30
|
params << param
|
28
31
|
end
|
@@ -39,5 +42,5 @@ else
|
|
39
42
|
['en', '', '']
|
40
43
|
end
|
41
44
|
|
42
|
-
TranslateCLI.start ["translate", "--say=#{say}", from.to_sym, to.to_sym, text]
|
45
|
+
TranslateCLI.start ["translate", "--say=#{say}", "--extra=#{extra}", from.to_sym, to.to_sym, text]
|
43
46
|
end
|
@@ -4,7 +4,7 @@ require File.expand_path(File.dirname(__FILE__) + '/lib/google_translate/version
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "google-translate"
|
7
|
-
spec.summary = %q{Simple client for Google Translate API.}
|
7
|
+
spec.summary = %q{Summary: Simple client for Google Translate API.}
|
8
8
|
spec.description = %q{Simple client for Google Translate API.}
|
9
9
|
spec.email = "alexander.shvets@gmail.com"
|
10
10
|
spec.authors = ["Alexander Shvets"]
|
@@ -3,9 +3,10 @@
|
|
3
3
|
require 'net/http'
|
4
4
|
require 'json'
|
5
5
|
require 'tempfile'
|
6
|
+
require 'resource_accessor'
|
6
7
|
|
7
8
|
class GoogleTranslate
|
8
|
-
GOOGLE_TRANSLATE_SERVICE_URL = "
|
9
|
+
GOOGLE_TRANSLATE_SERVICE_URL = "translate.google.com"
|
9
10
|
|
10
11
|
def supported_languages
|
11
12
|
response = call_service GOOGLE_TRANSLATE_SERVICE_URL
|
@@ -21,7 +22,9 @@ class GoogleTranslate
|
|
21
22
|
raise("Missing 'to' language") unless to_lang
|
22
23
|
raise("Missing text for translation") unless text
|
23
24
|
|
24
|
-
|
25
|
+
r = call_translate_service(from_lang, to_lang, text)
|
26
|
+
|
27
|
+
result = JSON.parse(r.gsub('[,', '['))
|
25
28
|
|
26
29
|
raise("Translate Server is down") if (!result || result.empty?)
|
27
30
|
|
@@ -31,7 +34,7 @@ class GoogleTranslate
|
|
31
34
|
def say lang, text
|
32
35
|
speech_content = call_speech_service(lang, text)
|
33
36
|
|
34
|
-
file = Tempfile.new('.google_translate_speech
|
37
|
+
file = Tempfile.new('.google_translate_speech---')
|
35
38
|
|
36
39
|
file.write(speech_content)
|
37
40
|
|
@@ -45,17 +48,17 @@ class GoogleTranslate
|
|
45
48
|
private
|
46
49
|
|
47
50
|
def translate_url(from_lang, to_lang)
|
48
|
-
"
|
51
|
+
"https://#{GOOGLE_TRANSLATE_SERVICE_URL}/translate_a/single?client=t&sl=#{from_lang}&tl=#{to_lang}&hl=en&dt=bd&dt=ex&dt=ld&dt=md&dt=qc&dt=rw&dt=rm&dt=ss&dt=t&dt=at&dt=sw&ie=UTF-8&oe=UTF-8&prev=btn&rom=1&ssel=0&tsel=0"
|
49
52
|
end
|
50
53
|
|
51
54
|
def speech_url(lang)
|
52
|
-
"
|
55
|
+
"http://#{GOOGLE_TRANSLATE_SERVICE_URL}/translate_tts?tl=#{lang}&ie=UTF-8&oe=UTF-8"
|
53
56
|
end
|
54
57
|
|
55
58
|
def call_translate_service from_lang, to_lang, text
|
56
59
|
url = translate_url(from_lang, to_lang)
|
57
60
|
|
58
|
-
response = call_service url
|
61
|
+
response = call_service url + "&q=#{text}"
|
59
62
|
|
60
63
|
response.body.split(',').collect { |s| s == '' ? "\"\"" : s }.join(",") # fix json object
|
61
64
|
end
|
@@ -63,24 +66,18 @@ class GoogleTranslate
|
|
63
66
|
def call_speech_service lang, text
|
64
67
|
url = speech_url(lang)
|
65
68
|
|
66
|
-
response = call_service url
|
69
|
+
response = call_service url + "&q=#{text}"
|
67
70
|
|
68
71
|
response.body
|
69
72
|
end
|
70
73
|
|
71
|
-
def call_service url
|
72
|
-
|
73
|
-
|
74
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
75
|
-
request = Net::HTTP::Post.new(uri.request_uri)
|
76
|
-
request.set_form_data(text: text)
|
74
|
+
def call_service url
|
75
|
+
accessor = ResourceAccessor.new
|
77
76
|
|
78
|
-
|
77
|
+
accessor.get_response url: url
|
79
78
|
end
|
80
79
|
|
81
80
|
def collect_languages buffer, index, tag_name, tag_id
|
82
|
-
languages = []
|
83
|
-
|
84
81
|
spaces = '\s?'
|
85
82
|
quote = '(\s|\'|")?'
|
86
83
|
|
@@ -109,10 +106,7 @@ class GoogleTranslate
|
|
109
106
|
matches = text.gsub(/selected/i, '').squeeze.scan(re2)
|
110
107
|
end
|
111
108
|
|
112
|
-
matches.
|
113
|
-
end
|
114
|
-
|
115
|
-
languages
|
109
|
+
matches.map { |m| Language.new(m[2], m[1]) }
|
116
110
|
end
|
117
111
|
end
|
118
112
|
|
@@ -0,0 +1,83 @@
|
|
1
|
+
class ResultParser
|
2
|
+
|
3
|
+
attr_reader :result
|
4
|
+
|
5
|
+
def initialize result
|
6
|
+
@result = result
|
7
|
+
end
|
8
|
+
|
9
|
+
def translation
|
10
|
+
result[0][0][0]
|
11
|
+
end
|
12
|
+
|
13
|
+
def translit
|
14
|
+
result[0][1][2]
|
15
|
+
end
|
16
|
+
|
17
|
+
def nouns
|
18
|
+
list = []
|
19
|
+
|
20
|
+
if result[1].size > 1
|
21
|
+
if result[1][0]
|
22
|
+
list = result[1][0][1]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
list
|
27
|
+
end
|
28
|
+
|
29
|
+
def verbs
|
30
|
+
list = []
|
31
|
+
|
32
|
+
if result[1].size > 1
|
33
|
+
if result[1][1]
|
34
|
+
list = result[1][1][1]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
list
|
39
|
+
end
|
40
|
+
|
41
|
+
def synonym_nouns
|
42
|
+
list = []
|
43
|
+
|
44
|
+
if result[11].size > 1
|
45
|
+
if result[1][0]
|
46
|
+
result[11][0][1].each do |r, _|
|
47
|
+
list << r
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
list
|
53
|
+
end
|
54
|
+
|
55
|
+
def synonym_verbs
|
56
|
+
list = []
|
57
|
+
|
58
|
+
if result[11].size > 1
|
59
|
+
if result[1][1]
|
60
|
+
result[11][1][1].each do |r, _|
|
61
|
+
list << r
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
list
|
67
|
+
end
|
68
|
+
|
69
|
+
def synonym_exclamations
|
70
|
+
list = []
|
71
|
+
|
72
|
+
if result[11].size > 1
|
73
|
+
if result[1][2]
|
74
|
+
result[11][2][1].each do |r, _|
|
75
|
+
list << r
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
list
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "thor"
|
2
2
|
require 'google_translate'
|
3
3
|
require 'google_translate/version'
|
4
|
+
require 'google_translate/result_parser'
|
4
5
|
|
5
6
|
class TranslateCLI < Thor
|
6
7
|
USAGE = <<-LONGDESC
|
@@ -13,6 +14,7 @@ class TranslateCLI < Thor
|
|
13
14
|
translate en:ru Hello world # translates from English to Russian
|
14
15
|
translate ru Hello world # translates to Russian from auto-detected language
|
15
16
|
translate -s ru Hello world # translates and tries to say it
|
17
|
+
translate -e ru help # translates and gives extra information (nouns, verbs, synonyms)
|
16
18
|
LONGDESC
|
17
19
|
|
18
20
|
desc "version", "displays version"
|
@@ -31,45 +33,54 @@ class TranslateCLI < Thor
|
|
31
33
|
end
|
32
34
|
|
33
35
|
long_desc USAGE
|
34
|
-
desc "
|
35
|
-
option :say, :
|
36
|
+
desc "translate text", "translates the text"
|
37
|
+
option :say, aliases: "-s"
|
38
|
+
option :extra, aliases: "-e"
|
36
39
|
def translate from_lang, to_lang, text
|
37
40
|
translator = GoogleTranslate.new
|
38
41
|
|
39
42
|
result = translator.translate(from_lang, to_lang, text)
|
40
43
|
|
41
|
-
|
42
|
-
translit = result[0][0][2]
|
44
|
+
result_parser = ResultParser.new result
|
43
45
|
|
44
|
-
|
45
|
-
puts "Translit: #{translit}" unless translit.size == 0
|
46
|
+
extra = options[:extra] ? (options[:extra] == 'true') : false
|
46
47
|
|
47
|
-
|
48
|
+
if extra
|
49
|
+
puts "Nouns: #{result_parser.nouns.join(", ")}"
|
50
|
+
puts "Verbs: #{result_parser.verbs.join(", ")}"
|
48
51
|
|
49
|
-
|
52
|
+
puts "Synonym Nouns:"
|
50
53
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
54
|
+
result_parser.synonym_nouns.each do |r|
|
55
|
+
puts "- " + r.join(", ")
|
56
|
+
end
|
56
57
|
|
57
|
-
|
58
|
+
puts "Synonym Verbs:"
|
58
59
|
|
59
|
-
|
60
|
-
|
61
|
-
|
60
|
+
result_parser.synonym_verbs.each do |r|
|
61
|
+
puts "- " + r.join(", ")
|
62
|
+
end
|
62
63
|
|
63
|
-
|
64
|
-
puts "Synonyms:"
|
64
|
+
puts "Synonym Exclamations:"
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
end
|
66
|
+
result_parser.synonym_exclamations.each do |r|
|
67
|
+
puts "- " + r.join(", ")
|
69
68
|
end
|
70
69
|
end
|
70
|
+
|
71
|
+
puts "Translation: #{result_parser.translation}"
|
72
|
+
puts "Translit: #{result_parser.translit}" unless result_parser.translit.size == 0
|
73
|
+
|
74
|
+
say = options[:say] ? (options[:say] == 'true') : false
|
75
|
+
|
76
|
+
if say and !!(RUBY_PLATFORM =~ /darwin/i)
|
77
|
+
translator.say(from_lang, text)
|
78
|
+
translator.say(to_lang, result_parser.translation)
|
79
|
+
end
|
71
80
|
end
|
72
81
|
|
82
|
+
private
|
83
|
+
|
73
84
|
def print_languages title, list
|
74
85
|
puts title
|
75
86
|
puts list.join(', ')
|
@@ -4,7 +4,7 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
4
4
|
|
5
5
|
require 'google_translate'
|
6
6
|
|
7
|
-
describe GoogleTranslate do
|
7
|
+
RSpec.describe GoogleTranslate do
|
8
8
|
|
9
9
|
it "should raise an error if one of parameters is missing" do
|
10
10
|
expect { subject.translate(nil, :ru) }.to raise_error
|
@@ -17,13 +17,14 @@ describe GoogleTranslate do
|
|
17
17
|
it "should translate test string from one language to another" do
|
18
18
|
r = subject.translate(:en, :ru, "hello world!")
|
19
19
|
puts r
|
20
|
-
|
20
|
+
|
21
|
+
expect(r.size).to be > 0
|
21
22
|
end
|
22
23
|
|
23
24
|
it "should translate test string from one language to another with autodetect" do
|
24
25
|
r = subject.translate(:auto, :ru, "hello world!")
|
25
26
|
puts r
|
26
|
-
r.size.
|
27
|
+
expect(r.size).to be > 0
|
27
28
|
end
|
28
29
|
|
29
30
|
#it "should return unreliable flag if language is not recognized" do
|
@@ -31,9 +32,9 @@ describe GoogleTranslate do
|
|
31
32
|
#end
|
32
33
|
|
33
34
|
it "should return list of supported languages" do
|
34
|
-
|
35
|
+
from_languages, to_languages = subject.supported_languages
|
35
36
|
|
36
|
-
|
37
|
-
|
37
|
+
expect(from_languages.size).to be > 0
|
38
|
+
expect(to_languages.size).to be > 0
|
38
39
|
end
|
39
40
|
end
|