glosbe-translate 0.0.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.
- checksums.yaml +7 -0
- data/.gitignore +27 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +5 -0
- data/LICENSE +21 -0
- data/README.md +213 -0
- data/Rakefile +6 -0
- data/bin/console +8 -0
- data/bin/setup +6 -0
- data/glosbe-translate.gemspec +32 -0
- data/lib/glosbe.rb +20 -0
- data/lib/glosbe/author.rb +11 -0
- data/lib/glosbe/http.rb +29 -0
- data/lib/glosbe/language.rb +67 -0
- data/lib/glosbe/language_code.rb +216 -0
- data/lib/glosbe/meaning.rb +9 -0
- data/lib/glosbe/response.rb +78 -0
- data/lib/glosbe/result.rb +15 -0
- data/lib/glosbe/translate.rb +2 -0
- data/lib/glosbe/version.rb +4 -0
- metadata +163 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6ea808d61d9cd3ef928234514027a064f0a16c98
|
4
|
+
data.tar.gz: cd753d4ebb5390f48fed82da7f15cc95a027c6f6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6349b8926cc07a70eef7d4e610626cbaf86bc28768a38ba4af5507102a3c11dae2c707528ebe1f924f4edc1b20695238d75de9498fda5dc788222ddc7b7e3336
|
7
|
+
data.tar.gz: a248b6197a945174998a7337cfa20294469b391e39d63e0e080cdfaaffe7d0aba0b6856eb56cf892e5d9e72ffad59440818621c00722f14cb4ba31969d999e4d
|
data/.gitignore
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/spec/examples.txt
|
9
|
+
/test/tmp/
|
10
|
+
/test/version_tmp/
|
11
|
+
/tmp/
|
12
|
+
/.rspec_status
|
13
|
+
/Gemfile.lock
|
14
|
+
|
15
|
+
# Used by dotenv library to load environment variables.
|
16
|
+
.env
|
17
|
+
|
18
|
+
## Documentation cache and generated files:
|
19
|
+
/.yardoc/
|
20
|
+
/_yardoc/
|
21
|
+
/doc/
|
22
|
+
/rdoc/
|
23
|
+
|
24
|
+
## Environment normalization:
|
25
|
+
/.bundle/
|
26
|
+
/vendor/bundle
|
27
|
+
/lib/bundler/man/
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2017 Kevin McPhillips
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
# Glosbe translate
|
2
|
+
|
3
|
+
[](https://travis-ci.org/kmcphillips/glosbe-translate)
|
4
|
+
|
5
|
+
Wrapper around the [Glosbe](https://glosbe.com) online multilingual dictionary. Translate and get definitions of words between languages.
|
6
|
+
|
7
|
+
See a [full list of supported languages](https://glosbe.com/all-languages).
|
8
|
+
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'glosbe-translate'
|
16
|
+
```
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
$ bundle
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
$ gem install glosbe-translate
|
25
|
+
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
### Language codes
|
30
|
+
|
31
|
+
All translations and definitions take the [ISO-639]((http://en.wikipedia.org/wiki/List_of_ISO_639-3_codes)) languages codes as `to` and `from` in either the two or three character versions. Glosbe supports a [long list of languages](https://glosbe.com/all-languages).
|
32
|
+
|
33
|
+
|
34
|
+
### Single lookups
|
35
|
+
|
36
|
+
Class methods on the language object that allow you to do a single lookup:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
Glosbe::Language.translate("please", from: :en, to: :nl)
|
40
|
+
=> "alstublieft"
|
41
|
+
```
|
42
|
+
|
43
|
+
Fetch an array of definitions in the `from` language:
|
44
|
+
```ruby
|
45
|
+
Glosbe::Language.define("pineapple", from: :en, to: :fr)
|
46
|
+
=> ["fruit",
|
47
|
+
"Large sweet fleshy tropical fruit with a terminal tuft of stiff leaves.",
|
48
|
+
"plant"]
|
49
|
+
```
|
50
|
+
|
51
|
+
Fetch an array of definitions in the `to` language:
|
52
|
+
```ruby
|
53
|
+
Glosbe::Language.translated_define("pie", from: :en, to: :fr)
|
54
|
+
=> ["Plat constitué de viandes, fruits ou autres nourriture cuits dans ou sur une pâte.",
|
55
|
+
"Plat, préparation à base de pâte aplatie au rouleau, et d’une garniture salée ou sucrée"]
|
56
|
+
```
|
57
|
+
|
58
|
+
Any of the three above methods can also use the simpler key value pair of `from: :to` languages:
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
Glosbe::Language.translate("fromage", fr: :en)
|
62
|
+
=> "cheese"
|
63
|
+
```
|
64
|
+
|
65
|
+
## Language object
|
66
|
+
|
67
|
+
Translations and definitions are done from a `Language` object:
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
language = Glosbe::Language.new(from: "eng", to: "nld")
|
71
|
+
```
|
72
|
+
|
73
|
+
Symbols and strings are accepted, and the language code will be converted to match what is expected by the API.
|
74
|
+
|
75
|
+
The same three methods are available to translate and define a phrase using this object:
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
language.translate("please", from: :en, to: :nl)
|
79
|
+
=> "alstublieft"
|
80
|
+
```
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
language.define("pineapple", from: :en, to: :fr)
|
84
|
+
=> ["fruit",
|
85
|
+
"Large sweet fleshy tropical fruit with a terminal tuft of stiff leaves.",
|
86
|
+
"plant"]
|
87
|
+
```
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
language.translated_define("pie", from: :en, to: :fr)
|
91
|
+
=> ["Plat constitué de viandes, fruits ou autres nourriture cuits dans ou sur une pâte.",
|
92
|
+
"Plat, préparation à base de pâte aplatie au rouleau, et d’une garniture salée ou sucrée"]
|
93
|
+
```
|
94
|
+
|
95
|
+
|
96
|
+
### Response object
|
97
|
+
|
98
|
+
Doing a lookup will return a `Response` object:
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
response = language.lookup("coffee")
|
102
|
+
```
|
103
|
+
|
104
|
+
The response represents all the fields returned from the API in a very similar structure.
|
105
|
+
|
106
|
+
Was the HTTP a 200 OK?
|
107
|
+
```
|
108
|
+
response.success?
|
109
|
+
=> true
|
110
|
+
```
|
111
|
+
|
112
|
+
Were any results returned?
|
113
|
+
```
|
114
|
+
response.found?
|
115
|
+
=> true
|
116
|
+
```
|
117
|
+
|
118
|
+
Fields in the response are directly mapped for convenience:
|
119
|
+
```ruby
|
120
|
+
response.from
|
121
|
+
=> "en"
|
122
|
+
response.to
|
123
|
+
=> "nl"
|
124
|
+
response.phrase
|
125
|
+
=> "coffee"
|
126
|
+
```
|
127
|
+
|
128
|
+
There can sometimes be messages returned from the server. This is particularly interesting for rate limiting warnings:
|
129
|
+
```ruby
|
130
|
+
response.messages
|
131
|
+
=> []
|
132
|
+
```
|
133
|
+
|
134
|
+
Convenience methods extract the same three functions and return values repeated above:
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
response.translation
|
138
|
+
response.define
|
139
|
+
response.translated_define
|
140
|
+
```
|
141
|
+
|
142
|
+
The raw results matching the structure of the API are available here.
|
143
|
+
|
144
|
+
|
145
|
+
### Results
|
146
|
+
|
147
|
+
The list of all results is available from a response:
|
148
|
+
|
149
|
+
```ruby
|
150
|
+
response.results
|
151
|
+
=> [...]
|
152
|
+
```
|
153
|
+
|
154
|
+
Each result object has the translated phrase if present;
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
result.phrase
|
158
|
+
=> "koffie"
|
159
|
+
```
|
160
|
+
|
161
|
+
The result then lists its authors:
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
result.authors
|
165
|
+
=> [...]
|
166
|
+
```
|
167
|
+
|
168
|
+
And its meanings:
|
169
|
+
|
170
|
+
```ruby
|
171
|
+
result.meanings
|
172
|
+
=> [...]
|
173
|
+
```
|
174
|
+
|
175
|
+
Each meaning has language and text:
|
176
|
+
|
177
|
+
```ruby
|
178
|
+
meaning.text
|
179
|
+
=> "Een drank bekomen door infusie van de bonen van de koffieplant in heet water."
|
180
|
+
meaning.language
|
181
|
+
=> "nl"
|
182
|
+
```
|
183
|
+
|
184
|
+
None of these fields are guaranteed to exist. Though they will return a string or `nil` for value fields, and will always return an empty array for collection fields.
|
185
|
+
|
186
|
+
|
187
|
+
## Logging
|
188
|
+
|
189
|
+
Logging is defaulted to `nil`, but can be passed any `Logger` object to debug network requests.
|
190
|
+
|
191
|
+
```ruby
|
192
|
+
Glosbe.logger = Logger.new("glosbe.log")
|
193
|
+
Glosbe.logger = Rails.logger
|
194
|
+
```
|
195
|
+
|
196
|
+
|
197
|
+
## Development
|
198
|
+
|
199
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
200
|
+
|
201
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
202
|
+
|
203
|
+
|
204
|
+
## Contributing
|
205
|
+
|
206
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/kmcphillips/glosbe-translate.
|
207
|
+
|
208
|
+
Come talk to me about what you're working on. I'd love to review PRs if you find bugs or think of improvements.
|
209
|
+
|
210
|
+
|
211
|
+
## License
|
212
|
+
|
213
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/bin/console
ADDED
data/bin/setup
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "glosbe/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "glosbe-translate"
|
8
|
+
spec.version = Glosbe::VERSION
|
9
|
+
spec.authors = ["Kevin McPhillips"]
|
10
|
+
spec.email = ["github@kevinmcphillips.ca"]
|
11
|
+
|
12
|
+
spec.summary = %q{Use https://glosbe.com to translate and define words and phrases}
|
13
|
+
spec.description = %q{Wrapper around the JSON api on the Glosbe online multilingual dictionary. Return definitions and translations.}
|
14
|
+
spec.homepage = "https://github.com/kmcphillips/glosbe-translate"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.add_dependency "httparty", "~> 0.15"
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.15"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
spec.add_development_dependency "vcr", "~> 3.0"
|
30
|
+
spec.add_development_dependency "webmock", "~> 3.0"
|
31
|
+
spec.add_development_dependency "pry", "~> 0.10"
|
32
|
+
end
|
data/lib/glosbe.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "glosbe/version"
|
3
|
+
|
4
|
+
require "httparty"
|
5
|
+
require "cgi"
|
6
|
+
require "logger"
|
7
|
+
|
8
|
+
module Glosbe
|
9
|
+
extend self
|
10
|
+
attr_accessor :logger
|
11
|
+
self.logger = Logger.new(nil)
|
12
|
+
end
|
13
|
+
|
14
|
+
require "glosbe/http"
|
15
|
+
require "glosbe/language_code"
|
16
|
+
require "glosbe/language"
|
17
|
+
require "glosbe/author"
|
18
|
+
require "glosbe/meaning"
|
19
|
+
require "glosbe/result"
|
20
|
+
require "glosbe/response"
|
data/lib/glosbe/http.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
class Glosbe::HTTP
|
3
|
+
attr_reader :body, :ok
|
4
|
+
alias_method :ok?, :ok
|
5
|
+
|
6
|
+
include HTTParty
|
7
|
+
base_uri "https://glosbe.com/gapi"
|
8
|
+
logger Glosbe.logger, :debug, :curl
|
9
|
+
|
10
|
+
def initialize(from:, to:, phrase:)
|
11
|
+
Glosbe.logger.debug("[Glosbe::HTTP] request from=#{from} to=#{to} phrase=#{phrase}")
|
12
|
+
|
13
|
+
response = self.class.get("/translate",
|
14
|
+
query: {
|
15
|
+
from: from,
|
16
|
+
dest: to,
|
17
|
+
phrase: phrase,
|
18
|
+
format: "json",
|
19
|
+
pretty: "true",
|
20
|
+
}
|
21
|
+
)
|
22
|
+
|
23
|
+
Glosbe.logger.debug("[Glosbe::HTTP] response code=#{response.code}")
|
24
|
+
Glosbe.logger.debug("[Glosbe::HTTP] response body=#{response.body}")
|
25
|
+
|
26
|
+
@ok = response.ok?
|
27
|
+
@body = response.ok? ? response.parsed_response : nil
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
class Glosbe::Language
|
3
|
+
class << self
|
4
|
+
def translate(phrase, args)
|
5
|
+
from, to = extract_lanuages(args)
|
6
|
+
self.new(from: from, to: to).translate(phrase)
|
7
|
+
end
|
8
|
+
|
9
|
+
def define(phrase, args)
|
10
|
+
from, to = extract_lanuages(args)
|
11
|
+
self.new(from: from, to: to).define(phrase)
|
12
|
+
end
|
13
|
+
|
14
|
+
def translated_define(phrase, args)
|
15
|
+
from, to = extract_lanuages(args)
|
16
|
+
self.new(from: from, to: to).translated_define(phrase)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def extract_lanuages(args)
|
22
|
+
raise ArgumentError, "expected hash but received #{args.class}" unless args.is_a?(Hash)
|
23
|
+
|
24
|
+
if args.keys.sort == [:from, :to]
|
25
|
+
[args[:from], args[:to]]
|
26
|
+
elsif args.size == 1
|
27
|
+
args.first
|
28
|
+
else
|
29
|
+
raise ArgumentError, "languages must be specified as `from: :aaa, to: :bbb` or `aaa: :bbb`"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
attr_reader :from, :to
|
35
|
+
|
36
|
+
def initialize(from:, to:)
|
37
|
+
@from = parse_language(from)
|
38
|
+
@to = parse_language(to)
|
39
|
+
end
|
40
|
+
|
41
|
+
def lookup(phrase)
|
42
|
+
http = Glosbe::HTTP.new(from: from, to: to, phrase: phrase)
|
43
|
+
Glosbe::Response.new(http.body, ok: http.ok?)
|
44
|
+
end
|
45
|
+
|
46
|
+
def translate(phrase)
|
47
|
+
lookup(phrase).translation
|
48
|
+
end
|
49
|
+
|
50
|
+
def define(phrase)
|
51
|
+
lookup(phrase).define
|
52
|
+
end
|
53
|
+
|
54
|
+
def translated_define(phrase)
|
55
|
+
lookup(phrase).translated_define
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def parse_language(value)
|
61
|
+
value = value.to_s if value
|
62
|
+
raise ArgumentError, "Language must be a string or a symbol. Received `#{ value }`." unless value.is_a?(String)
|
63
|
+
raise ArgumentError, "Language must the 2 or 3 character ISO-639 code. Received `#{ value }`. "\
|
64
|
+
"http://en.wikipedia.org/wiki/List_of_ISO_639-3_codes https://glosbe.com/all-languages" unless (2..3).include?(value.length)
|
65
|
+
Glosbe::LanguageCode.normalize(value)
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,216 @@
|
|
1
|
+
module Glosbe::LanguageCode
|
2
|
+
extend self
|
3
|
+
|
4
|
+
CODES = {
|
5
|
+
"aar"=>"aa",
|
6
|
+
"abk"=>"ab",
|
7
|
+
"afr"=>"af",
|
8
|
+
"aka"=>"ak",
|
9
|
+
"alb"=>"sq",
|
10
|
+
"sqi"=>"sq",
|
11
|
+
"amh"=>"am",
|
12
|
+
"ara"=>"ar",
|
13
|
+
"arg"=>"an",
|
14
|
+
"arm"=>"hy",
|
15
|
+
"hye"=>"hy",
|
16
|
+
"asm"=>"as",
|
17
|
+
"ava"=>"av",
|
18
|
+
"ave"=>"ae",
|
19
|
+
"aym"=>"ay",
|
20
|
+
"aze"=>"az",
|
21
|
+
"bak"=>"ba",
|
22
|
+
"bam"=>"bm",
|
23
|
+
"baq"=>"eu",
|
24
|
+
"eus"=>"eu",
|
25
|
+
"bel"=>"be",
|
26
|
+
"ben"=>"bn",
|
27
|
+
"bih"=>"bh",
|
28
|
+
"bis"=>"bi",
|
29
|
+
"tib"=>"bo",
|
30
|
+
"bod"=>"bo",
|
31
|
+
"bos"=>"bs",
|
32
|
+
"bre"=>"br",
|
33
|
+
"bul"=>"bg",
|
34
|
+
"bur"=>"my",
|
35
|
+
"mya"=>"my",
|
36
|
+
"cat"=>"ca",
|
37
|
+
"cze"=>"cs",
|
38
|
+
"ces"=>"cs",
|
39
|
+
"cha"=>"ch",
|
40
|
+
"che"=>"ce",
|
41
|
+
"chi"=>"zh",
|
42
|
+
"zho"=>"zh",
|
43
|
+
"chu"=>"cu",
|
44
|
+
"chv"=>"cv",
|
45
|
+
"cor"=>"kw",
|
46
|
+
"cos"=>"co",
|
47
|
+
"cre"=>"cr",
|
48
|
+
"wel"=>"cy",
|
49
|
+
"cym"=>"cy",
|
50
|
+
"dan"=>"da",
|
51
|
+
"ger"=>"de",
|
52
|
+
"deu"=>"de",
|
53
|
+
"div"=>"dv",
|
54
|
+
"dut"=>"nl",
|
55
|
+
"nld"=>"nl",
|
56
|
+
"dzo"=>"dz",
|
57
|
+
"gre"=>"el",
|
58
|
+
"ell"=>"el",
|
59
|
+
"eng"=>"en",
|
60
|
+
"epo"=>"eo",
|
61
|
+
"est"=>"et",
|
62
|
+
"ewe"=>"ee",
|
63
|
+
"fao"=>"fo",
|
64
|
+
"per"=>"fa",
|
65
|
+
"fas"=>"fa",
|
66
|
+
"fij"=>"fj",
|
67
|
+
"fin"=>"fi",
|
68
|
+
"fre"=>"fr",
|
69
|
+
"fra"=>"fr",
|
70
|
+
"fry"=>"fy",
|
71
|
+
"ful"=>"ff",
|
72
|
+
"geo"=>"ka",
|
73
|
+
"kat"=>"ka",
|
74
|
+
"gla"=>"gd",
|
75
|
+
"gle"=>"ga",
|
76
|
+
"glg"=>"gl",
|
77
|
+
"glv"=>"gv",
|
78
|
+
"grn"=>"gn",
|
79
|
+
"guj"=>"gu",
|
80
|
+
"hat"=>"ht",
|
81
|
+
"hau"=>"ha",
|
82
|
+
"heb"=>"he",
|
83
|
+
"her"=>"hz",
|
84
|
+
"hin"=>"hi",
|
85
|
+
"hmo"=>"ho",
|
86
|
+
"hrv"=>"hr",
|
87
|
+
"hun"=>"hu",
|
88
|
+
"ibo"=>"ig",
|
89
|
+
"ice"=>"is",
|
90
|
+
"isl"=>"is",
|
91
|
+
"ido"=>"io",
|
92
|
+
"iii"=>"ii",
|
93
|
+
"iku"=>"iu",
|
94
|
+
"ile"=>"ie",
|
95
|
+
"ina"=>"ia",
|
96
|
+
"ind"=>"id",
|
97
|
+
"ipk"=>"ik",
|
98
|
+
"ita"=>"it",
|
99
|
+
"jav"=>"jv",
|
100
|
+
"jpn"=>"ja",
|
101
|
+
"kal"=>"kl",
|
102
|
+
"kan"=>"kn",
|
103
|
+
"kas"=>"ks",
|
104
|
+
"kau"=>"kr",
|
105
|
+
"kaz"=>"kk",
|
106
|
+
"khm"=>"km",
|
107
|
+
"kik"=>"ki",
|
108
|
+
"kin"=>"rw",
|
109
|
+
"kir"=>"ky",
|
110
|
+
"kom"=>"kv",
|
111
|
+
"kon"=>"kg",
|
112
|
+
"kor"=>"ko",
|
113
|
+
"kua"=>"kj",
|
114
|
+
"kur"=>"ku",
|
115
|
+
"lao"=>"lo",
|
116
|
+
"lat"=>"la",
|
117
|
+
"lav"=>"lv",
|
118
|
+
"lim"=>"li",
|
119
|
+
"lin"=>"ln",
|
120
|
+
"lit"=>"lt",
|
121
|
+
"ltz"=>"lb",
|
122
|
+
"lub"=>"lu",
|
123
|
+
"lug"=>"lg",
|
124
|
+
"mac"=>"mk",
|
125
|
+
"mkd"=>"mk",
|
126
|
+
"mah"=>"mh",
|
127
|
+
"mal"=>"ml",
|
128
|
+
"mao"=>"mi",
|
129
|
+
"mri"=>"mi",
|
130
|
+
"mar"=>"mr",
|
131
|
+
"may"=>"ms",
|
132
|
+
"msa"=>"ms",
|
133
|
+
"mlg"=>"mg",
|
134
|
+
"mlt"=>"mt",
|
135
|
+
"mon"=>"mn",
|
136
|
+
"nau"=>"na",
|
137
|
+
"nav"=>"nv",
|
138
|
+
"nbl"=>"nr",
|
139
|
+
"nde"=>"nd",
|
140
|
+
"ndo"=>"ng",
|
141
|
+
"nep"=>"ne",
|
142
|
+
"nno"=>"nn",
|
143
|
+
"nob"=>"nb",
|
144
|
+
"nor"=>"no",
|
145
|
+
"nya"=>"ny",
|
146
|
+
"oci"=>"oc",
|
147
|
+
"oji"=>"oj",
|
148
|
+
"ori"=>"or",
|
149
|
+
"orm"=>"om",
|
150
|
+
"oss"=>"os",
|
151
|
+
"pan"=>"pa",
|
152
|
+
"pli"=>"pi",
|
153
|
+
"pol"=>"pl",
|
154
|
+
"por"=>"pt",
|
155
|
+
"pus"=>"ps",
|
156
|
+
"que"=>"qu",
|
157
|
+
"roh"=>"rm",
|
158
|
+
"rum"=>"ro",
|
159
|
+
"ron"=>"ro",
|
160
|
+
"run"=>"rn",
|
161
|
+
"rus"=>"ru",
|
162
|
+
"sag"=>"sg",
|
163
|
+
"san"=>"sa",
|
164
|
+
"sin"=>"si",
|
165
|
+
"slo"=>"sk",
|
166
|
+
"slk"=>"sk",
|
167
|
+
"slv"=>"sl",
|
168
|
+
"sme"=>"se",
|
169
|
+
"smo"=>"sm",
|
170
|
+
"sna"=>"sn",
|
171
|
+
"snd"=>"sd",
|
172
|
+
"som"=>"so",
|
173
|
+
"sot"=>"st",
|
174
|
+
"spa"=>"es",
|
175
|
+
"srd"=>"sc",
|
176
|
+
"srp"=>"sr",
|
177
|
+
"ssw"=>"ss",
|
178
|
+
"sun"=>"su",
|
179
|
+
"swa"=>"sw",
|
180
|
+
"swe"=>"sv",
|
181
|
+
"tah"=>"ty",
|
182
|
+
"tam"=>"ta",
|
183
|
+
"tat"=>"tt",
|
184
|
+
"tel"=>"te",
|
185
|
+
"tgk"=>"tg",
|
186
|
+
"tgl"=>"tl",
|
187
|
+
"tha"=>"th",
|
188
|
+
"tir"=>"ti",
|
189
|
+
"ton"=>"to",
|
190
|
+
"tsn"=>"tn",
|
191
|
+
"tso"=>"ts",
|
192
|
+
"tuk"=>"tk",
|
193
|
+
"tur"=>"tr",
|
194
|
+
"twi"=>"tw",
|
195
|
+
"uig"=>"ug",
|
196
|
+
"ukr"=>"uk",
|
197
|
+
"urd"=>"ur",
|
198
|
+
"uzb"=>"uz",
|
199
|
+
"ven"=>"ve",
|
200
|
+
"vie"=>"vi",
|
201
|
+
"vol"=>"vo",
|
202
|
+
"wln"=>"wa",
|
203
|
+
"wol"=>"wo",
|
204
|
+
"xho"=>"xh",
|
205
|
+
"yid"=>"yi",
|
206
|
+
"yor"=>"yo",
|
207
|
+
"zha"=>"za",
|
208
|
+
"zul"=>"zu",
|
209
|
+
}.freeze
|
210
|
+
|
211
|
+
def normalize(code)
|
212
|
+
return unless code
|
213
|
+
code = code.to_s
|
214
|
+
CODES[code] || code
|
215
|
+
end
|
216
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
class Glosbe::Response
|
3
|
+
attr_reader :ok, :body
|
4
|
+
|
5
|
+
def initialize(body, ok:)
|
6
|
+
@body = body
|
7
|
+
@ok = !!ok
|
8
|
+
end
|
9
|
+
|
10
|
+
alias_method :ok?, :ok
|
11
|
+
|
12
|
+
def from
|
13
|
+
body["from"]
|
14
|
+
end
|
15
|
+
|
16
|
+
def to
|
17
|
+
body["dest"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def phrase
|
21
|
+
body["phrase"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def messages
|
25
|
+
body["messages"] || []
|
26
|
+
end
|
27
|
+
|
28
|
+
def success?
|
29
|
+
ok? && body["result"] == "ok"
|
30
|
+
end
|
31
|
+
|
32
|
+
def found?
|
33
|
+
success? && results.any?
|
34
|
+
end
|
35
|
+
|
36
|
+
def results
|
37
|
+
@results ||= begin
|
38
|
+
if success? && body["tuc"].any?
|
39
|
+
body["tuc"].map { |data| Glosbe::Result.new(data, authors: authors) }
|
40
|
+
else
|
41
|
+
[]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def authors
|
47
|
+
@authors ||= begin
|
48
|
+
if success?
|
49
|
+
body["authors"].map { |data| Glosbe::Author.new(data[1]) }
|
50
|
+
else
|
51
|
+
[]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def translation
|
57
|
+
result = results.find { |result| result.phrase }
|
58
|
+
result.phrase if result
|
59
|
+
end
|
60
|
+
|
61
|
+
def define
|
62
|
+
@define ||= extract_definitions_for(from)
|
63
|
+
end
|
64
|
+
|
65
|
+
def translated_define
|
66
|
+
@translated_define ||= extract_definitions_for(to)
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def extract_definitions_for(language)
|
72
|
+
results.map do |result|
|
73
|
+
result.meanings.map do |meaning|
|
74
|
+
meaning.text if meaning.language == language
|
75
|
+
end
|
76
|
+
end.flatten.compact
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
class Glosbe::Result
|
3
|
+
attr_reader :phrase, :language, :authors, :meanings
|
4
|
+
|
5
|
+
def initialize(data, authors: [])
|
6
|
+
if data["phrase"]
|
7
|
+
@phrase = data["phrase"]["text"]
|
8
|
+
@language = data["phrase"]["language"]
|
9
|
+
end
|
10
|
+
@authors = authors.select do |author|
|
11
|
+
data["authors"].include?(author.id)
|
12
|
+
end
|
13
|
+
@meanings = (data["meanings"] || []).map { |meaning| Glosbe::Meaning.new(meaning) }
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: glosbe-translate
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kevin McPhillips
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httparty
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.15'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.15'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.15'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.15'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: vcr
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: webmock
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.10'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.10'
|
111
|
+
description: Wrapper around the JSON api on the Glosbe online multilingual dictionary.
|
112
|
+
Return definitions and translations.
|
113
|
+
email:
|
114
|
+
- github@kevinmcphillips.ca
|
115
|
+
executables: []
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- ".gitignore"
|
120
|
+
- ".rspec"
|
121
|
+
- ".travis.yml"
|
122
|
+
- Gemfile
|
123
|
+
- LICENSE
|
124
|
+
- README.md
|
125
|
+
- Rakefile
|
126
|
+
- bin/console
|
127
|
+
- bin/setup
|
128
|
+
- glosbe-translate.gemspec
|
129
|
+
- lib/glosbe.rb
|
130
|
+
- lib/glosbe/author.rb
|
131
|
+
- lib/glosbe/http.rb
|
132
|
+
- lib/glosbe/language.rb
|
133
|
+
- lib/glosbe/language_code.rb
|
134
|
+
- lib/glosbe/meaning.rb
|
135
|
+
- lib/glosbe/response.rb
|
136
|
+
- lib/glosbe/result.rb
|
137
|
+
- lib/glosbe/translate.rb
|
138
|
+
- lib/glosbe/version.rb
|
139
|
+
homepage: https://github.com/kmcphillips/glosbe-translate
|
140
|
+
licenses:
|
141
|
+
- MIT
|
142
|
+
metadata: {}
|
143
|
+
post_install_message:
|
144
|
+
rdoc_options: []
|
145
|
+
require_paths:
|
146
|
+
- lib
|
147
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
requirements: []
|
158
|
+
rubyforge_project:
|
159
|
+
rubygems_version: 2.5.1
|
160
|
+
signing_key:
|
161
|
+
specification_version: 4
|
162
|
+
summary: Use https://glosbe.com to translate and define words and phrases
|
163
|
+
test_files: []
|