module RequestInfo::Detectors::LocaleDetector

Public Instance Methods

analyze(env) click to toggle source
Calls superclass method
# File lib/request_info/detectors/locale_detector.rb, line 10
def analyze(env)
  super
  RequestInfo.results.locale = detect_locale
end
wrap_app() click to toggle source
Calls superclass method
# File lib/request_info/detectors/locale_detector.rb, line 15
def wrap_app
  detected_locale = RequestInfo.results.locale
  previous_locale = ::I18n.locale
  ::I18n.locale = detected_locale

  status, headers, body = super

  # Set header language back to the client
  headers["Content-Language"] = RequestInfo.results.locale

  # Reset our modifications after app is finished
  ::I18n.locale = previous_locale

  [status, headers, body]
end

Private Instance Methods

browser_locales() click to toggle source

Locales preferred by user according to Accept-Language HTTP header.

# File lib/request_info/detectors/locale_detector.rb, line 55
def browser_locales
  locales_arr = RequestInfo.results.browser.try(:accept_language) || []
  locales_arr.flat_map { |l| [l.full, l.code] }
end
default_locale() click to toggle source
# File lib/request_info/detectors/locale_detector.rb, line 69
def default_locale
  ::I18n.default_locale.to_s
end
detect_locale() click to toggle source
# File lib/request_info/detectors/locale_detector.rb, line 33
def detect_locale
  available_locales = ::I18n.available_locales.map(&:to_s)
  user_preference.detect { |l| available_locales.include?(l) }
end
ip_locales() click to toggle source

Guessing of locales preferred by user basing on his location.

# File lib/request_info/detectors/locale_detector.rb, line 61
def ip_locales
  ipinfo = RequestInfo.results.ipinfo || {}
  country_code = ipinfo["country_code"]
  return [] unless country_code
  locales = CountryToLocalesMapping.country_code_locales(country_code)
  locales + locales.map { |l| l.split(/\W/, 2).first }
end
user_preference() click to toggle source

Returns enumerator which yields locales which are preferred by user, starting with the best matching one. The user preference is defined as concatenation of locales in Accept-Language HTTP header (already sorted according to respective weights), locales matching the user's location (guessed from the IP address), and finally the application's default locale.

It is not guaranteed that these locales are available in I18n.

# File lib/request_info/detectors/locale_detector.rb, line 46
def user_preference
  Enumerator.new do |y|
    browser_locales.each { |l| y << l }
    ip_locales.each { |l| y << l }
    y << default_locale
  end
end