class Rack::Locale

Public Class Methods

new(app) click to toggle source
# File lib/rack/contrib/locale.rb, line 5
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack/contrib/locale.rb, line 9
def call(env)
  old_locale = I18n.locale

  begin
    locale = accept_locale(env) || I18n.default_locale
    locale = env['rack.locale'] = I18n.locale = locale.to_s
    status, headers, body = @app.call(env)
    headers['Content-Language'] = locale unless headers['Content-Language']
    [status, headers, body]
  ensure
    I18n.locale = old_locale
  end
end

Private Instance Methods

accept_locale(env) click to toggle source

www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4

# File lib/rack/contrib/locale.rb, line 26
def accept_locale(env)
  accept_langs = env["HTTP_ACCEPT_LANGUAGE"]
  return if accept_langs.nil?

  languages_and_qvalues = accept_langs.split(",").map { |l|
    l += ';q=1.0' unless l =~ /;q=\d+(?:\.\d+)?$/
    l.split(';q=')
  }

  lang = languages_and_qvalues.sort_by { |(locale, qvalue)|
    qvalue.to_f
  }.last.first

  lang == '*' ? nil : lang
end