http_accept_language 1.0.2 → 2.0.0.pre

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 CHANGED
@@ -3,3 +3,5 @@
3
3
  Gemfile.lock
4
4
  pkg/*
5
5
  .rvmrc
6
+ log/*.log
7
+ tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
- source "http://rubygems.org"
1
+ source :rubygems
2
2
 
3
- # Specify your gem's dependencies in http_accept_language.gemspec
4
3
  gemspec
data/Guardfile ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ guard 'rspec', :cli => "-fd", :version => 2 do
4
+ watch(%r{^spec/.+_spec\.rb$})
5
+ watch(%r{^lib/(.+)\.rb$}) { "spec" }
6
+ watch('spec/spec_helper.rb') { "spec" }
7
+ end
8
+
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 CHANGED
@@ -1,22 +1,13 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
- require 'rake/testtask'
4
- desc 'Test the http_accept_language plugin.'
5
- Rake::TestTask.new(:test) do |t|
6
- t.libs << 'lib'
7
- t.pattern = 'test/**/*_test.rb'
8
- t.verbose = true
9
- end
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
10
5
 
11
- desc 'Default: run unit tests.'
12
- task :default => :test
6
+ require 'cucumber/rake/task'
7
+ Cucumber::Rake::Task.new(:cucumber)
13
8
 
14
- require 'rake/rdoctask'
15
- desc 'Generate documentation for the http_accept_language plugin.'
16
- Rake::RDocTask.new(:rdoc) do |rdoc|
17
- rdoc.rdoc_dir = 'rdoc'
18
- rdoc.title = 'HttpAcceptLanguage'
19
- rdoc.options << '--line-numbers' << '--inline-source'
20
- rdoc.rdoc_files.include('README.rdoc')
21
- rdoc.rdoc_files.include('lib/**/*.rb')
9
+ Cucumber::Rake::Task.new(:wip, "Run features tagged with @wip") do |t|
10
+ t.profile = "wip"
22
11
  end
12
+
13
+ task :default => [:spec, :cucumber, :wip]
data/cucumber.yml ADDED
@@ -0,0 +1,2 @@
1
+ default: --format progress --strict --tags ~@wip
2
+ wip: --format pretty --wip --tags @wip
@@ -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
@@ -1,7 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/http_accept_language/version', __FILE__)
3
+
2
4
  Gem::Specification.new do |s|
3
5
  s.name = "http_accept_language"
4
- s.version = '1.0.2'
6
+ s.version = HttpAcceptLanguage::VERSION
5
7
  s.authors = ["iain"]
6
8
  s.email = ["iain@iain.nl"]
7
9
  s.homepage = "https://github.com/iain/http_accept_language"
@@ -14,4 +16,12 @@ Gem::Specification.new do |s|
14
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
17
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
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'
17
27
  end
