rack-i18n_locale_switcher 0.4.0 → 0.5.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/CHANGELOG CHANGED
@@ -1,5 +1,9 @@
1
+ = 0.5.0 / 2011-11-29
2
+ Added option to redirect to a given URL scheme.
3
+ Added support for canonical URLs with the default locale.
4
+
1
5
  = 0.4.0 / 2011-11-26
2
- Added support configuration of sources from which to determine the locale
6
+ Added support for configuring of sources from which to determine the locale
3
7
  as well as the name of the query parameter.
4
8
  Drop support for TLD since locale can't be reliably inferred from it
5
9
  Code refactoring and better test coverage.
data/Manifest CHANGED
@@ -5,4 +5,4 @@ README.md
5
5
  Rakefile
6
6
  lib/rack/i18n_locale_switcher.rb
7
7
  rack-i18n_locale_switcher.gemspec
8
- spec/i18n_locale_switcher_spec.rb
8
+ spec/rack/i18n_locale_switcher_spec.rb
data/Rakefile CHANGED
@@ -2,7 +2,7 @@
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('rack-i18n_locale_switcher', '0.4.0') do |p|
5
+ Echoe.new('rack-i18n_locale_switcher', '0.5.0') do |p|
6
6
 
7
7
  p.description = "Detects the current locale from query parameter, path prefix, host or accept header."
8
8
  p.url = "http://github.com/christoph-buente/rack-i18n_locale_switcher"
@@ -20,7 +20,7 @@ Echoe.new('rack-i18n_locale_switcher', '0.4.0') do |p|
20
20
  *.tmproj
21
21
  }
22
22
 
23
- p.runtime_dependencies = [ "rack", "i18n", "domainatrix" ]
23
+ p.runtime_dependencies = [ "rack", "i18n" ]
24
24
  p.development_dependencies = [ "echoe", "rspec", "rack-test" ]
25
25
  end
26
26
 
@@ -1,12 +1,18 @@
1
1
  require 'i18n'
2
- # require 'domainatrix'
3
2
 
4
3
  module Rack
5
4
  class I18nLocaleSwitcher
6
5
 
6
+ LOCALE_PATTERN = '([a-z]{1,8})(-[a-zA-Z]{1,8})?'.freeze
7
+
8
+ SOURCES = [ :param, :path, :host, :header ].freeze
9
+ REDIRECTS = [ :param, :path, :host ].freeze
10
+
7
11
  DEFAULT_OPTIONS = {
8
- :param => 'locale',
9
- :source => [ :param, :path, :host, :header ]
12
+ :param => 'locale',
13
+ :source => SOURCES,
14
+ :redirect => nil,
15
+ :canonical => false
10
16
  }.freeze
11
17
 
12
18
  def initialize(app, options = {})
@@ -18,54 +24,120 @@ module Rack
18
24
  raise ArgumentError, "Invalid option(s) #{ invalid_options.map(&:inspect).join(', ') }"
19
25
  end
20
26
 
21
- @options = DEFAULT_OPTIONS.merge(options)
22
- @options[:source] = Array(@options[:source]) unless @options[:source].is_a?(Array)
27
+ options = DEFAULT_OPTIONS.merge(options)
28
+
29
+ @param = options[:param]
30
+ @canonical = options[:canonical]
31
+
32
+ @sources = options[:source]
33
+ @sources = Array(@sources) unless @sources.is_a?(Array)
34
+
35
+ invalid_sources = @sources - SOURCES
36
+
37
+ if invalid_sources.any?
38
+ raise ArgumentError, "Invalid source(s) #{ invalid_sources.map(&:inspect).join(', ') }"
39
+ end
40
+
41
+ @redirect = options[:redirect]
42
+
43
+ unless @redirect.nil? || REDIRECTS.include?(@redirect)
44
+ raise ArgumentError, "Invalid redirect option #{ @redirect.inspect }"
45
+ end
23
46
  end
24
47
 
25
48
  def call(env)
26
49
  I18n.locale = I18n.default_locale
27
50
 
