Module: ConcernsOnRails::Controllers::Localizable

Extended by:
ActiveSupport::Concern
Defined in:
lib/concerns_on_rails/controllers/localizable.rb

Overview

Per-request locale selection from the request params and/or the ‘Accept-Language` header, wrapped in an `around_action` so `I18n.locale` is set for the action and restored afterwards.

class ApplicationController < ActionController::Base
  include ConcernsOnRails::Controllers::Localizable

  localizable available: %i[en fr de], default: :en
  # localizable param: :lang, header: false   # params[:lang] only
end

Resolution order: ‘params` → first match in `Accept-Language` →`default` → `I18n.default_locale`. The chosen locale is always validated against `I18n.available_locales` before use, so a stray param or a mismatched `available:` list can never raise `I18n::InvalidLocale`.

Options: ‘available:` (allow-list for param/header matching; defaults to `I18n.available_locales`), `default:`, `param:` (default `:locale`), `header:` (default `true`).

Instance Method Summary collapse

Instance Method Details

#resolved_localeObject

The locale chosen for this request — always one I18n can switch to.



49
50
51
52
53
54
55
# File 'lib/concerns_on_rails/controllers/localizable.rb', line 49

def resolved_locale
  opts = self.class.localizable_options
  allowed = opts[:available].presence || I18n.available_locales
  candidate = locale_from_param(opts, allowed) || locale_from_header(opts, allowed) || opts[:default]

  candidate && I18n.available_locales.include?(candidate.to_sym) ? candidate.to_sym : I18n.default_locale
end

#switch_localeObject

Public so subclasses can override; runs the action under the resolved locale.



44
45
46
# File 'lib/concerns_on_rails/controllers/localizable.rb', line 44

def switch_locale(&)
  I18n.with_locale(resolved_locale, &)
end