@@ -1,65 +1,4 @@
1
- module HttpAcceptLanguage
2
-
3
- # Returns a sorted array based on user preference in HTTP_ACCEPT_LANGUAGE.
4
- # Browsers send this HTTP header, so don't think this is holy.
5
- #
6
- # Example:
7
- #
8
- # request.user_preferred_languages
9
- # # => [ 'nl-NL', 'nl-BE', 'nl', 'en-US', 'en' ]
10
- #
11
- def user_preferred_languages
12
- @user_preferred_languages ||= env['HTTP_ACCEPT_LANGUAGE'].split(/\s*,\s*/).collect do |l|
13
- l += ';q=1.0' unless l =~ /;q=\d+\.\d+$/
14
- l.split(';q=')
15
- end.sort do |x,y|
16
- raise "Not correctly formatted" unless x.first =~ /^[a-z\-]+$/i
17
- y.last.to_f <=> x.last.to_f
18
- end.collect do |l|
19
- l.first.downcase.gsub(/-[a-z]+$/i) { |x| x.upcase }
20
- end
21
- rescue # Just rescue anything if the browser messed up badly.
22
- []
23
- end
24
-
25
- # Sets the user languages preference, overiding the browser
26
- #
27
- def user_preferred_languages=(languages)
28
- @user_preferred_languages = languages
29
- end
30
-
31
- # Finds the locale specifically requested by the browser.
32
- #
33
- # Example:
34
- #
35
- # request.preferred_language_from I18n.available_locales
36
- # # => 'nl'
37
- #
38
- def preferred_language_from(array)
39
- (user_preferred_languages & array.collect { |i| i.to_s }).first
40
- end
41
-
42
- # Returns the first of the user_preferred_languages that is compatible
43
- # with the available locales. Ignores region.
44
- #
45
- # Example:
46
- #
47
- # request.compatible_language_from I18n.available_locales
48
- #
49
- def compatible_language_from(available_languages)
50
- user_preferred_languages.map do |x| #en-US
51
- available_languages.find do |y| # en
52
- y = y.to_s
53
- x == y || x.split('-', 2).first == y.split('-', 2).first
54
- end
55
- end.compact.first
56
- end
57
-
58
- end
59
- if defined?(ActionDispatch::Request)
60
- ActionDispatch::Request.send :include, HttpAcceptLanguage
61
- elsif defined?(ActionDispatch::AbstractRequest)
62
- ActionDispatch::AbstractRequest.send :include, HttpAcceptLanguage
63
- elsif defined?(ActionDispatch::CgiRequest)
64
- ActionDispatch::CgiRequest.send :include, HttpAcceptLanguage
65
- end
1
+ require 'http_accept_language/version'
2
+ require 'http_accept_language/parser'
3
+ require 'http_accept_language/middleware'
4
+ require 'http_accept_language/railtie' if defined?(Rails::Railtie)
@@ -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.split(/\s*,\s*/).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,17 @@
1
+ module HttpAcceptLanguage
2
+ class Railtie < ::Rails::Railtie
3
+
4
+ initializer "http_accept_language.add_middleware" do |app|
5
+ app.middleware.use Middleware
6
+ ApplicationController.send :include, EasyAccess
7
+ end
8
+
9
+ end
10
+
11
+ module EasyAccess
12
+ def http_accept_language
13
+ env.http_accept_language
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,3 @@
1
+ module HttpAcceptLanguage
2
+ VERSION = '2.0.0.pre'
3
+ 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
@@ -0,0 +1,51 @@
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 find first available language" do
24
+ parser.preferred_language_from(%w{en en-GB}).should eq "en-GB"
25
+ end
26
+
27
+ it "should find first compatible language" do
28
+ parser.compatible_language_from(%w{en-hk}).should eq "en-hk"
29
+ parser.compatible_language_from(%w{en}).should eq "en"
30
+ end
31
+
32
+ it "should find first compatible from user preferred" do
33
+ parser.header = 'en-us,de-de'
34
+ parser.compatible_language_from(%w{de en}).should eq 'en'
35
+ end
36
+
37
+ it "should accept symbols as available languages" do
38
+ parser.header = 'en-us'
39
+ parser.compatible_language_from([:"en-HK"]).should eq :"en-HK"
40
+ end
41
+
42
+ it "should sanitize available language names" do
43
+ 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"]
44
+ end
45
+
46
+ it "should find most compatible language from user preferred" do
47
+ parser.header = 'ja,en-gb,en-us,fr-fr'
48
+ parser.language_region_compatible_from(%w{en-UK en-US ja-JP}).should eq "ja-JP"
49
+ end
50
+
51
+ end
metadata CHANGED
@@ -1,16 +1,128 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http_accept_language
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
5
- prerelease:
4
+ version: 2.0.0.pre
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - iain
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-11 00:00:00.000000000Z
13
- dependencies: []
12
+ date: 2012-07-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rack-test
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: guard-rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rails
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: 3.2.6
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: 3.2.6
94
+ - !ruby/object:Gem::Dependency
95
+ name: cucumber
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: aruba
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
14
126
  description: Find out which locale the user preferes by reading the languages they
15
127
  specified in their browser
16
128
  email:
@@ -20,13 +132,23 @@ extensions: []
20
132
  extra_rdoc_files: []
21
133
  files:
22
134
  - .gitignore
135
+ - .rspec
23
136
  - Gemfile
24
- - README.rdoc
137
+ - Guardfile
138
+ - README.md
25
139
  - Rakefile
140
+ - cucumber.yml
141
+ - features/rails_integration.feature
142
+ - features/steps/rails.rb
143
+ - features/support/rails_driver.rb
26
144
  - http_accept_language.gemspec
27
145
  - lib/http_accept_language.rb
28
- - rails/init.rb
29
- - test/http_accept_language_test.rb
146
+ - lib/http_accept_language/middleware.rb
147
+ - lib/http_accept_language/parser.rb
148
+ - lib/http_accept_language/railtie.rb
149
+ - lib/http_accept_language/version.rb
150
+ - spec/middleware_spec.rb
151
+ - spec/parser_spec.rb
30
152
  homepage: https://github.com/iain/http_accept_language
31
153
  licenses: []
32
154
  post_install_message:
