url_locale 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,42 +1,47 @@
1
1
  # url_locale
2
2
 
3
- Add _content-language_ to your response header using Rack. The locale variable is parsed from the requested URL or if no locale can be detected then `I18n.default_locale` will be your fallback.
3
+ Add _content-language_ to the response header using Rack. The locale variable is parsed from request URL, if no locale can be detected then `I18n.default_locale` will be your fallback.
4
4
 
5
5
  ## Rack
6
6
 
7
- Rack middleware parses the URL and sets the response header _content-language_ attribute accordingly. Since the header is passed on to the web server, inserting `<meta http-equiv="Content-Language" content="en"/>` in the response body will be superfluous. Please note that cached responses passing through Rack also will get the correct content-language header (can be tricky to configure the web server to this).
7
+ Rack middleware parses the URL and sets the response header _content-language_ attribute accordingly. Since the header is passed on to the web server, inserting `<meta http-equiv="Content-Language" content="en"/>` in the response body is superfluous. Please note that cached responses passing through Rack also will get the correct content-language header (can be tricky to configure the web server to do this).
8
8
 
9
9
  ## Detect URL locale
10
10
 
11
- The gem will look for `I18n.available_locales` in `request.host` or `request.path`. In Path mode which is the default mode, `locale` will be parsed from the path. In Host mode `locale` will be parsed from the host string.
12
-
13
- ### Path mode examples
14
-
15
- I18n.default_locale => :en
16
- I18n.available_locales => [:sv, :pt]
17
-
18
- http://example.com => "en"
19
- http://sv.example.com => "en"
20
- http://www.example.com/about => "en"
21
- http://www.example.com/pt/em => "pt"
22
- http://example.com/sv/om => "sv"
23
- http://example.com/fr/sur => "en" # fallback
24
-
25
- If a locale can't be detected, fallback will be `I18n.default_locale`
26
-
27
- ### Host mode examples
28
-
29
- I18n.default_locale => :en
30
- I18n.available_locales => [:sv, :pt]
31
-
32
- http://example.com => "en"
33
- http://sv.example.com => "sv"
34
- http://www.example.com/pt/em => "en"
35
- http://fr.example.com/sur => "en" # fallback
36
- http://example.com/sv/sur => "en"
37
- http://sv.example.com/pt/em => "sv"
38
- http://sv.mobile.example.com => "sv"
39
- http://modile.sv.example.com => "en" # fallback
11
+ The gem will parse `request.url` for `I18n.available_locales` in the following order:
12
+
13
+ 1. `request.url` listed in `config/url_locale.yml`?
14
+ 2. `request.path` starts with `I18n.available_locales`
15
+ 3. `I18n.default_locale`
16
+
17
+
18
+ ## Example
19
+
20
+ ```yml
21
+ # config/url_locale.yml
22
+ en:
23
+ - http://localehost:3000
24
+ - http://example.com
25
+ sv:
26
+ - http://localehost:3001
27
+ - http://example.se
28
+ ```
29
+ ```
30
+ I18n.default_locale => :en
31
+ I18n.available_locales => [:en, :sv]
32
+
33
+ http://example.com => "en"
34
+ http://sv.example.com => "en" # fallback
35
+ http://example.se/about => "sv"
36
+ http://example.com/sv/om => "en"
37
+ http://www.example.com/sv/om => "sv" # parse path
38
+
39
+ http://localhost:3000 => "en"
40
+ http://sv.localhost:3000 => "en" # fallback
41
+ http://localhost:3001/about => "sv"
42
+ http://localhost:3000/sv/om => "en"
43
+ http://localhost:3002/sv/om => "sv" # parse path
44
+ ```
40
45
 
41
46
  If a locale can't be detected, fallback will be `I18n.default_locale`
42
47
 
@@ -46,10 +51,58 @@ If a locale can't be detected, fallback will be `I18n.default_locale`
46
51
  2. Notice the order of the middleware for each environment
47
52
  3. Add `gem 'url_locale'` to Gemfile
48
53
  4. Insert `UrlLocale::Middleware` as the first middleware in the Rack middleware stack
49
- 5. (optional) Configure - Change to Host mode
54
+ 5. (optional) create `config/url_locale.yml`
50
55
  6. Add before filter in application to set locale
51
56
 
