From 002e9239d00955f03765c976ff6a0fdfb24c2d52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Fri, 19 Jun 2020 12:41:37 +0200 Subject: [PATCH 1/3] Simplify code involving Globalize.locale We don't need to set this value. In commit f2ef27d3 I made a mistake thinking `Globalize.locale` and `I18n.locale` should always be in sync, but they're actually automatically in sync when `Globalize.locale` is `nil`. So the best way to avoid any issues is not to assign `Globalize.locale`, and use `Globalize.with_locale` where necessary instead. --- .../admin/site_customization/information_texts_controller.rb | 5 +++-- app/controllers/application_controller.rb | 1 - app/controllers/management/base_controller.rb | 1 - spec/spec_helper.rb | 1 - 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/controllers/admin/site_customization/information_texts_controller.rb b/app/controllers/admin/site_customization/information_texts_controller.rb index 6d91ab5fa..fc8a2b834 100644 --- a/app/controllers/admin/site_customization/information_texts_controller.rb +++ b/app/controllers/admin/site_customization/information_texts_controller.rb @@ -18,8 +18,9 @@ class Admin::SiteCustomization::InformationTextsController < Admin::SiteCustomiz next else text = I18nContent.find_or_create_by!(key: content[:id]) - Globalize.locale = locale - text.update!(value: value) + Globalize.with_locale(locale) do + text.update!(value: value) + end end end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c560ee5ed..50bc0e906 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -55,7 +55,6 @@ class ApplicationController < ActionController::Base end I18n.locale = locale - Globalize.locale = I18n.locale end def set_layout diff --git a/app/controllers/management/base_controller.rb b/app/controllers/management/base_controller.rb index 6d4070e09..6a2788718 100644 --- a/app/controllers/management/base_controller.rb +++ b/app/controllers/management/base_controller.rb @@ -46,7 +46,6 @@ class Management::BaseController < ActionController::Base session[:locale] ||= I18n.default_locale I18n.locale = session[:locale] - Globalize.locale = I18n.locale end def current_budget diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index ff616c6e9..dbacc0479 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -26,7 +26,6 @@ RSpec.configure do |config| config.before do |example| I18n.locale = :en - Globalize.locale = nil Globalize.set_fallbacks_to_all_available_locales Setting["feature.user.skip_verification"] = nil end From ee5ac25cb19e7e03f596aca22fa91cd33e1408b5 Mon Sep 17 00:00:00 2001 From: taitus Date: Wed, 6 May 2020 13:45:16 +0200 Subject: [PATCH 2/3] Improve set_locale We discard session[:locale] as valid locale when it is no longer include in the :available_locales --- app/controllers/application_controller.rb | 8 +++++--- spec/system/localization_spec.rb | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 50bc0e906..fc0430d05 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -46,9 +46,11 @@ class ApplicationController < ActionController::Base session[:locale] = params[:locale] end - session[:locale] ||= I18n.default_locale - - locale = session[:locale] + if session[:locale] && I18n.available_locales.include?(session[:locale].to_sym) + locale = session[:locale] + else + locale = I18n.default_locale + end if current_user && current_user.locale != locale.to_s current_user.update(locale: locale) diff --git a/spec/system/localization_spec.rb b/spec/system/localization_spec.rb index 4056cb8dd..94801ae5d 100644 --- a/spec/system/localization_spec.rb +++ b/spec/system/localization_spec.rb @@ -88,4 +88,22 @@ describe "Localization" do end end end + + scenario "uses default locale when session locale has disappeared" do + default_locales = I18n.available_locales + + visit root_path(locale: :es) + + expect(page).to have_content "Entrar" + + begin + I18n.available_locales = default_locales - [:es] + + visit root_path + + expect(page).to have_content "Sign in" + ensure + I18n.available_locales = default_locales + end + end end From 3b5a96bdfd96ef3a52b7b8fdc5b0680eaf277d5a Mon Sep 17 00:00:00 2001 From: taitus Date: Thu, 25 Jun 2020 19:53:48 +0200 Subject: [PATCH 3/3] Refactor set_locale Add new current_locale method to simplify logic --- app/controllers/application_controller.rb | 24 ++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index fc0430d05..c35bc5b22 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -42,21 +42,23 @@ class ApplicationController < ActionController::Base end def set_locale - if params[:locale] && I18n.available_locales.include?(params[:locale].to_sym) - session[:locale] = params[:locale] + I18n.locale = current_locale + + if current_user && current_user.locale != I18n.locale.to_s + current_user.update(locale: I18n.locale) end - if session[:locale] && I18n.available_locales.include?(session[:locale].to_sym) - locale = session[:locale] + session[:locale] = I18n.locale + end + + def current_locale + if I18n.available_locales.include?(params[:locale]&.to_sym) + params[:locale] + elsif I18n.available_locales.include?(session[:locale]&.to_sym) + session[:locale] else - locale = I18n.default_locale + I18n.default_locale end - - if current_user && current_user.locale != locale.to_s - current_user.update(locale: locale) - end - - I18n.locale = locale end def set_layout