Class: HttpAcceptLanguage::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/http_accept_language/parser.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(header) ⇒ Parser

Returns a new instance of Parser.



7
8
9
# File 'lib/http_accept_language/parser.rb', line 7

def initialize(header)
  @header = header
end

Instance Attribute Details

#headerObject

Returns the value of attribute header.



5
6
7
# File 'lib/http_accept_language/parser.rb', line 5

def header
  @header
end

Instance Method Details

#compatible_language_from(available_languages) ⇒ Object

Returns the first of the user_preferred_languages that is compatible with the available locales. Ignores region.

Example:

request.compatible_language_from I18n.available_locales


57
58
59
60
61
62
63
64
# File 'lib/http_accept_language/parser.rb', line 57

def compatible_language_from(available_languages)
  user_preferred_languages.map do |x| #en-US
    available_languages.find do |y| # en
      y = y.to_s
      x == y || x.split('-', 2).first == y.split('-', 2).first
    end
  end.compact.first
end

#language_region_compatible_from(available_languages) ⇒ Object

Returns the first of the user preferred languages that is also found in available languages. Finds best fit by matching on primary language first and secondarily on region. If no matching region is found, return the first language in the group matching that primary language.

Example:

request.language_region_compatible(available_languages)


91
92
93
94
95
96
97
98
99
100
# File 'lib/http_accept_language/parser.rb', line 91

def language_region_compatible_from(available_languages)
  available_languages = sanitize_available_locales(available_languages)
  user_preferred_languages.map do |x| #en-US
    lang_group = available_languages.select do |y| # en
      y = y.to_s
      x.split('-', 2).first == y.split('-', 2).first
    end
    lang_group.find{|l| l == x} || lang_group.first #en-US, en-UK
  end.compact.first
end

#preferred_language_from(array) ⇒ Object

Finds the locale specifically requested by the browser.

Example:

request.preferred_language_from I18n.available_locales
# => 'nl'


46
47
48
# File 'lib/http_accept_language/parser.rb', line 46

def preferred_language_from(array)
  (user_preferred_languages & array.collect { |i| i.to_s }).first
end

#sanitize_available_locales(available_languages) ⇒ Object

Returns a supplied list of available locals without any extra application info that may be attached to the locale for storage in the application.

Example:

ja_JP-x1, en-US-x4, en_UK-x5, fr-FR-x3

> [ja-JP, en-US, en-UK, fr-FR]



72
73
74
75
76
77
78
79
80
# File 'lib/http_accept_language/parser.rb', line 72

def sanitize_available_locales(available_languages)
  available_languages.map do |avail|
    split_locale = avail.split(/[_-]/)

    split_locale.map do |e|
      e unless e.start_with?("x")
    end.compact.join("-")
  end
end

#user_preferred_languagesObject

Returns a sorted array based on user preference in HTTP_ACCEPT_LANGUAGE. Browsers send this HTTP header, so don’t think this is holy.

Example:

request.user_preferred_languages
# => [ 'nl-NL', 'nl-BE', 'nl', 'en-US', 'en' ]


19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/http_accept_language/parser.rb', line 19

def user_preferred_languages
  @user_preferred_languages ||= header.gsub(/\s+/, '').split(/,/).collect do |l|
    l += ';q=1.0' unless l =~ /;q=\d+\.\d+$/
      l.split(';q=')
  end.sort do |x,y|
    raise "Not correctly formatted" unless x.first =~ /^[a-z\-0-9]+$/i
    y.last.to_f <=> x.last.to_f
  end.collect do |l|
    l.first.downcase.gsub(/-[a-z0-9]+$/i) { |x| x.upcase }
  end
rescue # Just rescue anything if the browser messed up badly.
  []
end

#user_preferred_languages=(languages) ⇒ Object

Sets the user languages preference, overiding the browser



35
36
37
# File 'lib/http_accept_language/parser.rb', line 35

def user_preferred_languages=(languages)
  @user_preferred_languages = languages
end