@@ -42,15 +164,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
42
164
  required_rubygems_version: !ruby/object:Gem::Requirement
43
165
  none: false
44
166
  requirements:
45
- - - ! '>='
167
+ - - ! '>'
46
168
  - !ruby/object:Gem::Version
47
- version: '0'
169
+ version: 1.3.1
48
170
  requirements: []
49
171
  rubyforge_project: http_accept_language
50
- rubygems_version: 1.8.6
172
+ rubygems_version: 1.8.24
51
173
  signing_key:
52
174
  specification_version: 3
53
175
  summary: Find out which locale the user preferes by reading the languages they specified
54
176
  in their browser
55
177
  test_files:
56
- - test/http_accept_language_test.rb
178
+ - features/rails_integration.feature
179
+ - features/steps/rails.rb
180
+ - features/support/rails_driver.rb
181
+ - spec/middleware_spec.rb
182
+ - spec/parser_spec.rb
data/README.rdoc DELETED
@@ -1,45 +0,0 @@
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
- == Features
6
-
7
- * Splits the http-header into languages specified by the user
8
- * Returns empty array if header is illformed.
9
- * Corrects case to xx-XX
10
- * Sorted by priority given, as much as possible.
11
- * Gives you the most important language
12
- * Gives compatible languages
13
- See also: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
14
-
15
- == Example
16
-
17
- class SomeController < ApplicationController
18
- def some_action
19
-
20
- request.user_preferred_languages
21
- # => [ 'nl-NL', 'nl-BE', 'nl', 'en-US', 'en' ]
22
-
23
- available = %w{en en-US nl-BE}
24
- request.preferred_language_from(available)
25
- # => 'nl-BE'
26
-
27
- request.user_preferred_languages
28
- # => [ 'en-GB']
29
- available = %w{en-US}
30
- request.compatible_language_from(available)
31
- # => 'en-US'
32
- end
33
- end
34
-
35
- == Installation
36
-
37
- Install the gem +http_accept_language+, require it in your Rails app.
38
-
39
- == Changelog
40
-
41
- * 2011-09-11: 1.0.2 release, still works appearantly
42
- * 2010-01-05: Gem release
43
- * 2009-03-12: Rails 2.3 compatible
44
-
45
- Copyright (c) 2008-2011 Iain Hecker, released under the MIT license
data/rails/init.rb DELETED
@@ -1 +0,0 @@
1
- require "http_accept_language"
@@ -1,50 +0,0 @@
1
- $:.unshift(File.dirname(__FILE__) + '/../lib')
2
- require 'http_accept_language'
3
- require 'test/unit'
4
-
5
- class MockedCgiRequest
6
- include HttpAcceptLanguage
7
- def env
8
- @env ||= {'HTTP_ACCEPT_LANGUAGE' => 'en-us,en-gb;q=0.8,en;q=0.6'}
9
- end
10
- end
11
-
12
- class HttpAcceptLanguageTest < Test::Unit::TestCase
13
- def test_should_return_empty_array
14
- request.env['HTTP_ACCEPT_LANGUAGE'] = nil
15
- assert_equal [], request.user_preferred_languages
16
- end
17
-
18
- def test_should_properly_split
19
- assert_equal %w{en-US en-GB en}, request.user_preferred_languages
20
- end
21
-
22
- def test_should_ignore_jambled_header
23
- request.env['HTTP_ACCEPT_LANGUAGE'] = 'odkhjf89fioma098jq .,.,'
24
- assert_equal [], request.user_preferred_languages
25
- end
26
-
27
- def test_should_find_first_available_language
28
- assert_equal 'en-GB', request.preferred_language_from(%w{en en-GB})
29
- end
30
-
31
- def test_should_find_first_compatible_language
32
- assert_equal 'en-hk', request.compatible_language_from(%w{en-hk})
33
- assert_equal 'en', request.compatible_language_from(%w{en})
34
- end
35
-
36
- def test_should_find_first_compatible_from_user_preferred
37
- request.env['HTTP_ACCEPT_LANGUAGE'] = 'en-us,de-de'
38
- assert_equal 'en', request.compatible_language_from(%w{de en})
39
- end
40
-
41
- def test_should_accept_symbols_as_available_languages
42
- request.env['HTTP_ACCEPT_LANGUAGE'] = 'en-us'
43
- assert_equal :"en-HK", request.compatible_language_from([:"en-HK"])
44
- end
45
-
46
- private
47
- def request
48
- @request ||= MockedCgiRequest.new
49
- end
50
- end