class Localization
A middleware which attempts to find localized content.
Nested
Definitions
def initialize(app, locales:, default_locale: nil, default_locales: nil, hosts: {}, ignore: [])
Implementation
def initialize(app, locales:, default_locale: nil, default_locales: nil, hosts: {}, ignore: [])
@app = app
@all_locales = HTTP::Accept::Languages::Locales.new(locales)
# Locales here are represented as an array of strings, e.g. ['en', 'ja', 'cn', 'de'] and are used in order if no locale is specified by the user.
unless @default_locales = default_locales
if default_locale
@default_locales = [default_locale, nil]
else
# We append nil, i.e. no localization.
@default_locales = @all_locales.names + [nil]
end
end
@default_locale = default_locale || @default_locales.first
unless @default_locales.include? @default_locale
@default_locales.unshift(@default_locale)
end
# Select a localization based on a request host name:
@hosts = hosts
@ignore = ignore || options[:nonlocalized]
@methods = methods
end
def vary(env, response)
Set the Vary: header on the response to indicate that this response should include the header in the cache key.
Implementation
def vary(env, response)
headers = response[1].to_a
# This response was based on the Accept-Language header:
headers << ['Vary', 'Accept-Language']
# Althought this header is generally not supported, we supply it anyway as it is useful for debugging:
if locale = env[CURRENT_LOCALE_KEY]
# Set the Content-Location to point to the localized URI as requested:
headers['Content-Location'] = "/#{locale}" + env[Rack::PATH_INFO]
end
return response
end