module Concerns::Locale extend ActiveSupport::Concern included do before_action :set_locale end def explicitly_requested_language params[:locale] end def user_settings_language current_user&.locale end def session_language session[:locale] end def browser_language request.env['HTTP_ACCEPT_LANGUAGE'] ? request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first : nil end def default_language FoodsoftConfig[:default_locale] || ::I18n.default_locale end private def select_language_according_to_priority language = explicitly_requested_language || session_language || user_settings_language language ||= browser_language unless FoodsoftConfig[:ignore_browser_locale] language.presence&.to_sym unless language.blank? end def available_locales ::I18n.available_locales end def set_locale if available_locales.include?(select_language_according_to_priority) ::I18n.locale = select_language_according_to_priority else ::I18n.locale = default_language end locale = session[:locale] = ::I18n.locale logger.info("Set locale to #{locale}") end end