Class: AcceptLanguage::Parser

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

Overview

Parses Accept-Language header fields into structured data, extracting language tags and their quality values (q-values). Validates input according to RFC 2616 specifications and handles edge cases like malformed inputs and implicit quality values.

Examples:

Parser.new("da, en-GB;q=0.8, en;q=0.7")
# => #<AcceptLanguage::Parser:0x00007 @languages_range={"da"=>1.0, "en-GB"=>0.8, "en"=>0.7}>

See Also:

Constant Summary collapse

DEFAULT_QUALITY =
"1"
SEPARATOR =
","
SPACE =
" "
SUFFIX =
";q="
QVALUE_PATTERN =

Validates q-values according to RFC 2616:

  • Must be between 0 and 1

  • Can have up to 3 decimal places

  • Allows both forms: .8 and 0.8

/\A(?:0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?|\.[0-9]{1,3})\z/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(field) ⇒ Parser

Initializes a new Parser instance by importing and processing the given Accept-Language header field.

Parameters:

  • field (String)

    The Accept-Language header field to parse.



32
33
34
# File 'lib/accept_language/parser.rb', line 32

def initialize(field)
  @languages_range = import(field)
end

Instance Attribute Details

#languages_rangeObject (readonly)

Returns the value of attribute languages_range.



27
28
29
# File 'lib/accept_language/parser.rb', line 27

def languages_range
  @languages_range
end

Instance Method Details

#match(*available_langtags) ⇒ String, ...

Finds the best matching language from available options based on user preferences. Considers quality values and language tag specificity (e.g., “en-US” vs “en”).

Examples:

Match against specific language options

parser.match("en", "fr", "de") # => "en" if English is preferred

Match with region-specific tags

parser.match("en-US", "en-GB", "fr") # => "en-GB" if British English is preferred

Parameters:

  • available_langtags (Array<String, Symbol>)

    Languages supported by your application

Returns:

  • (String, Symbol, nil)

    Best matching language tag or nil if no match found



45
46
47
# File 'lib/accept_language/parser.rb', line 45

def match(*available_langtags)
  Matcher.new(**languages_range).call(*available_langtags)
end