52
- ### Rails 3 example
57
+ ### Rails 3.1 example
58
+
59
+ $ rake middleware RAILS_ENV=development
60
+ use ActionDispatch::Static
61
+ use Rack::Lock
62
+ use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x101fefef0>
63
+ use Rack::Runtime
64
+ use Rack::MethodOverride
65
+ use Rails::Rack::Logger
66
+ use ActionDispatch::ShowExceptions
67
+ use ActionDispatch::RemoteIp
68
+ use Rack::Sendfile
69
+ use ActionDispatch::Reloader
70
+ use ActionDispatch::Callbacks
71
+ use ActiveRecord::ConnectionAdapters::ConnectionManagement
72
+ use ActiveRecord::QueryCache
73
+ use ActionDispatch::Cookies
74
+ use ActionDispatch::Session::CookieStore
75
+ use ActionDispatch::Flash
76
+ use ActionDispatch::ParamsParser
77
+ use ActionDispatch::Head
78
+ use Rack::ConditionalGet
79
+ use Rack::ETag
80
+ use ActionDispatch::BestStandardsSupport
81
+ run Learning::Application.routes
82
+
83
+ $ rake middleware RAILS_ENV=production
84
+ use Rack::Cache
85
+ use Rack::Lock
86
+ use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x101feeb68>
87
+ use Rack::Runtime
88
+ use Rack::MethodOverride
89
+ use Rails::Rack::Logger
90
+ use ActionDispatch::ShowExceptions
91
+ use ActionDispatch::RemoteIp
92
+ use Rack::Sendfile
93
+ use ActionDispatch::Callbacks
94
+ use ActiveRecord::ConnectionAdapters::ConnectionManagement
95
+ use ActiveRecord::QueryCache
96
+ use ActionDispatch::Cookies
97
+ use ActionDispatch::Session::CookieStore
98
+ use ActionDispatch::Flash
99
+ use ActionDispatch::ParamsParser
100
+ use ActionDispatch::Head
101
+ use Rack::ConditionalGet
102
+ use Rack::ETag
103
+ use ActionDispatch::BestStandardsSupport
104
+ run Learning::Application.routes
105
+
53
106
 
54
107
  # Gemfile
55
108
  gem 'url_locale'
@@ -60,8 +113,13 @@ If a locale can't be detected, fallback will be `I18n.default_locale`
60
113
  # config/environments/production.rb
61
114
  config.middleware.insert_before "Rack::Cache", UrlLocale::Middleware
62
115
 
63
- # config/initializers/url_locale.rb (optional configuration file)
64
- UrlLocale.host_mode # comment out this line to run Path mode
116
+ # config/url_locale.yml (optional configuration file)
117
+ en:
118
+ - http://localehost:3000
119
+ - http://example.com
120
+ sv:
121
+ - http://localehost:3001
122
+ - http://example.se
65
123
 
66
124
  # app/controllers/application_controller.rb
67
125
  before_filter :set_locale
@@ -75,7 +133,6 @@ If a locale can't be detected, fallback will be `I18n.default_locale`
75
133
  There is room for improvement for this gem
76
134
 
77
135
  - Easier installation
78
- - Improved parsing modes
79
136
  - Other ideas?
80
137
 
81
138
  If url_locale gets more then 1000 downloads, further development might be worth the effort :)
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ Jeweler::Tasks.new do |gem|
18
18
  gem.homepage = "http://github.com/danbys/url_locale"
19
19
  gem.license = "MIT"
20
20
  gem.summary = %Q{Use Rack middleware to parse the URL and set content-lang response header}
21
- gem.description = %Q{All html and xml responses passing through Rack will have content-lang header when reaching the webserver. The response body won't need a meta content-lang tag, not even when it's is cached response.}
21
+ gem.description = %Q{All HTML responses passing through Rack will have content-lang header when reaching the webserver. The response body won't need a meta content-lang tag, not even when it's is cached response.}
22
22
  gem.email = "dan.bystrom@gmail.com"
23
23
  gem.authors = ["Dan Byström"]
24
24
  # dependencies defined in Gemfile
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -8,31 +8,45 @@ module UrlLocale
8
8
  end
9
9
 
10
10
  # Returns a Regexp to extract the locale from +request.host+
