Module: Philiprehberger::HeaderKit::AcceptLanguage

Defined in:
lib/philiprehberger/header_kit/accept_language.rb

Overview

Parses Accept-Language headers into structured language entries with quality values.

Constant Summary collapse

QUALITY_PATTERN =
/\Aq\z/i

Class Method Summary collapse

Class Method Details

.negotiate(header, available) ⇒ String?

Negotiate the best language match from available languages.

Parameters:

  • header (String)

    the Accept-Language header value

  • available (Array<String>)

    list of available language tags

Returns:

  • (String, nil)

    the best matching language, or nil if no match



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/philiprehberger/header_kit/accept_language.rb', line 25

def self.negotiate(header, available)
  return nil if available.nil? || available.empty?
  return available.first if header.nil? || header.strip.empty?

  parsed = parse(header)
  return nil if parsed.empty?

  parsed.each do |entry|
    next if entry[:quality] <= 0.0

    match = find_match(entry[:language], available)
    return match if match
  end

  nil
end

.parse(header) ⇒ Array<Hash>

Parse an Accept-Language header string.

Parameters:

  • header (String)

    the Accept-Language header value

Returns:

  • (Array<Hash>)

    sorted by quality descending, each with :language, :quality



13
14
15
16
17
18
# File 'lib/philiprehberger/header_kit/accept_language.rb', line 13

def self.parse(header)
  return [] if header.nil? || header.strip.empty?

  entries = header.split(',').map { |entry| parse_entry(entry.strip) }
  entries.compact.sort_by { |e| [-e[:quality], entries.index(e)] }
end