http_accept_language 2.0.1 → 2.0.2
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/lib/http_accept_language/parser.rb +35 -31
- data/lib/http_accept_language/railtie.rb +1 -1
- data/lib/http_accept_language/version.rb +1 -1
- data/spec/parser_spec.rb +9 -0
- metadata +18 -18
@@ -1,7 +1,5 @@
|
|
1
1
|
module HttpAcceptLanguage
|
2
|
-
|
3
2
|
class Parser
|
4
|
-
|
5
3
|
attr_accessor :header
|
6
4
|
|
7
5
|
def initialize(header)
|
@@ -17,20 +15,26 @@ module HttpAcceptLanguage
|
|
17
15
|
# # => [ 'nl-NL', 'nl-BE', 'nl', 'en-US', 'en' ]
|
18
16
|
#
|
19
17
|
def user_preferred_languages
|
20
|
-
@user_preferred_languages ||=
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
18
|
+
@user_preferred_languages ||= begin
|
19
|
+
header.to_s.gsub(/\s+/, '').split(',').map do |language|
|
20
|
+
locale, quality = language.split(';q=')
|
21
|
+
raise ArgumentError, 'Not correctly formatted' unless locale =~ /^[a-z\-0-9]+|\*$/i
|
22
|
+
|
23
|
+
locale = locale.downcase.gsub(/-[a-z0-9]+$/i, &:upcase) # Uppercase territory
|
24
|
+
locale = nil if locale == '*' # Ignore wildcards
|
25
|
+
|
26
|
+
quality = quality ? quality.to_f : 1.0
|
27
|
+
|
28
|
+
[locale, quality]
|
29
|
+
end.sort do |(_, left), (_, right)|
|
30
|
+
right <=> left
|
31
|
+
end.map(&:first).compact
|
32
|
+
rescue ArgumentError # Just rescue anything if the browser messed up badly.
|
33
|
+
[]
|
28
34
|
end
|
29
|
-
rescue # Just rescue anything if the browser messed up badly.
|
30
|
-
[]
|
31
35
|
end
|
32
36
|
|
33
|
-
# Sets the user languages preference,
|
37
|
+
# Sets the user languages preference, overriding the browser
|
34
38
|
#
|
35
39
|
def user_preferred_languages=(languages)
|
36
40
|
@user_preferred_languages = languages
|
@@ -44,7 +48,7 @@ module HttpAcceptLanguage
|
|
44
48
|
# # => 'nl'
|
45
49
|
#
|
46
50
|
def preferred_language_from(array)
|
47
|
-
(user_preferred_languages & array.
|
51
|
+
(user_preferred_languages & array.map(&:to_s)).first
|
48
52
|
end
|
49
53
|
|
50
54
|
# Returns the first of the user_preferred_languages that is compatible
|
@@ -55,10 +59,13 @@ module HttpAcceptLanguage
|
|
55
59
|
# request.compatible_language_from I18n.available_locales
|
56
60
|
#
|
57
61
|
def compatible_language_from(available_languages)
|
58
|
-
user_preferred_languages.map do |
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
+
user_preferred_languages.map do |preferred| #en-US
|
63
|
+
preferred = preferred.downcase
|
64
|
+
preferred_language = preferred.split('-', 2).first
|
65
|
+
|
66
|
+
available_languages.find do |available| # en
|
67
|
+
available = available.to_s.downcase
|
68
|
+
preferred == available || preferred_language == available.split('-', 2).first
|
62
69
|
end
|
63
70
|
end.compact.first
|
64
71
|
end
|
@@ -70,12 +77,8 @@ module HttpAcceptLanguage
|
|
70
77
|
# [ja_JP-x1, en-US-x4, en_UK-x5, fr-FR-x3] => [ja-JP, en-US, en-UK, fr-FR]
|
71
78
|
#
|
72
79
|
def sanitize_available_locales(available_languages)
|
73
|
-
available_languages.map do |
|
74
|
-
|
75
|
-
|
76
|
-
split_locale.map do |e|
|
77
|
-
e unless e.start_with?("x")
|
78
|
-
end.compact.join("-")
|
80
|
+
available_languages.map do |available|
|
81
|
+
available.to_s.split(/[_-]/).reject { |part| part.start_with?("x") }.join("-")
|
79
82
|
end
|
80
83
|
end
|
81
84
|
|
@@ -90,15 +93,16 @@ module HttpAcceptLanguage
|
|
90
93
|
#
|
91
94
|
def language_region_compatible_from(available_languages)
|
92
95
|
available_languages = sanitize_available_locales(available_languages)
|
93
|
-
user_preferred_languages.map do |
|
94
|
-
|
95
|
-
|
96
|
-
|
96
|
+
user_preferred_languages.map do |preferred| #en-US
|
97
|
+
preferred = preferred.downcase
|
98
|
+
preferred_language = preferred.split('-', 2).first
|
99
|
+
|
100
|
+
lang_group = available_languages.select do |available| # en
|
101
|
+
preferred_language == available.downcase.split('-', 2).first
|
97
102
|
end
|
98
|
-
|
103
|
+
|
104
|
+
lang_group.find { |lang| lang.downcase == preferred } || lang_group.first #en-US, en-UK
|
99
105
|
end.compact.first
|
100
106
|
end
|
101
|
-
|
102
107
|
end
|
103
|
-
|
104
108
|
end
|
@@ -11,7 +11,7 @@ module HttpAcceptLanguage
|
|
11
11
|
|
12
12
|
module EasyAccess
|
13
13
|
def http_accept_language
|
14
|
-
@http_accept_language ||= request.env["http_accept_language.parser"] || Parser.new("")
|
14
|
+
@http_accept_language ||= request.env["http_accept_language.parser"] || Parser.new(request.env["HTTP_ACCEPT_LANGUAGE"])
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/spec/parser_spec.rb
CHANGED
@@ -44,10 +44,19 @@ describe HttpAcceptLanguage::Parser do
|
|
44
44
|
parser.compatible_language_from([:"en-HK"]).should eq :"en-HK"
|
45
45
|
end
|
46
46
|
|
47
|
+
it "should accept and ignore wildcards" do
|
48
|
+
parser.header = 'en-US,en,*'
|
49
|
+
parser.compatible_language_from([:"en-US"]).should eq :"en-US"
|
50
|
+
end
|
51
|
+
|
47
52
|
it "should sanitize available language names" do
|
48
53
|
parser.sanitize_available_locales(%w{en_UK-x3 en-US-x1 ja_JP-x2 pt-BR-x5 es-419-x4}).should eq ["en-UK", "en-US", "ja-JP", "pt-BR", "es-419"]
|
49
54
|
end
|
50
55
|
|
56
|
+
it "should accept available language names as symbols and return them as strings" do
|
57
|
+
parser.sanitize_available_locales([:en, :"en-US", :ca, :"ca-ES"]).should eq ["en", "en-US", "ca", "ca-ES"]
|
58
|
+
end
|
59
|
+
|
51
60
|
it "should find most compatible language from user preferred" do
|
52
61
|
parser.header = 'ja,en-gb,en-us,fr-fr'
|
53
62
|
parser.language_region_compatible_from(%w{en-UK en-US ja-JP}).should eq "ja-JP"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http_accept_language
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-07-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70189984251240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70189984251240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70189984250560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70189984250560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rack-test
|
38
|
-
requirement: &
|
38
|
+
requirement: &70189984250020 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70189984250020
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: guard-rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &70189984249400 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70189984249400
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rails
|
60
|
-
requirement: &
|
60
|
+
requirement: &70189984248760 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 3.2.6
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70189984248760
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: cucumber
|
71
|
-
requirement: &
|
71
|
+
requirement: &70189984248160 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70189984248160
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: aruba
|
82
|
-
requirement: &
|
82
|
+
requirement: &70189984247480 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70189984247480
|
91
91
|
description: Find out which locale the user preferes by reading the languages they
|
92
92
|
specified in their browser
|
93
93
|
email:
|
@@ -129,7 +129,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
129
129
|
version: '0'
|
130
130
|
segments:
|
131
131
|
- 0
|
132
|
-
hash:
|
132
|
+
hash: 3432813774343238940
|
133
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
134
|
none: false
|
135
135
|
requirements:
|
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
138
|
version: '0'
|
139
139
|
segments:
|
140
140
|
- 0
|
141
|
-
hash:
|
141
|
+
hash: 3432813774343238940
|
142
142
|
requirements: []
|
143
143
|
rubyforge_project: http_accept_language
|
144
144
|
rubygems_version: 1.8.6
|