socialcast-http_accept_language 2.0.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/.rspec +2 -0
- data/Gemfile +3 -0
- data/Guardfile +8 -0
- data/README.md +101 -0
- data/Rakefile +13 -0
- data/cucumber.yml +2 -0
- data/features/rails_integration.feature +29 -0
- data/features/steps/rails.rb +37 -0
- data/features/support/rails_driver.rb +93 -0
- data/http_accept_language.gemspec +27 -0
- data/lib/http_accept_language.rb +4 -0
- data/lib/http_accept_language/middleware.rb +16 -0
- data/lib/http_accept_language/parser.rb +104 -0
- data/lib/http_accept_language/railtie.rb +20 -0
- data/lib/http_accept_language/version.rb +3 -0
- data/spec/middleware_spec.rb +49 -0
- data/spec/parser_spec.rb +56 -0
- metadata +184 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# HttpAcceptLanguage
|
2
|
+
|
3
|
+
A small effort in making a plugin which helps you detect the users preferred language, as sent by the HTTP header.
|
4
|
+
|
5
|
+
Since version 2.0, this gem is Rack middleware.
|
6
|
+
|
7
|
+
## Features
|
8
|
+
|
9
|
+
* Splits the http-header into languages specified by the user
|
10
|
+
* Returns empty array if header is illformed.
|
11
|
+
* Corrects case to xx-XX
|
12
|
+
* Sorted by priority given, as much as possible.
|
13
|
+
* Gives you the most important language
|
14
|
+
* Gives compatible languages
|
15
|
+
|
16
|
+
See also: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
|
17
|
+
|
18
|
+
## Example
|
19
|
+
|
20
|
+
When using in Rails:
|
21
|
+
|
22
|
+
``` ruby
|
23
|
+
class SomeController < ApplicationController
|
24
|
+
|
25
|
+
def some_action
|
26
|
+
|
27
|
+
http_accept_language.user_preferred_languages # => [ 'nl-NL', 'nl-BE', 'nl', 'en-US', 'en' ]
|
28
|
+
available = %w{en en-US nl-BE}
|
29
|
+
http_accept_language.preferred_language_from(available) # => 'nl-BE'
|
30
|
+
|
31
|
+
http_accept_language.user_preferred_languages # => [ 'en-GB']
|
32
|
+
available = %w{en-US}
|
33
|
+
http_accept_language.compatible_language_from(available) # => 'en-US'
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
Older versions of Rails (pre 3.0) might need to include the middleware manually.
|
41
|
+
|
42
|
+
Usage in any Rack application, simple add the middleware:
|
43
|
+
|
44
|
+
``` ruby
|
45
|
+
require 'http_accept_language'
|
46
|
+
use HttpAcceptLanguage::Middleware
|
47
|
+
run YourAwesomeApp
|
48
|
+
```
|
49
|
+
|
50
|
+
Then you can access it:
|
51
|
+
|
52
|
+
``` ruby
|
53
|
+
class YourAwesomeApp
|
54
|
+
|
55
|
+
def self.call(env)
|
56
|
+
available = %w(en en-US nl-BE)
|
57
|
+
language = env.http_accept_language.preferred_language_from(available)
|
58
|
+
[ 200, {}, ["Oh, you speak #{language}!"]]
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
```
|
63
|
+
|
64
|
+
## Available methods
|
65
|
+
|
66
|
+
* **user_preferred_languages**:
|
67
|
+
Returns a sorted array based on user preference in HTTP_ACCEPT_LANGUAGE, sanitized and all.
|
68
|
+
* **preferred_language_from**:
|
69
|
+
Finds the locale specifically requested by the browser
|
70
|
+
* **compatible_language_from**:
|
71
|
+
Returns the first of the user_preferred_languages that is compatible with the available locales.
|
72
|
+
Ignores region.
|
73
|
+
* **sanitize_available_locales**:
|
74
|
+
Returns a supplied list of available locals without any extra application info
|
75
|
+
that may be attached to the locale for storage in the application.
|
76
|
+
* **language_region_compatible_from**:
|
77
|
+
Returns the first of the user preferred languages that is
|
78
|
+
also found in available languages. Finds best fit by matching on
|
79
|
+
primary language first and secondarily on region. If no matching region is
|
80
|
+
found, return the first language in the group matching that primary language.
|
81
|
+
|
82
|
+
## Installation
|
83
|
+
|
84
|
+
|
85
|
+
### Without Bundler
|
86
|
+
|
87
|
+
Install the gem `http_accept_language`
|
88
|
+
|
89
|
+
### With Bundler
|
90
|
+
|
91
|
+
Add the gem to your Gemfile:
|
92
|
+
|
93
|
+
``` ruby
|
94
|
+
gem 'http_accept_language'
|
95
|
+
```
|
96
|
+
|
97
|
+
Run `bundle install` to install it.
|
98
|
+
|
99
|
+
---
|
100
|
+
|
101
|
+
Released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
require 'cucumber/rake/task'
|
7
|
+
Cucumber::Rake::Task.new(:cucumber)
|
8
|
+
|
9
|
+
Cucumber::Rake::Task.new(:wip, "Run features tagged with @wip") do |t|
|
10
|
+
t.profile = "wip"
|
11
|
+
end
|
12
|
+
|
13
|
+
task :default => [:spec, :cucumber, :wip]
|
data/cucumber.yml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
@rails
|
2
|
+
Feature: Rails Integration
|
3
|
+
|
4
|
+
To use http_accept_language inside a Rails application, just add it to your
|
5
|
+
Gemfile and run `bundle install`.
|
6
|
+
|
7
|
+
It is automatically added to your middleware.
|
8
|
+
|
9
|
+
Scenario: Installing
|
10
|
+
When I generate a new Rails app
|
11
|
+
And I add http_accept_language to my Gemfile
|
12
|
+
And I run `rake middleware`
|
13
|
+
Then the output should contain "use HttpAcceptLanguage::Middleware"
|
14
|
+
|
15
|
+
Scenario: Using
|
16
|
+
Given I have installed http_accept_language
|
17
|
+
When I generate the following controller:
|
18
|
+
"""
|
19
|
+
class LanguagesController < ApplicationController
|
20
|
+
|
21
|
+
def index
|
22
|
+
languages = http_accept_language.user_preferred_languages
|
23
|
+
render :text => "Languages: #{languages.join(' : ')}"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
"""
|
28
|
+
When I access that action with the HTTP_ACCEPT_LANGUAGE header "en-us,en-gb;q=0.8,en;q=0.6,es-419"
|
29
|
+
Then the response should contain "Languages: en-US : es-419 : en-GB : en"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
Before "@rails" do
|
2
|
+
@rails = RailsDriver.new
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I generate a new Rails app$/ do
|
6
|
+
@rails.generate_rails
|
7
|
+
end
|
8
|
+
|
9
|
+
When /^I add http_accept_language to my Gemfile$/ do
|
10
|
+
@rails.append_gemfile
|
11
|
+
end
|
12
|
+
|
13
|
+
Given /^I have installed http_accept_language$/ do
|
14
|
+
@rails.install_gem
|
15
|
+
end
|
16
|
+
|
17
|
+
When /^I generate the following controller:$/ do |string|
|
18
|
+
@rails.generate_controller "languages", string
|
19
|
+
end
|
20
|
+
|
21
|
+
When /^I access that action with the HTTP_ACCEPT_LANGUAGE header "(.*?)"$/ do |header|
|
22
|
+
@rails.with_rails_running do
|
23
|
+
@rails.request_with_http_accept_language_header(header, "/languages")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Then /^the response should contain "(.*?)"$/ do |output|
|
28
|
+
@rails.output_should_contain(output)
|
29
|
+
end
|
30
|
+
|
31
|
+
When /^I run `rake middleware`$/ do
|
32
|
+
@rails.bundle_exec("rake middleware")
|
33
|
+
end
|
34
|
+
|
35
|
+
Then /^the output should contain "(.*?)"$/ do |expected|
|
36
|
+
@rails.assert_partial_output(expected, @rails.all_output)
|
37
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'aruba/api'
|
2
|
+
|
3
|
+
class RailsDriver
|
4
|
+
include Aruba::Api
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@aruba_io_wait_seconds = 10
|
8
|
+
# @announce_stdout = true
|
9
|
+
# @announce_stderr = true
|
10
|
+
# @announce_cmd = true
|
11
|
+
# @announce_dir = true
|
12
|
+
# @announce_env = true
|
13
|
+
end
|
14
|
+
|
15
|
+
def app_name
|
16
|
+
"foobar"
|
17
|
+
end
|
18
|
+
|
19
|
+
def install_gem
|
20
|
+
if app_exists?
|
21
|
+
cd app_name
|
22
|
+
else
|
23
|
+
generate_rails
|
24
|
+
append_gemfile
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def app_exists?
|
29
|
+
in_current_dir do
|
30
|
+
File.exist?("#{app_name}/Gemfile")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def bundle_exec(cmd)
|
35
|
+
run_simple "bundle exec #{cmd}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def generate_rails
|
39
|
+
# install rails with as few things as possible, for speed!
|
40
|
+
bundle_exec "rails new #{app_name} --force --skip-git --skip-active-record --skip-sprockets --skip-javascript --skip-test-unit --old-style-hash"
|
41
|
+
cd app_name
|
42
|
+
end
|
43
|
+
|
44
|
+
def append_gemfile
|
45
|
+
# Specifiy a path so cucumber will use the unreleased version of the gem
|
46
|
+
append_to_file "Gemfile", "gem 'http_accept_language', :path => '#{gem_path}'"
|
47
|
+
end
|
48
|
+
|
49
|
+
def gem_path
|
50
|
+
File.expand_path('../../../', __FILE__)
|
51
|
+
end
|
52
|
+
|
53
|
+
def generate_controller(name, content)
|
54
|
+
bundle_exec "rails generate resource #{name} --force"
|
55
|
+
write_file "app/controllers/#{name}_controller.rb", content
|
56
|
+
end
|
57
|
+
|
58
|
+
def request_with_http_accept_language_header(header, path)
|
59
|
+
run_simple "curl --retry 10 -H 'Accept-language: #{header}' #{File.join(host, path)} -o #{response}"
|
60
|
+
run_simple "cat out.html"
|
61
|
+
end
|
62
|
+
|
63
|
+
def host
|
64
|
+
"http://localhost:13000"
|
65
|
+
end
|
66
|
+
|
67
|
+
def with_rails_running
|
68
|
+
start_rails
|
69
|
+
yield
|
70
|
+
ensure
|
71
|
+
stop_rails
|
72
|
+
end
|
73
|
+
|
74
|
+
def start_rails
|
75
|
+
bundle_exec "rails server -p 13000 -d"
|
76
|
+
end
|
77
|
+
|
78
|
+
def stop_rails
|
79
|
+
in_current_dir do
|
80
|
+
`cat tmp/pids/server.pid | xargs kill -9`
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def response
|
85
|
+
File.expand_path(File.join(current_dir, 'out.html'))
|
86
|
+
end
|
87
|
+
|
88
|
+
def output_should_contain(expected)
|
89
|
+
actual = File.open(response, 'r:utf-8').read
|
90
|
+
actual.should include expected
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/http_accept_language/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "socialcast-http_accept_language"
|
6
|
+
s.version = HttpAcceptLanguage::VERSION
|
7
|
+
s.authors = ["iain", "phene"]
|
8
|
+
s.email = ["iain@iain.nl", "geoff@socialcast.com"]
|
9
|
+
s.homepage = "https://github.com/socialcast/http_accept_language"
|
10
|
+
s.summary = %q{Find out which locale the user preferes by reading the languages they specified in their browser}
|
11
|
+
s.description = %q{Find out which locale the user preferes by reading the languages they specified in their browser}
|
12
|
+
|
13
|
+
s.rubyforge_project = "http_accept_language"
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_development_dependency 'rake'
|
21
|
+
s.add_development_dependency 'rspec'
|
22
|
+
s.add_development_dependency 'rack-test'
|
23
|
+
s.add_development_dependency 'guard-rspec'
|
24
|
+
s.add_development_dependency 'rails', '>= 3.2.6'
|
25
|
+
s.add_development_dependency 'cucumber'
|
26
|
+
s.add_development_dependency 'aruba'
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module HttpAcceptLanguage
|
2
|
+
class Middleware
|
3
|
+
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
def env.http_accept_language
|
10
|
+
@http_accept_language ||= Parser.new(self['HTTP_ACCEPT_LANGUAGE'])
|
11
|
+
end
|
12
|
+
@app.call(env)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module HttpAcceptLanguage
|
2
|
+
|
3
|
+
class Parser
|
4
|
+
|
5
|
+
attr_accessor :header
|
6
|
+
|
7
|
+
def initialize(header)
|
8
|
+
@header = header
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns a sorted array based on user preference in HTTP_ACCEPT_LANGUAGE.
|
12
|
+
# Browsers send this HTTP header, so don't think this is holy.
|
13
|
+
#
|
14
|
+
# Example:
|
15
|
+
#
|
16
|
+
# request.user_preferred_languages
|
17
|
+
# # => [ 'nl-NL', 'nl-BE', 'nl', 'en-US', 'en' ]
|
18
|
+
#
|
19
|
+
def user_preferred_languages
|
20
|
+
@user_preferred_languages ||= header.gsub(/\s+/, '').split(/,/).collect do |l|
|
21
|
+
l += ';q=1.0' unless l =~ /;q=\d+\.\d+$/
|
22
|
+
l.split(/;q=/)
|
23
|
+
end.sort do |x,y|
|
24
|
+
raise "Not correctly formatted" unless x.first =~ /^[a-z\-0-9]+$/i
|
25
|
+
y.last.to_f <=> x.last.to_f
|
26
|
+
end.collect do |l|
|
27
|
+
l.first.downcase.gsub(/-[a-z0-9]+$/i) { |x| x.upcase }
|
28
|
+
end
|
29
|
+
rescue # Just rescue anything if the browser messed up badly.
|
30
|
+
[]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Sets the user languages preference, overiding the browser
|
34
|
+
#
|
35
|
+
def user_preferred_languages=(languages)
|
36
|
+
@user_preferred_languages = languages
|
37
|
+
end
|
38
|
+
|
39
|
+
# Finds the locale specifically requested by the browser.
|
40
|
+
#
|
41
|
+
# Example:
|
42
|
+
#
|
43
|
+
# request.preferred_language_from I18n.available_locales
|
44
|
+
# # => 'nl'
|
45
|
+
#
|
46
|
+
def preferred_language_from(array)
|
47
|
+
(user_preferred_languages & array.collect { |i| i.to_s }).first
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns the first of the user_preferred_languages that is compatible
|
51
|
+
# with the available locales. Ignores region.
|
52
|
+
#
|
53
|
+
# Example:
|
54
|
+
#
|
55
|
+
# request.compatible_language_from I18n.available_locales
|
56
|
+
#
|
57
|
+
def compatible_language_from(available_languages)
|
58
|
+
user_preferred_languages.map do |x| #en-US
|
59
|
+
available_languages.find do |y| # en
|
60
|
+
y = y.to_s
|
61
|
+
x == y || x.split('-', 2).first == y.split('-', 2).first
|
62
|
+
end
|
63
|
+
end.compact.first
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns a supplied list of available locals without any extra application info
|
67
|
+
# that may be attached to the locale for storage in the application.
|
68
|
+
#
|
69
|
+
# Example:
|
70
|
+
# [ja_JP-x1, en-US-x4, en_UK-x5, fr-FR-x3] => [ja-JP, en-US, en-UK, fr-FR]
|
71
|
+
#
|
72
|
+
def sanitize_available_locales(available_languages)
|
73
|
+
available_languages.map do |avail|
|
74
|
+
split_locale = avail.split(/[_-]/)
|
75
|
+
|
76
|
+
split_locale.map do |e|
|
77
|
+
e unless e.match(/x|[0-9*]/)
|
78
|
+
end.compact.join("-")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns the first of the user preferred languages that is
|
83
|
+
# also found in available languages. Finds best fit by matching on
|
84
|
+
# primary language first and secondarily on region. If no matching region is
|
85
|
+
# found, return the first language in the group matching that primary language.
|
86
|
+
#
|
87
|
+
# Example:
|
88
|
+
#
|
89
|
+
# request.language_region_compatible(available_languages)
|
90
|
+
#
|
91
|
+
def language_region_compatible_from(available_languages)
|
92
|
+
available_languages = sanitize_available_locales(available_languages)
|
93
|
+
user_preferred_languages.map do |x| #en-US
|
94
|
+
lang_group = available_languages.select do |y| # en
|
95
|
+
y = y.to_s
|
96
|
+
x.split('-', 2).first == y.split('-', 2).first
|
97
|
+
end
|
98
|
+
lang_group.find{|l| l == x} || lang_group.first #en-US, en-UK
|
99
|
+
end.compact.first
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module HttpAcceptLanguage
|
2
|
+
class Railtie < ::Rails::Railtie
|
3
|
+
|
4
|
+
initializer "http_accept_language.add_middleware" do |app|
|
5
|
+
app.middleware.use Middleware
|
6
|
+
|
7
|
+
ActiveSupport.on_load :action_controller do
|
8
|
+
include EasyAccess
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
module EasyAccess
|
15
|
+
def http_accept_language
|
16
|
+
env.http_accept_language
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'http_accept_language'
|
2
|
+
require 'rack/test'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class TestRackApp
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
request = Rack::Request.new(env)
|
9
|
+
http_accept_language = env.http_accept_language
|
10
|
+
result = {
|
11
|
+
:user_preferred_languages => http_accept_language.user_preferred_languages,
|
12
|
+
}
|
13
|
+
if request.params['preferred']
|
14
|
+
result[:preferred_language_from] = http_accept_language.preferred_language_from(request.params['preferred'])
|
15
|
+
end
|
16
|
+
[ 200, {}, [ JSON.generate(result) ]]
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "Rack integration" do
|
22
|
+
include Rack::Test::Methods
|
23
|
+
|
24
|
+
def app
|
25
|
+
Rack::Builder.new do
|
26
|
+
use HttpAcceptLanguage::Middleware
|
27
|
+
run TestRackApp.new
|
28
|
+
end.to_app
|
29
|
+
end
|
30
|
+
|
31
|
+
it "decodes the HTTP_ACCEPT_LANGUAGE header" do
|
32
|
+
request_with_header 'en-us,en-gb;q=0.8,en;q=0.6,es-419'
|
33
|
+
r['user_preferred_languages'].should eq %w{en-US es-419 en-GB en}
|
34
|
+
end
|
35
|
+
|
36
|
+
it "finds the first available language" do
|
37
|
+
request_with_header 'en-us,en-gb;q=0.8,en;q=0.6,es-419', :preferred => %w(en en-GB)
|
38
|
+
r['preferred_language_from'].should eq 'en-GB'
|
39
|
+
end
|
40
|
+
|
41
|
+
def request_with_header(header, params = {})
|
42
|
+
get "/", params, 'HTTP_ACCEPT_LANGUAGE' => header
|
43
|
+
end
|
44
|
+
|
45
|
+
def r
|
46
|
+
JSON.parse(last_response.body)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
data/spec/parser_spec.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'http_accept_language/parser'
|
2
|
+
|
3
|
+
describe HttpAcceptLanguage::Parser do
|
4
|
+
|
5
|
+
def parser
|
6
|
+
@parser ||= HttpAcceptLanguage::Parser.new('en-us,en-gb;q=0.8,en;q=0.6,es-419')
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return empty array" do
|
10
|
+
parser.header = nil
|
11
|
+
parser.user_preferred_languages.should eq []
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should properly split" do
|
15
|
+
parser.user_preferred_languages.should eq %w{en-US es-419 en-GB en}
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should ignore jambled header" do
|
19
|
+
parser.header = 'odkhjf89fioma098jq .,.,'
|
20
|
+
parser.user_preferred_languages.should eq []
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should properly respect whitespace" do
|
24
|
+
parser.header = 'en-us, en-gb; q=0.8,en;q = 0.6,es-419'
|
25
|
+
parser.user_preferred_languages.should eq %w{en-US es-419 en-GB en}
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should find first available language" do
|
29
|
+
parser.preferred_language_from(%w{en en-GB}).should eq "en-GB"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should find first compatible language" do
|
33
|
+
parser.compatible_language_from(%w{en-hk}).should eq "en-hk"
|
34
|
+
parser.compatible_language_from(%w{en}).should eq "en"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should find first compatible from user preferred" do
|
38
|
+
parser.header = 'en-us,de-de'
|
39
|
+
parser.compatible_language_from(%w{de en}).should eq 'en'
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should accept symbols as available languages" do
|
43
|
+
parser.header = 'en-us'
|
44
|
+
parser.compatible_language_from([:"en-HK"]).should eq :"en-HK"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should sanitize available language names" do
|
48
|
+
parser.sanitize_available_locales(%w{en_UK-x3 en-US-x1 ja_JP-x2 pt-BR-x5}).should eq ["en-UK", "en-US", "ja-JP", "pt-BR"]
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should find most compatible language from user preferred" do
|
52
|
+
parser.header = 'ja,en-gb,en-us,fr-fr'
|
53
|
+
parser.language_region_compatible_from(%w{en-UK en-US ja-JP}).should eq "ja-JP"
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,184 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: socialcast-http_accept_language
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0.pre2
|
5
|
+
prerelease: 6
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- iain
|
9
|
+
- phene
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-08-23 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rake
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: rspec
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rack-test
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: guard-rspec
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: rails
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 3.2.6
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 3.2.6
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: cucumber
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: aruba
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
description: Find out which locale the user preferes by reading the languages they
|
128
|
+
specified in their browser
|
129
|
+
email:
|
130
|
+
- iain@iain.nl
|
131
|
+
- geoff@socialcast.com
|
132
|
+
executables: []
|
133
|
+
extensions: []
|
134
|
+
extra_rdoc_files: []
|
135
|
+
files:
|
136
|
+
- .gitignore
|
137
|
+
- .rspec
|
138
|
+
- Gemfile
|
139
|
+
- Guardfile
|
140
|
+
- README.md
|
141
|
+
- Rakefile
|
142
|
+
- cucumber.yml
|
143
|
+
- features/rails_integration.feature
|
144
|
+
- features/steps/rails.rb
|
145
|
+
- features/support/rails_driver.rb
|
146
|
+
- http_accept_language.gemspec
|
147
|
+
- lib/http_accept_language.rb
|
148
|
+
- lib/http_accept_language/middleware.rb
|
149
|
+
- lib/http_accept_language/parser.rb
|
150
|
+
- lib/http_accept_language/railtie.rb
|
151
|
+
- lib/http_accept_language/version.rb
|
152
|
+
- spec/middleware_spec.rb
|
153
|
+
- spec/parser_spec.rb
|
154
|
+
homepage: https://github.com/socialcast/http_accept_language
|
155
|
+
licenses: []
|
156
|
+
post_install_message:
|
157
|
+
rdoc_options: []
|
158
|
+
require_paths:
|
159
|
+
- lib
|
160
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
|
+
none: false
|
168
|
+
requirements:
|
169
|
+
- - ! '>'
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: 1.3.1
|
172
|
+
requirements: []
|
173
|
+
rubyforge_project: http_accept_language
|
174
|
+
rubygems_version: 1.8.24
|
175
|
+
signing_key:
|
176
|
+
specification_version: 3
|
177
|
+
summary: Find out which locale the user preferes by reading the languages they specified
|
178
|
+
in their browser
|
179
|
+
test_files:
|
180
|
+
- features/rails_integration.feature
|
181
|
+
- features/steps/rails.rb
|
182
|
+
- features/support/rails_driver.rb
|
183
|
+
- spec/middleware_spec.rb
|
184
|
+
- spec/parser_spec.rb
|