http_accept_language 1.0.0

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/README.rdoc ADDED
@@ -0,0 +1,44 @@
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 <tt>http_accept_language</tt>, require it in your Rails app.
38
+
39
+ == Changelog
40
+
41
+ * 2010-01-05: Gem release
42
+ * 2009-03-12: Rails 2.3 compatible
43
+
44
+ Copyright (c) 2008-2010 Iain Hecker, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,37 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gem|
6
+ gem.name = "http_accept_language"
7
+ gem.summary = %Q{Parse the HTTP Accept Language Header}
8
+ gem.description = %Q{Find out which locale the user preferes by reading the languages they specified in their browser}
9
+ gem.email = "iain@iain.nl"
10
+ gem.homepage = "http://github.com/iain/http_accept_language"
11
+ gem.authors = ["Iain Hecker"]
12
+ end
13
+ Jeweler::GemcutterTasks.new
14
+ rescue LoadError
15
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
16
+ end
17
+
18
+ require 'rake/testtask'
19
+ desc 'Test the http_accept_language plugin.'
20
+ Rake::TestTask.new(:test) do |t|
21
+ t.libs << 'lib'
22
+ t.pattern = 'test/**/*_test.rb'
23
+ t.verbose = true
24
+ end
25
+
26
+ desc 'Default: run unit tests.'
27
+ task :default => :test
28
+
29
+ require 'rake/rdoctask'
30
+ desc 'Generate documentation for the http_accept_language plugin.'
31
+ Rake::RDocTask.new(:rdoc) do |rdoc|
32
+ rdoc.rdoc_dir = 'rdoc'
33
+ rdoc.title = 'HttpAcceptLanguage'
34
+ rdoc.options << '--line-numbers' << '--inline-source'
35
+ rdoc.rdoc_files.include('README')
36
+ rdoc.rdoc_files.include('lib/**/*.rb')
37
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,52 @@
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(',').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
+ # Finds the locale specifically requested by the browser.
26
+ #
27
+ # Example:
28
+ #
29
+ # request.preferred_language_from I18n.available_locales
30
+ # # => 'nl'
31
+ #
32
+ def preferred_language_from(array)
33
+ (user_preferred_languages & array.collect { |i| i.to_s }).first
34
+ end
35
+
36
+ # Returns the first of the user_preferred_languages that is compatible
37
+ # with the available locales. Ignores region.
38
+ #
39
+ # Example:
40
+ #
41
+ # request.compatible_language_from I18n.available_locales
42
+ #
43
+ def compatible_language_from(array)
44
+ user_preferred_languages.map do |x|
45
+ x = x.to_s.split("-")[0]
46
+ array.find do |y|
47
+ y.to_s.split("-")[0] == x
48
+ end
49
+ end.compact.first
50
+ end
51
+
52
+ end
data/rails/init.rb ADDED
@@ -0,0 +1,7 @@
1
+ if defined?(ActionController::Request)
2
+ ActionController::Request.send :include, HttpAcceptLanguage
3
+ elsif defined?(ActionController::AbstractRequest)
4
+ ActionController::AbstractRequest.send :include, HttpAcceptLanguage
5
+ else
6
+ ActionController::CgiRequest.send :include, HttpAcceptLanguage
7
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :http_accept_language do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,45 @@
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
+ private
42
+ def request
43
+ @request ||= MockedCgiRequest.new
44
+ end
45
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: http_accept_language
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Iain Hecker
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-05 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Find out which locale the user preferes by reading the languages they specified in their browser
17
+ email: iain@iain.nl
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ files:
25
+ - README.rdoc
26
+ - Rakefile
27
+ - VERSION
28
+ - lib/http_accept_language.rb
29
+ - rails/init.rb
30
+ - tasks/http_accept_language_tasks.rake
31
+ - test/http_accept_language_test.rb
32
+ has_rdoc: true
33
+ homepage: http://github.com/iain/http_accept_language
34
+ licenses: []
35
+
36
+ post_install_message:
37
+ rdoc_options:
38
+ - --charset=UTF-8
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: "0"
52
+ version:
53
+ requirements: []
54
+
55
+ rubyforge_project:
56
+ rubygems_version: 1.3.5
57
+ signing_key:
58
+ specification_version: 3
59
+ summary: Parse the HTTP Accept Language Header
60
+ test_files:
61
+ - test/http_accept_language_test.rb