28
- @options[:source].each do |source|
29
- if locale = send(:"get_locale_from_#{source}", env)
51
+ env['PATH_INFO'].gsub!(/([^\/])\/$/, '\1')
52
+
53
+ request = Rack::Request.new(env)
54
+ request_url = request.url
55
+
56
+ source = nil
57
+ @sources.each do |src|
58
+ locale = send(:"extract_locale_from_#{src}", env)
59
+ if locale && source.nil?
60
+ source = src
30
61
  I18n.locale = locale
31
- break
32
62
  end
33
63
  end
34
-
64
+
65
+ if @redirect
66
+ unless @canonical && I18n.locale == I18n.default_locale
67
+ send(:"set_locale_in_#@redirect", env)
68
+ end
69
+
70
+ if request.url != request_url
71
+ env['PATH_INFO'] = '' if env['PATH_INFO'] == '/'
72
+ return [ 301, { 'Location' => request.url }, ["Redirecting"]]
73
+ end
74
+ end
75
+
35
76
  @app.call(env)
36
77
  end
37
78
 
38
79
  private
80
+
81
+ def extract_locale_from_param(env)
82
+ query_string = env['QUERY_STRING'].gsub(/\b#{ @param }=#{ LOCALE_PATTERN }(?:&|$)/, '')
39
83
 
40
- def get_locale_from_param(env)
41
- env['QUERY_STRING'] =~ /\b#{ @options[:param] }=([^&]+)\b/
42
- to_available_locale($1)
84
+ if locale = available_locale($1, $2)
85
+ env['QUERY_STRING'] = query_string.gsub(/&$/, '')
86
+ end
87
+ locale
43
88
  end
44
89
 
45
- def get_locale_from_path(env)
46
- env['PATH_INFO'] =~ /^\/([^\/]+)/
47
- to_available_locale($1)
90
+ def extract_locale_from_path(env)
91
+ path_info = env['PATH_INFO'].gsub(/^\/#{ LOCALE_PATTERN }\b/, '')
92
+
93
+ if locale = available_locale($1, $2)
94
+ env['PATH_INFO'] = path_info
95
+ end
96
+ locale
48
97
  end
49
98
 
50
- def get_locale_from_host(env)
51
- env['SERVER_NAME'] =~ /^([^.]+)\.[^.]+\.[^.]+/i
52
- to_available_locale($1)
99
+ def extract_locale_from_host(env)
100
+ env['HTTP_HOST'] ||= "#{ env['SERVER_NAME'] }:#{ env['SERVER_PORT'] }"
101
+
102
+ http_host = env['HTTP_HOST'].gsub(/^#{ LOCALE_PATTERN }\./, '')
103
+
104
+ if locale = available_locale($1, $2)
105
+ env['HTTP_HOST'] = http_host
106
+ env['SERVER_NAME'] = http_host.gsub(/:\d+$/, '')
107
+ end
108
+ locale
53
109
  end
54
110
 
55
- def get_locale_from_header(env)
56
- locale = nil
111
+ def extract_locale_from_header(env)
112
+ locale = nil
57
113
  if accept = env['HTTP_ACCEPT_LANGUAGE']
58
- locales = accept.scan(/([^;,]+)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i)
114
+ locales = accept.scan(/#{ LOCALE_PATTERN }\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i)
59
115
  locales.sort_by{ |loc| 1 - (loc.last || 1).to_f }.each do |loc|
60
- break if locale = to_available_locale(loc.first)
116
+ break if locale = available_locale(*loc[0,2])
61
117
  end
62
- end
118
+ end
63
119
  locale
64
120
  end
121
+
122
+ def set_locale_in_param(env)
123
+ env['QUERY_STRING'] << '&' unless env['QUERY_STRING'].empty?
124
+ env['QUERY_STRING'] << "#{ @param }=#{ I18n.locale }"
125
+ end
126
+
127
+ def set_locale_in_path(env)
128
+ env['PATH_INFO'] = "/#{ I18n.locale }#{ env['PATH_INFO'] }"
129
+ env['PATH_INFO'].gsub!(/\/$/, '')
130
+ end
131
+
132
+ def set_locale_in_host(env)
133
+ ['HTTP_HOST', 'SERVER_NAME'].each do |key|
134
+ env[ key ] = "#{ I18n.locale }.#{ env[ key ] }"
135
+ end
136
+ end
65
137
 
66
- def to_available_locale(locale)
67
- if locale =~ /^([a-z]{1,8})(-[a-z]{1,8})?$/i
68
- locale = :"#{ $1.downcase }#{ ($2 || '').upcase }"
138
+ def available_locale(language, region)
139
+ if language
140
+ locale = :"#{ language.downcase }#{ (region || '').upcase }"
69
141
  locale if I18n.available_locales.include?(locale)
70
142
  end
71
143
  end
@@ -1,22 +1,22 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.name = "rack-i18n_locale_switcher"
5
- s.version = "0.4.0"
4
+ s.name = %q{rack-i18n_locale_switcher}
5
+ s.version = "0.5.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Christoph B\u{fc}nte, Andreas Korth"]
9
- s.date = "2011-11-26"
10
- s.description = "Detects the current locale from query parameter, path prefix, host or accept header."
8
+ s.authors = ["Christoph B\303\274nte, Andreas Korth"]
9
+ s.date = %q{2011-11-29}
10
+ s.description = %q{Detects the current locale from query parameter, path prefix, host or accept header.}
11
11
  s.email = ["info@christophbuente.de", "andreas.korth@gmail.com"]
12
12
  s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.md", "lib/rack/i18n_locale_switcher.rb"]
13
- s.files = ["CHANGELOG", "LICENSE", "Manifest", "README.md", "Rakefile", "lib/rack/i18n_locale_switcher.rb", "rack-i18n_locale_switcher.gemspec", "spec/i18n_locale_switcher_spec.rb"]
14
- s.homepage = "http://github.com/christoph-buente/rack-i18n_locale_switcher"
13
+ s.files = ["CHANGELOG", "LICENSE", "Manifest", "README.md", "Rakefile", "lib/rack/i18n_locale_switcher.rb", "rack-i18n_locale_switcher.gemspec", "spec/rack/i18n_locale_switcher_spec.rb"]
14
+ s.homepage = %q{http://github.com/christoph-buente/rack-i18n_locale_switcher}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rack-i18n_locale_switcher", "--main", "README.md"]
16
16
  s.require_paths = ["lib"]
17
- s.rubyforge_project = "rack-i18n_locale_switcher"
18
- s.rubygems_version = "1.8.11"
19
- s.summary = "Detects the current locale from query parameter, path prefix, host or accept header."
17
+ s.rubyforge_project = %q{rack-i18n_locale_switcher}
18
+ s.rubygems_version = %q{1.6.2}
19
+ s.summary = %q{Detects the current locale from query parameter, path prefix, host or accept header.}
20
20
 
21
21
  if s.respond_to? :specification_version then
22
22
  s.specification_version = 3
@@ -24,14 +24,12 @@ Gem::Specification.new do |s|
24
24
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
25
25
  s.add_runtime_dependency(%q<rack>, [">= 0"])
26
26
  s.add_runtime_dependency(%q<i18n>, [">= 0"])
27
- s.add_runtime_dependency(%q<domainatrix>, [">= 0"])
28
27
  s.add_development_dependency(%q<echoe>, [">= 0"])
29
28
  s.add_development_dependency(%q<rspec>, [">= 0"])
30
29
  s.add_development_dependency(%q<rack-test>, [">= 0"])
31
30
  else
32
31
  s.add_dependency(%q<rack>, [">= 0"])
33
32
  s.add_dependency(%q<i18n>, [">= 0"])
34
- s.add_dependency(%q<domainatrix>, [">= 0"])
35
33
  s.add_dependency(%q<echoe>, [">= 0"])
36
34
  s.add_dependency(%q<rspec>, [">= 0"])
37
35
  s.add_dependency(%q<rack-test>, [">= 0"])
@@ -39,7 +37,6 @@ Gem::Specification.new do |s|
39
37
  else
40
38
  s.add_dependency(%q<rack>, [">= 0"])
41
39
  s.add_dependency(%q<i18n>, [">= 0"])
42
- s.add_dependency(%q<domainatrix>, [">= 0"])
43
40
  s.add_dependency(%q<echoe>, [">= 0"])
44
41
  s.add_dependency(%q<rspec>, [">= 0"])
45
42
  s.add_dependency(%q<rack-test>, [">= 0"])
@@ -0,0 +1,298 @@
1
+ require 'rack/i18n_locale_switcher'
2
+ require 'rack/test'
3
+
4
+ describe Rack::I18nLocaleSwitcher do
5
+
6
+ include Rack::Test::Methods
7
+
8
+ let :options do
9
+ {}
10
+ end
11
+
12
+ let :app do
13
+ opts = options
14
+ rack = Rack::Builder.new do
15
+ map "/" do
16
+ use Rack::I18nLocaleSwitcher, opts
17
+ run lambda { |env| [200, {}, "Coolness"] }
18
+ end
19
+ end
20
+ rack.to_app
21
+ end
22
+
23
+ before do
24
+ I18n.available_locales = [:en, :'en-US', :de, :'de-DE', :es]
25
+ I18n.default_locale = :en
26
+ end
27
+
28
+ it "should fall back to the locale to default locale" do
29
+ get "http://example.com/some/path"
30
+ I18n.locale.should eql(I18n.default_locale)
31
+
32
+ get "http://www.example.com/"
33
+ I18n.locale.should eql(I18n.default_locale)
34
+ end
35
+
36
+ it "should not accept invalid options" do
37
+ expect {
38
+ Rack::I18nLocaleSwitcher.new("app", :not_an_option => "foo")
39
+ }.to raise_error(ArgumentError, "Invalid option(s) :not_an_option")
40
+
41
+ expect {
42
+ Rack::I18nLocaleSwitcher.new("app", :source => [ :not_a_source ])
43
+ }.to raise_error(ArgumentError, "Invalid source(s) :not_a_source")
44
+
45
+ expect {
46
+ Rack::I18nLocaleSwitcher.new("app", :redirect => :not_a_source)
47
+ }.to raise_error(ArgumentError, "Invalid redirect option :not_a_source")
48
+ end
49
+
50
+ context "with custom sources" do
51
+
52
+ let :options do
53
+ { :source => [ :header, :host ] }
54
+ end
55
+
56
+ it "should honor the sequence" do
57
+ get "http://de.example.com" , nil, {"HTTP_ACCEPT_LANGUAGE" => "es"}
58
+ I18n.locale.should eql(:es)
59
+
60
+ get "http://de.example.com" , nil, {"HTTP_ACCEPT_LANGUAGE" => "foo"}
61
+ I18n.locale.should eql(:de)
62
+
63
+ get "http://de.example.com"
64
+ I18n.locale.should eql(:de)
65
+ end
66
+
67
+ it "should ignore other sources" do
68
+ get "http://example.com?locale=de"
69
+ I18n.locale.should eql(:en)
70
+
71
+ get "http://example.com/de"
72
+ I18n.locale.should eql(:en)
73
+ end
74
+ end
75
+
76
+ context "request param" do
77
+
78
+ it "should set the locale" do
79
+ get "http://example.com?locale=de"
80
+ I18n.locale.should eql(:de)
81
+
82
+ get "http://example.com?locale=en-US"
83
+ I18n.locale.should eql(:'en-US')
84
+
85
+ get "http://example.com/some/path?foo=bar&locale=es&param=value"
86
+ I18n.locale.should eql(:es)
87
+ end
88
+
89
+ it "should not set an unavailable locale" do
90
+ get "http://example.com?locale=xx"
91
+ I18n.locale.should eql(I18n.default_locale)
92
+ end
93
+
94
+ context "name" do
95
+
96
+ let :options do
97
+ { :param => "lang" }
98
+ end
99
+
100
+ it "should be configurable" do
101
+ get "http://example.com?lang=de"
102
+ I18n.locale.should eql(:de)
103
+ end
104
+ end
105
+ end
106
+
107
+ context "from path prefix " do
108
+
109
+ it "should set the I18n locale" do
110
+ get "http://example.com/de/some/path/"
111
+ I18n.locale.should eql(:de)
112
+
113
+ get "http://example.com/en-us"
114
+ I18n.locale.should eql(:'en-US')
115
+ end
116
+ end
117
+
118
+ context "from host" do
119
+
120
+ it "should set the I18n locale" do
121
+ get "http://de.example.com/"
122
+ I18n.locale.should eql(:de)
123
+
124
+ get "http://de-de.example.com/"
125
+ I18n.locale.should eql(:'de-DE')
126
+ end
127
+ end
128
+
129
+ context "from accept-language header" do
130
+
131
+ it "should override the client requested locale" do
132
+ get "http://example.com" , nil, {"HTTP_ACCEPT_LANGUAGE" => "de-de,de,en;q=0.5"}
133
+ I18n.locale.should eql(:'de-DE')
134
+
135
+ get "http://example.com" , nil, {"HTTP_ACCEPT_LANGUAGE" => "en;q=0.5,en-US;q=0.8,es;q=0.7"}
136
+ I18n.locale.should eql(:'en-US')
137
+ end
138
+ end
139
+
140
+ shared_examples_for "a redirect with the default locale" do
141
+
142
+ it "should redirect to the canonical URL" do
143
+ %w{
144
+ http://en.example.com
145
+ http://example.com/en
146
+ http://example.com?locale=en
147
+ }.each do |url|
148
+ get url
149
+ last_response.should be_redirect
150
+ last_response.location.should eql("http://example.com")
151
+ end
152
+ end
153
+
154
+ it "should not redirect if the locale was set in the accept header" do
155
+ get "http://example.com" , nil, {"HTTP_ACCEPT_LANGUAGE" => "en"}
156
+ last_response.should_not be_redirect
157
+ end
158
+ end
159
+
160
+ context "redirect to path" do
161
+
162
+ let :options do
163
+ { :redirect => :path }
164
+ end
165
+
166
+ it "should not redirect if the locale was set with the path" do
167
+ %w{
168
+ http://example.com/de
169
+ http://example.com/en
170
+ http://example.com/en/
171
+ http://example.com/en/foo/bar
172
+ }.each do |url|
173
+ get url
174
+ last_response.should_not be_redirect
175
+ end
176
+ end
177
+
178
+ it "should redirect if the locale was set by other means" do
179
+ {
180
+ "http://en.example.com" => "http://example.com/en",
181
+ "http://en.example.com/de" => "http://example.com/de",
182
+ "http://de.example.com" => "http://example.com/de",
183
+ "http://example.com?locale=de" => "http://example.com/de"
184
+ }.each do |url, redirect_url|
185
+ get url
186
+ last_response.should be_redirect
187
+ last_response.location.should eql(redirect_url)
188
+ end
189
+ end
190
+
191
+ it "should redirect if the locale was set with an accept header" do
192
+ get "http://example.com" , nil, {"HTTP_ACCEPT_LANGUAGE" => "de"}
193
+ last_response.should be_redirect
194
+ last_response.location.should eql("http://example.com/de")
195
+ end
196
+
197
+ context "canonical" do
198
+
199
+ let :options do
200
+ { :redirect => :path, :canonical => true }
201
+ end
202
+
203
+ it_should_behave_like "a redirect with the default locale"
204
+ end
205
+ end
206
+
207
+ context "host" do
208
+
209
+ let :options do
210
+ { :redirect => :host }
211
+ end
212
+
213
+ it "should not redirect if the locale was set with the host" do
214
+ %w{
215
+ http://de.example.com
216
+ http://en.example.com/
217
+ http://en.example.com/foo/bar
218
+ }.each do |url|
219
+ get url
220
+ last_response.should_not be_redirect
221
+ end
222
+ end
223
+
224
+ it "should redirect if the locale was set by other means" do
225
+ {
226
+ "http://example.com/en" => "http://en.example.com",
227
+ "http://en.example.com/de" => "http://de.example.com",
228
+ "http://example.com/de" => "http://de.example.com",
229
+ "http://example.com?locale=de" => "http://de.example.com"
230
+ }.each do |url, redirect_url|
231
+ get url
232
+ last_response.should be_redirect
233
+ last_response.location.should eql(redirect_url)
234
+ end
235
+ end
236
+
237
+ it "should redirect if the locale was set with an accept header" do
238
+ get "http://example.com" , nil, {"HTTP_ACCEPT_LANGUAGE" => "de"}
239
+ last_response.should be_redirect
240
+ last_response.location.should eql("http://de.example.com")
241
+ end
242
+
243
+ context "canonical" do
244
+
245
+ let :options do
246
+ { :redirect => :host, :canonical => true }
247
+ end
248
+
249
+ it_should_behave_like "a redirect with the default locale"
250
+ end
251
+ end
252
+
253
+ context "param" do
254
+
255
+ let :options do
256
+ { :redirect => :param }
257
+ end
258
+
259
+ it "should not redirect if the locale was set with a param" do
260
+ %w{
261
+ http://example.com?locale=de
262
+ http://example.com/?locale=en
263
+ http://example.com/foo/bar?locale=en
264
+ }.each do |url|
265
+ get url
266
+ last_response.should_not be_redirect
267
+ end
268
+ end
269
+
270
+ it "should redirect if the locale was set by other means" do
271
+ {
272
+ "http://example.com/en" => "http://example.com?locale=en",
273
+ "http://de.example.com/foo/bar" => "http://example.com/foo/bar?locale=de",
274
+ "http://example.com/de" => "http://example.com?locale=de",
275
+ "http://en.example.com?locale=de" => "http://example.com?locale=de"
276
+ }.each do |url, redirect_url|
277
+ get url
278
+ last_response.should be_redirect
279
+ last_response.location.should eql(redirect_url)
280
+ end
281
+ end
282
+
283
+ it "should redirect if the locale was set with an accept header" do
284
+ get "http://example.com" , nil, {"HTTP_ACCEPT_LANGUAGE" => "de"}
285
+ last_response.should be_redirect
286
+ last_response.location.should eql("http://example.com?locale=de")
287
+ end
288
+
289
+ context "canonical" do
290
+
291
+ let :options do
292
+ { :redirect => :param, :canonical => true }
293
+ end
294
+
295
+ it_should_behave_like "a redirect with the default locale"
296
+ end
297
+ end
298
+ end
metadata CHANGED
@@ -1,95 +1,107 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rack-i18n_locale_switcher
3
- version: !ruby/object:Gem::Version
4
- version: 0.4.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 11
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 5
9
+ - 0
10
+ version: 0.5.0
6
11
  platform: ruby
7
- authors:
8
- - Christoph Bünte, Andreas Korth
12
+ authors:
13
+ - "Christoph B\xC3\xBCnte, Andreas Korth"
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2011-11-26 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: rack
16
- requirement: &2158734100 !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
17
+
18
+ date: 2011-11-29 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
23
22
  prerelease: false
24
- version_requirements: *2158734100
25
- - !ruby/object:Gem::Dependency
26
- name: i18n
27
- requirement: &2158733640 !ruby/object:Gem::Requirement
23
+ requirement: &id001 !ruby/object:Gem::Requirement
28
24
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
33
32
  type: :runtime
33
+ name: rack
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
34
36
  prerelease: false
35
- version_requirements: *2158733640
36
- - !ruby/object:Gem::Dependency
37
- name: domainatrix
38
- requirement: &2158733180 !ruby/object:Gem::Requirement
37
+ requirement: &id002 !ruby/object:Gem::Requirement
39
38
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
44
46
  type: :runtime
47
+ name: i18n
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
45
50
  prerelease: false
46
- version_requirements: *2158733180
47
- - !ruby/object:Gem::Dependency
48
- name: echoe
49
- requirement: &2158732720 !ruby/object:Gem::Requirement
51
+ requirement: &id003 !ruby/object:Gem::Requirement
50
52
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
55
60
  type: :development
61
+ name: echoe
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
56
64
  prerelease: false
57
- version_requirements: *2158732720
58
- - !ruby/object:Gem::Dependency
59
- name: rspec
60
- requirement: &2158732260 !ruby/object:Gem::Requirement
65
+ requirement: &id004 !ruby/object:Gem::Requirement
61
66
  none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
66
74
  type: :development
75
+ name: rspec
76
+ version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
67
78
  prerelease: false
68
- version_requirements: *2158732260
69
- - !ruby/object:Gem::Dependency
70
- name: rack-test
71
- requirement: &2158731800 !ruby/object:Gem::Requirement
79
+ requirement: &id005 !ruby/object:Gem::Requirement
72
80
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '0'
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
77
88
  type: :development
78
- prerelease: false
79
- version_requirements: *2158731800
80
- description: Detects the current locale from query parameter, path prefix, host or
81
- accept header.
82
- email:
89
+ name: rack-test
90
+ version_requirements: *id005
91
+ description: Detects the current locale from query parameter, path prefix, host or accept header.
92
+ email:
83
93
  - info@christophbuente.de
84
94
  - andreas.korth@gmail.com
85
95
  executables: []
96
+
86
97
  extensions: []
87
- extra_rdoc_files:
98
+
99
+ extra_rdoc_files:
88
100
  - CHANGELOG
89
101
  - LICENSE
90
102
  - README.md
91
103
  - lib/rack/i18n_locale_switcher.rb
92
- files:
104
+ files:
93
105
  - CHANGELOG
94
106
  - LICENSE
95
107
  - Manifest
@@ -97,36 +109,46 @@ files:
97
109
  - Rakefile
98
110
  - lib/rack/i18n_locale_switcher.rb
99
111
  - rack-i18n_locale_switcher.gemspec
100
- - spec/i18n_locale_switcher_spec.rb
112
+ - spec/rack/i18n_locale_switcher_spec.rb
113
+ has_rdoc: true
101
114
  homepage: http://github.com/christoph-buente/rack-i18n_locale_switcher
102
115
  licenses: []
116
+
103
117
  post_install_message:
104
- rdoc_options:
118
+ rdoc_options:
105
119
  - --line-numbers
106
120
  - --inline-source
107
121
  - --title
108
122
  - Rack-i18n_locale_switcher
109
123
  - --main
110
124
  - README.md
111
- require_paths:
125
+ require_paths:
112
126
  - lib
113
- required_ruby_version: !ruby/object:Gem::Requirement
127
+ required_ruby_version: !ruby/object:Gem::Requirement
114
128
  none: false
115
- requirements:
116
- - - ! '>='
117
- - !ruby/object:Gem::Version
118
- version: '0'
119
- required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ hash: 3
133
+ segments:
134
+ - 0
135
+ version: "0"
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
137
  none: false
121
- requirements:
122
- - - ! '>='
123
- - !ruby/object:Gem::Version
124
- version: '1.2'
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ hash: 11
142
+ segments:
143
+ - 1
144
+ - 2
145
+ version: "1.2"
125
146
  requirements: []
147
+
126
148
  rubyforge_project: rack-i18n_locale_switcher
127
- rubygems_version: 1.8.11
149
+ rubygems_version: 1.6.2
128
150
  signing_key:
129
151
  specification_version: 3
130
- summary: Detects the current locale from query parameter, path prefix, host or accept
131
- header.
152
+ summary: Detects the current locale from query parameter, path prefix, host or accept header.
132
153
  test_files: []
154
+
@@ -1,131 +0,0 @@
1
- require 'rack/i18n_locale_switcher'
2
- require 'rack/test'
3
-
4
- describe Rack::I18nLocaleSwitcher do
5
-
6
- include Rack::Test::Methods
7
-
8
- let :options do
9
- {}
10
- end
11
-
12
- let :app do
13
- opts = options
14
- rack = Rack::Builder.new do
15
- map "/" do
16
- use Rack::I18nLocaleSwitcher, opts
17
- run lambda { |env| [200, {}, "Coolness"] }
18
- end
19
- end
20
- rack.to_app
21
- end
22
-
23
- before do
24
- I18n.available_locales = [:en, :'en-US', :de, :'de-DE', :es]
25
- I18n.default_locale = :en
26
- end
27
-
28
- it "should fall back to the locale to default locale" do
29
- get 'http://example.com/some/path'
30
- I18n.locale.should eql(I18n.default_locale)
31
-
32
- get 'http://www.example.com/'
33
- I18n.locale.should eql(I18n.default_locale)
34
- end
35
-
36
- it "should not accept invalid options" do
37
- expect {
38
- Rack::I18nLocaleSwitcher.new('app', :not_an_option => 'foo')
39
- }.to raise_error(ArgumentError, "Invalid option(s) :not_an_option")
40
- end
41
-
42
- context 'with custom sources' do
43
-
44
- let :options do
45
- { :source => [ :header, :host ] }
46
- end
47
-
48
- it "should honor the sequence" do
49
- get 'http://de.example.com' , {}, {'HTTP_ACCEPT_LANGUAGE' => "es"}
50
- I18n.locale.should eql(:es)
51
-
52
- get 'http://de.example.com' , {}, {'HTTP_ACCEPT_LANGUAGE' => "foo"}
53
- I18n.locale.should eql(:de)
54
-
55
- get 'http://de.example.com'
56
- I18n.locale.should eql(:de)
57
- end
58
-
59
- it "should ignore other sources" do
60
- get 'http://example.com?locale=de'
61
- I18n.locale.should eql(:en)
62
-
63
- get 'http://example.com/de'
64
- I18n.locale.should eql(:en)
65
- end
66
- end
67
-
68
- context 'request param' do
69
-
70
- it "should set the locale" do
71
- get 'http://example.com?locale=de'
72
- I18n.locale.should eql(:de)
73
-
74
- get 'http://example.com?locale=en-US'
75
- I18n.locale.should eql(:'en-US')
76
-
77
- get 'http://example.com/some/path?foo=bar&locale=es&param=value'
78
- I18n.locale.should eql(:es)
79
- end
80
-
81
- it "should not set an unavailable locale" do
82
- get 'http://example.com?locale=xx'
83
- I18n.locale.should eql(I18n.default_locale)
84
- end
85
-
86
- context 'name' do
87
-
88
- let :options do
89
- { :param => 'lang' }
90
- end
91
-
92
- it "should be configurable" do
93
- get 'http://example.com?lang=de'
94
- I18n.locale.should eql(:de)
95
- end
96
- end
97
- end
98
-
99
- context 'from path prefix ' do
100
-
101
- it "should set the I18n locale" do
102
- get 'http://example.com/de/some/path/'
103
- I18n.locale.should eql(:de)
104
-
105
- get 'http://example.com/en-us'
106
- I18n.locale.should eql(:'en-US')
107
- end
108
- end
109
-
110
- context 'from host' do
111
-
112
- it "should set the I18n locale" do
113
- get 'http://de.example.com/'
114
- I18n.locale.should eql(:de)
115
-
116
- get 'http://de-de.example.com/'
117
- I18n.locale.should eql(:'de-DE')
118
- end
119
- end
120
-
121
- context 'from accept-language header' do
122
-
123
- it "should override the client requested locale" do
124
- get 'http://example.com' , {}, {'HTTP_ACCEPT_LANGUAGE' => "de-de,de,en;q=0.5"}
125
- I18n.locale.should eql(:'de-DE')
126
-
127
- get 'http://example.com' , {}, {'HTTP_ACCEPT_LANGUAGE' => "en;q=0.5,en-US;q=0.8,es;q=0.7"}
128
- I18n.locale.should eql(:'en-US')
129
- end
130
- end
131
- end