socialcast-http_accept_language 2.0.0.pre2
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/.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
|