to_lang 0.1.1 → 0.2.0
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/README.textile +35 -9
- data/lib/to_lang/codemap.rb +0 -1
- data/lib/to_lang/connector.rb +10 -3
- data/lib/to_lang/string_methods.rb +14 -0
- data/lib/to_lang/version.rb +1 -1
- data/spec/to_lang/connector_spec.rb +25 -1
- data/spec/to_lang/string_methods_spec.rb +38 -32
- data/spec/to_lang_spec.rb +1 -1
- metadata +4 -4
data/README.textile
CHANGED
@@ -10,7 +10,7 @@ h2. Usage
|
|
10
10
|
|
11
11
|
To use *to_lang*, require the library, then call @ToLang.start@ with your Google Translate API key. At this point you will have access to all the new translation methods, which take the form @to_language@, where "language" is the language you wish to translate to.
|
12
12
|
|
13
|
-
Google Translate attempts to detect the source language, but you can specify it explicitly by calling methods in the form @
|
13
|
+
Google Translate attempts to detect the source language, but you can specify it explicitly by calling methods in the form @to_target_language_from_source_language@, where "target language" is the language you are translating to and "source_language" is the language you are starting with. An inverted form with equivalent functionality, @from_source_language_to_target_language@ is also available. These methods are generated dynamically and will not appear in a call to @String.new.methods@ until they have been called once. Strings will, however, @respond_to?@ these methods prior to their dynamic definition.
|
14
14
|
|
15
15
|
The dynamic methods are simply syntactic sugar for @String#translate@, which you can use directly as well.
|
16
16
|
|
@@ -18,36 +18,62 @@ h2. Examples
|
|
18
18
|
|
19
19
|
Load and initialize *to_lang*:
|
20
20
|
|
21
|
-
|
21
|
+
<pre><code>require 'to_lang'
|
22
22
|
ToLang.start('YOUR_GOOGLE_TRANSLATE_API_KEY')
|
23
|
+
</code></pre>
|
23
24
|
|
24
25
|
Translate some text to Spanish:
|
25
26
|
|
26
|
-
|
27
|
+
<pre><code>"Very cool gem!".to_spanish
|
27
28
|
=> "Muy fresco joya!"
|
29
|
+
</code></pre>
|
28
30
|
|
29
31
|
A case where the source language is ambiguous:
|
30
32
|
|
31
|
-
|
33
|
+
<pre><code>"a pie".to_spanish
|
32
34
|
=> "a pie"
|
33
35
|
"a pie".to_spanish_from_english
|
34
36
|
=> "un pastel"
|
37
|
+
</code></pre>
|
38
|
+
|
39
|
+
Or equivalently:
|
40
|
+
|
41
|
+
<pre><code>"a pie".from_english_to_spanish
|
42
|
+
=> "un pastel"
|
43
|
+
</code></pre>
|
35
44
|
|
36
45
|
Using @String#translate@ directly:
|
37
46
|
|
38
|
-
|
47
|
+
<pre><code>"hello world".translate('es')
|
39
48
|
=> "hola mundo"
|
40
49
|
"a pie".translate('es', :from => 'en')
|
41
50
|
=> "un pastel"
|
51
|
+
</code></pre>
|
52
|
+
|
53
|
+
h2. Debugging
|
54
|
+
|
55
|
+
@String#translate@ also has the advantage of allowing you to get debug output for a translation. @String#translate@ accepts a @:debug@ option with three possible values: @:request@, @:response@, and @:all@. @:request@ will cause the method to return the generated URL for the Google Translate API call. @:response@ will cause the method to return the full response from the API call as a hash. @:all@ will cause the method to return a hash which contains both the generated request URL and the full response.
|
56
|
+
|
57
|
+
<pre><code>"hello world".translate('es', :debug => :response)
|
58
|
+
=> https://www.googleapis.com/language/translate/v2?key=my_key&q=hello+world&target=es
|
59
|
+
</code></pre>
|
60
|
+
|
61
|
+
<pre><code>"hello world".translate('es', :debug => :response)
|
62
|
+
=> {"data"=>{"translations"=>[{"translatedText"=>"hola mundo"}]}}
|
63
|
+
</code></pre>
|
64
|
+
|
65
|
+
<pre><code>"hello world".translate('es', :debug => :all)
|
66
|
+
=> {:request=>"https://www.googleapis.com/language/translate/v2?key=my_key&q=hello+world&target=es",
|
67
|
+
:response=>{"data"=>{"translations"=>[{"translatedText"=>"hola mundo"}]}}}
|
68
|
+
</code></pre>
|
42
69
|
|
43
70
|
h2. Supported Languages
|
44
71
|
|
45
|
-
*to_lang* adds the following methods to strings. Each of these methods can be called with an explicit source language by appending @
|
72
|
+
*to_lang* adds the following methods to strings. Each of these methods can be called with an explicit source language by appending @_from_source_language@ or prepending @from_source_language_@ to the method name.
|
46
73
|
|
47
74
|
* to_afrikaans
|
48
75
|
* to_albanian
|
49
76
|
* to_arabic
|
50
|
-
* to_basque
|
51
77
|
* to_belarusian
|
52
78
|
* to_bulgarian
|
53
79
|
* to_catalan
|
@@ -104,8 +130,8 @@ API documentation can be found at "rubydoc.info":http://rubydoc.info/github/jimm
|
|
104
130
|
|
105
131
|
h2. Roadmap
|
106
132
|
|
107
|
-
*
|
133
|
+
* Investigate Unicode support for Ruby 1.8. *to_lang* has only been tested with 1.9.
|
108
134
|
|
109
135
|
h2. Feedback and Contributions
|
110
136
|
|
111
|
-
Feedback is greatly appreciated
|
137
|
+
Feedback is greatly appreciated. If you have any problems with *to_lang*, please open a new issue. Make sure you are using the latest version of the gem, or HEAD if you've cloned the Git repository directly. Please include debugging output from using @String#translate@'s @:debug@ option, if relevant to your issue. If you'd like to fix bugs, add features, or improve the library in general, feel free to fork the project and send me a pull request with your changes.
|
data/lib/to_lang/codemap.rb
CHANGED
data/lib/to_lang/connector.rb
CHANGED
@@ -28,12 +28,19 @@ module ToLang
|
|
28
28
|
# @param [String] target The language code for the language to translate to.
|
29
29
|
# @param [Hash] options A hash of options.
|
30
30
|
# @option options [String] :from The language code for the language of @q@.
|
31
|
+
# @option options [Symbol] :debug Debug output to return instead of the translated string. Must be one of @:request@, @:response@, or @:all@.
|
31
32
|
#
|
32
|
-
# @raise [RuntimeError] Raises an
|
33
|
-
# @return [String] The translated string.
|
33
|
+
# @raise [RuntimeError] Raises an exception for any errors returned by Google Translate.
|
34
|
+
# @return [String, Hash] The translated string or debugging output, as requested.
|
34
35
|
#
|
35
36
|
def request(q, target, options = {})
|
36
|
-
|
37
|
+
request = request_url(q, target, options)
|
38
|
+
return request if options[:debug] == :request
|
39
|
+
|
40
|
+
response = HTTParty.get(request)
|
41
|
+
return { :request => request, :response => response.parsed_response } if options[:debug] == :all
|
42
|
+
return response.parsed_response if options[:debug] == :response
|
43
|
+
|
37
44
|
raise response.parsed_response["error"]["message"] if response.parsed_response["error"] && response.parsed_response["error"]["message"]
|
38
45
|
CGI.unescapeHTML(response.parsed_response["data"]["translations"][0]["translatedText"])
|
39
46
|
end
|
@@ -34,6 +34,18 @@ module ToLang
|
|
34
34
|
translate(CODEMAP[$1], :from => CODEMAP[$2])
|
35
35
|
end
|
36
36
|
|
37
|
+
return send(new_method_name)
|
38
|
+
else
|
39
|
+
original_method_missing(method, *args, &block)
|
40
|
+
end
|
41
|
+
when /^from_(.*)_to_(.*)$/
|
42
|
+
if CODEMAP[$1] && CODEMAP[$2]
|
43
|
+
new_method_name = "from_#{$1}_to_#{$2}".to_sym
|
44
|
+
|
45
|
+
self.class.send(:define_method, new_method_name) do
|
46
|
+
translate(CODEMAP[$2], :from => CODEMAP[$1])
|
47
|
+
end
|
48
|
+
|
37
49
|
return send(new_method_name)
|
38
50
|
else
|
39
51
|
original_method_missing(method, *args, &block)
|
@@ -66,6 +78,8 @@ module ToLang
|
|
66
78
|
case method.to_s
|
67
79
|
when /^to_(.*)_from_(.*)$/
|
68
80
|
return true if CODEMAP[$1] && CODEMAP[$2]
|
81
|
+
when /^from_(.*)_to_(.*)$/
|
82
|
+
return true if CODEMAP[$1] && CODEMAP[$2]
|
69
83
|
when /^to_(.*)$/
|
70
84
|
return true if CODEMAP[$1]
|
71
85
|
end
|
data/lib/to_lang/version.rb
CHANGED
@@ -9,7 +9,7 @@ describe ToLang::Connector do
|
|
9
9
|
@connector.key.should_not be_nil
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
describe "#request" do
|
13
13
|
def stub_response(parsed_response)
|
14
14
|
mock_response = mock('HTTParty::Response', :parsed_response => parsed_response)
|
15
15
|
HTTParty.stub(:get).and_return(mock_response)
|
@@ -18,11 +18,13 @@ describe ToLang::Connector do
|
|
18
18
|
def stub_good_response(translated_text)
|
19
19
|
parsed_response = { "data" => { "translations" => [ { "translatedText" => translated_text } ] } }
|
20
20
|
stub_response(parsed_response)
|
21
|
+
parsed_response
|
21
22
|
end
|
22
23
|
|
23
24
|
def stub_bad_response(error_message)
|
24
25
|
parsed_response = { "error" => { "message" => error_message } }
|
25
26
|
stub_response(parsed_response)
|
27
|
+
parsed_response
|
26
28
|
end
|
27
29
|
|
28
30
|
context "with only a target language" do
|
@@ -54,5 +56,27 @@ describe ToLang::Connector do
|
|
54
56
|
expect { @connector.request("a pie", "en", :from => "en") }.to raise_error(RuntimeError, "Bad language pair: en|en")
|
55
57
|
end
|
56
58
|
end
|
59
|
+
|
60
|
+
context "when debugging the request" do
|
61
|
+
it "returns the request URL" do
|
62
|
+
HTTParty.stub(:get)
|
63
|
+
@connector.request("hello world", "es", :from => "en", :debug => :request).should == "https://www.googleapis.com/language/translate/v2?key=apikey&q=hello+world&target=es&source=en"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "when debugging the response" do
|
68
|
+
it "returns the full parsed response" do
|
69
|
+
expected_response = stub_good_response("hola mundo")
|
70
|
+
@connector.request("hello world", "es", :from => "en", :debug => :response).should == expected_response
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when debugging the request and the response" do
|
75
|
+
it "returns a hash with the request URL and the full parsed response" do
|
76
|
+
expected_response = stub_good_response("hola mundo")
|
77
|
+
output = @connector.request("hello world", "es", :from => "en", :debug => :all)
|
78
|
+
output.should == { :request => "https://www.googleapis.com/language/translate/v2?key=apikey&q=hello+world&target=es&source=en", :response => expected_response }
|
79
|
+
end
|
80
|
+
end
|
57
81
|
end
|
58
82
|
end
|
@@ -1,15 +1,11 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe String do
|
4
4
|
before :all do
|
5
5
|
ToLang.start('apikey')
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
String.new.should respond_to :translate
|
10
|
-
end
|
11
|
-
|
12
|
-
context "when sent :translate" do
|
8
|
+
describe "#translate" do
|
13
9
|
it "calls ToLang::Connector#request" do
|
14
10
|
ToLang.connector.stub(:request)
|
15
11
|
ToLang.connector.should_receive(:request).with("hello world", "es")
|
@@ -17,41 +13,47 @@ describe "A ToLang-enabled string" do
|
|
17
13
|
end
|
18
14
|
end
|
19
15
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
16
|
+
it "will respond to :to_<language>" do
|
17
|
+
"hello world".should respond_to :to_spanish
|
18
|
+
end
|
24
19
|
|
25
|
-
|
26
|
-
|
27
|
-
|
20
|
+
it "will respond to :to_<target>_from_<source>" do
|
21
|
+
"hello world".should respond_to :to_spanish_from_english
|
22
|
+
end
|
28
23
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
"hello world".send("to_#{language}")
|
33
|
-
end
|
24
|
+
it "will respond to :from_<source>_to_<target>" do
|
25
|
+
"hello world".should respond_to :from_english_to_spanish
|
26
|
+
end
|
34
27
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
28
|
+
it "translates to <language> when sent :to_<language>" do
|
29
|
+
ToLang.connector.stub(:request)
|
30
|
+
ToLang.connector.should_receive(:request).with("hello world", 'es')
|
31
|
+
"hello world".send(:to_spanish)
|
40
32
|
end
|
41
33
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
34
|
+
it "translates to <target> from <source> when sent :to_<target>_from_<source>" do
|
35
|
+
ToLang.connector.stub(:request)
|
36
|
+
ToLang.connector.should_receive(:request).with("hello world", 'es', :from => 'en')
|
37
|
+
"hello world".send(:to_spanish_from_english)
|
38
|
+
end
|
48
39
|
|
49
|
-
|
50
|
-
|
51
|
-
|
40
|
+
it "translates to <target> from <source> when sent :from_<source>_to_<target>" do
|
41
|
+
ToLang.connector.stub(:request)
|
42
|
+
ToLang.connector.should_receive(:request).with("hello world", 'es', :from => 'en')
|
43
|
+
"hello world".send(:from_english_to_spanish)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "defines magic methods when first called and doesn't call :method_missing after that" do
|
47
|
+
ToLang.connector.stub(:request)
|
48
|
+
string = "hello world"
|
49
|
+
magic_methods = lambda do
|
52
50
|
string.to_spanish
|
53
51
|
string.to_spanish_from_english
|
52
|
+
string.from_english_to_spanish
|
54
53
|
end
|
54
|
+
magic_methods.call
|
55
|
+
string.should_not_receive(:method_missing)
|
56
|
+
magic_methods.call
|
55
57
|
end
|
56
58
|
|
57
59
|
it "calls the original :method_missing if there is no language match in the first form" do
|
@@ -62,6 +64,10 @@ describe "A ToLang-enabled string" do
|
|
62
64
|
expect { "hello world".to_foo_from_bar }.to raise_error(NoMethodError)
|
63
65
|
end
|
64
66
|
|
67
|
+
it "calls the original :method_missing if there is a bad language match in the reversed second form" do
|
68
|
+
expect { "hello world".from_bar_to_foo }.to raise_error(NoMethodError)
|
69
|
+
end
|
70
|
+
|
65
71
|
it "calls the original :method_missing if the method does not match either form" do
|
66
72
|
expect { "hello world".foo }.to raise_error(NoMethodError)
|
67
73
|
end
|
data/spec/to_lang_spec.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jimmy Cuadra
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-01-04 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|