11
- def subdomain_locales
12
- @@subdomain_locales ||= Regexp.new "(^|\.)(#{translations*'|'})\."
13
- end
11
+ # def subdomain_locales
12
+ # @@subdomain_locales ||= Regexp.new "(^|\.)(#{translations*'|'})\."
13
+ # end
14
14
 
15
15
  # Returns a Regexp to extract the locale from +request.path+
16
16
  def path_locales
17
17
  @@path_locales ||= Regexp.new "^\/(#{translations*'|'})(\/|$)"
18
18
  end
19
19
 
20
- def host_mode
21
- @@mode = :host
22
- end
20
+ # def host_mode
21
+ # @@mode = :host
22
+ # end
23
+ #
24
+ # def mode
25
+ # @@mode ||= :path
26
+ # end
23
27
 
24
- def mode
25
- @@mode ||= :path
28
+ def host_locales
29
+ @@host_locales ||= begin
30
+ config_fpath = File.join Rails.root, 'config', 'url_locale.yml'
31
+ result = {}
32
+ if File.exist? config_fpath
33
+ YAML::load_file(config_fpath).each do |locale, hosts|
34
+ for host in hosts
35
+ result[host] = locale.underscore
36
+ end
37
+ end
38
+ end
39
+ result
40
+ end
26
41
  end
27
42
 
28
43
  def detect request
29
44
  if translations.present?
30
- if mode == :path
31
- path_locales.match(request.path).try :[], 1
32
- else
33
- subdomain_locales.match(request.host).try :[], 2
34
- end
35
- end || I18n.default_locale.to_s
45
+ host_url = request.url.split(request.host_with_port).first + request.host_with_port
46
+ host_locales[host_url] ||
47
+ path_locales.match(request.path).try(:[], 1) ||
48
+ I18n.default_locale.to_s
49
+ end
36
50
  end
37
51
  end
38
52
  end
@@ -0,0 +1,63 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{url_locale}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Dan Bystr\303\266m"]
12
+ s.date = %q{2011-07-25}
13
+ s.description = %q{All HTML responses passing through Rack will have content-lang header when reaching the webserver. The response body won't need a meta content-lang tag, not even when it's is cached response.}
14
+ s.email = %q{dan.bystrom@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.markdown"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.markdown",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "lib/url_locale.rb",
28
+ "lib/url_locale/middleware.rb",
29
+ "test/helper.rb",
30
+ "test/test_url_locale.rb",
31
+ "url_locale.gemspec"
32
+ ]
33
+ s.homepage = %q{http://github.com/danbys/url_locale}
34
+ s.licenses = ["MIT"]
35
+ s.require_paths = ["lib"]
36
+ s.rubygems_version = %q{1.6.2}
37
+ s.summary = %q{Use Rack middleware to parse the URL and set content-lang response header}
38
+
39
+ if s.respond_to? :specification_version then
40
+ s.specification_version = 3
41
+
42
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
44
+ s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
45
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
46
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
47
+ s.add_development_dependency(%q<rcov>, [">= 0"])
48
+ else
49
+ s.add_dependency(%q<shoulda>, [">= 0"])
50
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
51
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
52
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
53
+ s.add_dependency(%q<rcov>, [">= 0"])
54
+ end
55
+ else
56
+ s.add_dependency(%q<shoulda>, [">= 0"])
57
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
58
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
59
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
60
+ s.add_dependency(%q<rcov>, [">= 0"])
61
+ end
62
+ end
63
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: url_locale
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - "Dan Bystr\xC3\xB6m"
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-07-14 00:00:00 +02:00
18
+ date: 2011-07-25 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -94,7 +94,7 @@ dependencies:
94
94
  version: "0"
95
95
  name: rcov
96
96
  version_requirements: *id005
97
- description: All html and xml responses passing through Rack will have content-lang header when reaching the webserver. The response body won't need a meta content-lang tag, not even when it's is cached response.
97
+ description: All HTML responses passing through Rack will have content-lang header when reaching the webserver. The response body won't need a meta content-lang tag, not even when it's is cached response.
98
98
  email: dan.bystrom@gmail.com
99
99
  executables: []
100
100
 
@@ -115,6 +115,7 @@ files:
115
115
  - lib/url_locale/middleware.rb
116
116
  - test/helper.rb
117
117
  - test/test_url_locale.rb
118
+ - url_locale.gemspec
118
119
  has_rdoc: true
119
120
  homepage: http://github.com/danbys/url_locale
120
121
  licenses: