Extract all locale-setting logic to a service

This commit is contained in:
Matt-Yorkley
2020-07-03 12:50:39 +02:00
parent 7a00a3ba1e
commit 02549d1b0f
3 changed files with 70 additions and 45 deletions

View File

@@ -6,7 +6,6 @@ module Spree
include Spree::Core::ControllerHelpers::Common
include Spree::Core::ControllerHelpers::Order
include Spree::Core::ControllerHelpers::SSL
include I18nHelper
ssl_required :new, :create, :destroy, :update
ssl_allowed :login_bar
@@ -54,9 +53,8 @@ module Spree
def ensure_valid_locale_persisted
# When creating a new user session we have to wait until after a successful
# login to be able to persist a locale on the current user
return unless spree_current_user && !available_locale?(spree_current_user.locale)
spree_current_user.update!(locale: I18n.default_locale)
UserLocaleSetter.ensure_valid_locale_persisted(spree_current_user)
end
end
end

View File

@@ -1,49 +1,9 @@
module I18nHelper
def set_locale
save_locale_from_params
# After logging in, check if the user chose a locale before
if current_user_locale.nil? && cookies[:locale] && available_locale?(params[:locale])
spree_current_user&.update!(locale: params[:locale])
end
I18n.locale = valid_current_locale
UserLocaleSetter.new(spree_current_user, params[:locale], cookies).call
end
def valid_locale(user)
if user.present? &&
user.locale.present? &&
available_locale?(user.locale)
user.locale
else
I18n.default_locale
end
end
def available_locale?(locale)
Rails.application.config.i18n.available_locales.include?(locale)
end
private
def save_locale_from_params
return unless params[:locale] && available_locale?(params[:locale])
spree_current_user&.update!(locale: params[:locale])
cookies[:locale] = params[:locale]
end
def current_user_locale
spree_current_user.andand.locale
end
def valid_current_locale
if available_locale?(current_user_locale)
current_user_locale
elsif available_locale?(cookies[:locale])
cookies[:locale]
else
I18n.default_locale
end
UserLocaleSetter.valid_locale_for_user(user)
end
end

View File

@@ -0,0 +1,67 @@
# frozen_string_literal: true
class UserLocaleSetter
def initialize(current_user, params_locale, cookies)
@current_user = current_user
@params_locale = params_locale
@cookies = cookies
end
def call
save_locale_from_params
# After logging in, check if the user chose a locale before
if current_user_locale.nil? && cookies[:locale] && available_locale?(params_locale)
current_user&.update!(locale: params_locale)
end
I18n.locale = valid_current_locale
end
def self.ensure_valid_locale_persisted(user)
return unless user && !available_locale?(user.locale)
user.update!(locale: I18n.default_locale)
end
def self.valid_locale_for_user(user)
if user.present? && user.locale.present? && available_locale?(user.locale)
user.locale
else
I18n.default_locale
end
end
def self.available_locale?(locale)
Rails.application.config.i18n.available_locales.include?(locale)
end
private
attr_reader :current_user, :params_locale, :cookies
def save_locale_from_params
return unless params_locale && available_locale?(params_locale)
current_user&.update!(locale: params_locale)
cookies[:locale] = params_locale
end
def available_locale?(locale)
self.class.available_locale?(locale)
end
def current_user_locale
current_user.andand.locale
end
def valid_current_locale
if available_locale?(current_user_locale)
current_user_locale
elsif available_locale?(cookies[:locale])
cookies[:locale]
else
I18n.default_locale
end
end
end