From 46a596397be5609e87cb92edb661042ea6925f9e Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Mon, 5 Feb 2018 17:13:16 -0800 Subject: [PATCH 1/9] Add (non-functional) locale chooser to admin --- .../spree/backend/components/_navigation.scss | 5 +++++ .../spree/admin/shared/_locale_selection.html.erb | 12 ++++++++++++ .../views/spree/admin/shared/_navigation.html.erb | 1 + 3 files changed, 18 insertions(+) create mode 100644 backend/app/views/spree/admin/shared/_locale_selection.html.erb diff --git a/backend/app/assets/stylesheets/spree/backend/components/_navigation.scss b/backend/app/assets/stylesheets/spree/backend/components/_navigation.scss index 7c9d6b718b4..8f2fd2978d6 100644 --- a/backend/app/assets/stylesheets/spree/backend/components/_navigation.scss +++ b/backend/app/assets/stylesheets/spree/backend/components/_navigation.scss @@ -160,6 +160,11 @@ nav.menu { } } +.admin-locale-selection { + margin: 1em; + margin-bottom: 0; +} + .admin-nav.fits .admin-nav-footer { position: fixed; bottom: 0; diff --git a/backend/app/views/spree/admin/shared/_locale_selection.html.erb b/backend/app/views/spree/admin/shared/_locale_selection.html.erb new file mode 100644 index 00000000000..cece93d6ae4 --- /dev/null +++ b/backend/app/views/spree/admin/shared/_locale_selection.html.erb @@ -0,0 +1,12 @@ +
+ +
diff --git a/backend/app/views/spree/admin/shared/_navigation.html.erb b/backend/app/views/spree/admin/shared/_navigation.html.erb index 42390adb71f..7f4bbc018e4 100644 --- a/backend/app/views/spree/admin/shared/_navigation.html.erb +++ b/backend/app/views/spree/admin/shared/_navigation.html.erb @@ -3,6 +3,7 @@
<%= render partial: 'spree/admin/shared/menu' %>
From 2c2eb82ac6d97a6113d43d649d9996e8e97d882f Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Thu, 8 Feb 2018 12:04:00 -0800 Subject: [PATCH 2/9] Allow changing locale on backend --- .../app/assets/javascripts/spree/backend.js | 1 + .../spree/backend/locale_selection.js | 16 +++++++++++++ .../spree/admin/locale_controller.rb | 23 +++++++++++++++++++ .../admin/shared/_locale_selection.html.erb | 2 +- backend/config/routes.rb | 2 ++ 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 backend/app/assets/javascripts/spree/backend/locale_selection.js create mode 100644 backend/app/controllers/spree/admin/locale_controller.rb diff --git a/backend/app/assets/javascripts/spree/backend.js b/backend/app/assets/javascripts/spree/backend.js index c313a8e319a..3bf92462153 100644 --- a/backend/app/assets/javascripts/spree/backend.js +++ b/backend/app/assets/javascripts/spree/backend.js @@ -37,6 +37,7 @@ //= require spree/backend/handlebars_extensions //= require spree/backend/images/index //= require spree/backend/images/upload +//= require spree/backend/locale_selection //= require spree/backend/navigation //= require spree/backend/option_type_autocomplete //= require spree/backend/option_value_picker diff --git a/backend/app/assets/javascripts/spree/backend/locale_selection.js b/backend/app/assets/javascripts/spree/backend/locale_selection.js new file mode 100644 index 00000000000..b5af51a1cfe --- /dev/null +++ b/backend/app/assets/javascripts/spree/backend/locale_selection.js @@ -0,0 +1,16 @@ +Spree.ready(function() { + var localeSelect = document.querySelector('.js-locale-selection'); + if (!localeSelect) return; + + localeSelect.addEventListener('change', function() { + Spree.ajax({ + type: "PUT", + dataType: "json", + url: Spree.pathFor("admin/locale/set"), + data: { locale: localeSelect.value }, + success: function(data) { + window.location.reload(); + } + }); + }); +}); diff --git a/backend/app/controllers/spree/admin/locale_controller.rb b/backend/app/controllers/spree/admin/locale_controller.rb new file mode 100644 index 00000000000..c910f383d86 --- /dev/null +++ b/backend/app/controllers/spree/admin/locale_controller.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Spree + module Admin + class LocaleController < Spree::Admin::BaseController + def set + locale = params[:locale].to_s.presence + + if locale && I18n.available_locales.include?(locale.to_sym) + session[:locale] = locale + + respond_to do |format| + format.json { render json: { locale: locale } } + end + else + respond_to do |format| + format.json { render json: { locale: I18n.locale }, status: 404 } + end + end + end + end + end +end diff --git a/backend/app/views/spree/admin/shared/_locale_selection.html.erb b/backend/app/views/spree/admin/shared/_locale_selection.html.erb index cece93d6ae4..22857626eea 100644 --- a/backend/app/views/spree/admin/shared/_locale_selection.html.erb +++ b/backend/app/views/spree/admin/shared/_locale_selection.html.erb @@ -1,5 +1,5 @@
- <%= options_for_select( I18n.available_locales.map do |locale| diff --git a/backend/config/routes.rb b/backend/config/routes.rb index c82888713fd..318d68806c4 100644 --- a/backend/config/routes.rb +++ b/backend/config/routes.rb @@ -5,6 +5,8 @@ get '/search/users', to: "search#users", as: :search_users get '/search/products', to: "search#products", as: :search_products + put '/locale/set', to: 'locale#set', defaults: { format: :json }, as: :set_locale + resources :dashboards, only: [] do collection do get :home From 06c5e1acfa71b26e7a1eeaf1c78de189c91cbdfa Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Thu, 1 Mar 2018 14:41:40 -0800 Subject: [PATCH 3/9] Add Spree::I18n.available_locales --- core/lib/spree/i18n.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/lib/spree/i18n.rb b/core/lib/spree/i18n.rb index 8ffbd076e66..44399ec3fa0 100644 --- a/core/lib/spree/i18n.rb +++ b/core/lib/spree/i18n.rb @@ -5,6 +5,14 @@ require 'action_view' module Spree + module I18n + def self.available_locales + I18n.available_locales.select do |locale| + I18n.t(:spree, locale: locale, fallback: false, default: nil) + end + end + end + class TranslationHelperWrapper # :nodoc: include ActionView::Helpers::TranslationHelper end From c0617de294278578753fe21b48ffe988801507b4 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Thu, 1 Mar 2018 15:28:40 -0800 Subject: [PATCH 4/9] Add Spree.i18n_available_locales This filters I18n.available_locales to return only those with translations for Solidus. --- core/lib/spree/i18n.rb | 8 +++----- core/spec/lib/i18n_spec.rb | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/core/lib/spree/i18n.rb b/core/lib/spree/i18n.rb index 44399ec3fa0..2978c2cd105 100644 --- a/core/lib/spree/i18n.rb +++ b/core/lib/spree/i18n.rb @@ -5,11 +5,9 @@ require 'action_view' module Spree - module I18n - def self.available_locales - I18n.available_locales.select do |locale| - I18n.t(:spree, locale: locale, fallback: false, default: nil) - end + def self.i18n_available_locales + I18n.available_locales.select do |locale| + I18n.t(:spree, locale: locale, fallback: false, default: nil) end end diff --git a/core/spec/lib/i18n_spec.rb b/core/spec/lib/i18n_spec.rb index 4e4c01ff751..8984a6b063e 100644 --- a/core/spec/lib/i18n_spec.rb +++ b/core/spec/lib/i18n_spec.rb @@ -5,6 +5,9 @@ RSpec.describe "i18n" do before do + # This reload avoids an issue with I18n.available_locales being cached + I18n.reload! + I18n.backend.store_translations(:en, { spree: { @@ -19,6 +22,9 @@ } }) end + after do + I18n.reload! + end it "translates within the spree scope" do expect(Spree.t(:foo)).to eql("bar") @@ -44,4 +50,30 @@ it "should have a Spree::I18N_GENERIC_PLURAL constant" do expect(Spree::I18N_GENERIC_PLURAL).to eq 2.1 end + + describe "i18n_available_locales" do + it "should only return :en" do + expect(Spree.i18n_available_locales).to eq([:en]) + end + + context 'with unprefixed translations in another locale' do + before do + I18n.backend.store_translations(:fr, { cheese: "fromage" }) + end + + it "should only return :en" do + expect(Spree.i18n_available_locales).to eq([:en]) + end + end + + context 'with spree-prefixed translations in another locale' do + before do + I18n.backend.store_translations(:fr, spree: { cheese: "fromage" }) + end + + it "should return :en and :fr" do + expect(Spree.i18n_available_locales).to eq([:en, :fr]) + end + end + end end From 14cedfc7cdb4ec6c02f12857c1f2964edb967e37 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Mon, 5 Mar 2018 16:35:33 -0800 Subject: [PATCH 5/9] Only use locales with i18n.this_file_language This prevents using locales which have some, but not most i18n translations defined. This fixes an issue when including solidus_auth_devise, but not solidus_i18n. Previously this method would misidentify the few non-en translations in solidus_i18n as forming a valid locale to switch to. --- core/lib/spree/i18n.rb | 2 +- core/spec/lib/i18n_spec.rb | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/lib/spree/i18n.rb b/core/lib/spree/i18n.rb index 2978c2cd105..873c1494ec6 100644 --- a/core/lib/spree/i18n.rb +++ b/core/lib/spree/i18n.rb @@ -7,7 +7,7 @@ module Spree def self.i18n_available_locales I18n.available_locales.select do |locale| - I18n.t(:spree, locale: locale, fallback: false, default: nil) + I18n.t('spree.i18n.this_file_language', locale: locale, fallback: false, default: nil) end end diff --git a/core/spec/lib/i18n_spec.rb b/core/spec/lib/i18n_spec.rb index 8984a6b063e..231876aac6e 100644 --- a/core/spec/lib/i18n_spec.rb +++ b/core/spec/lib/i18n_spec.rb @@ -11,6 +11,9 @@ I18n.backend.store_translations(:en, { spree: { + i18n: { + this_file_language: "English" + }, foo: "bar", bar: { foo: "bar within bar scope", @@ -71,6 +74,16 @@ I18n.backend.store_translations(:fr, spree: { cheese: "fromage" }) end + it "should return :en and :fr" do + expect(Spree.i18n_available_locales).to eq([:en]) + end + end + + context 'with specific desired key' do + before do + I18n.backend.store_translations(:fr, spree: { i18n: { this_file_language: "Français" } }) + end + it "should return :en and :fr" do expect(Spree.i18n_available_locales).to eq([:en, :fr]) end From 50a471845beb3b516039b5730c1d5cb02bea4e55 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Mon, 5 Mar 2018 16:37:39 -0800 Subject: [PATCH 6/9] Only admin locale switcher when > 1 locales --- .../admin/shared/_locale_selection.html.erb | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/backend/app/views/spree/admin/shared/_locale_selection.html.erb b/backend/app/views/spree/admin/shared/_locale_selection.html.erb index 22857626eea..bb43123b0a4 100644 --- a/backend/app/views/spree/admin/shared/_locale_selection.html.erb +++ b/backend/app/views/spree/admin/shared/_locale_selection.html.erb @@ -1,12 +1,15 @@
- + <% available_locales = Spree.i18n_available_locales %> + <% if available_locales.size > 1 %> + + <% end %>
From 568ca0b584d720ebcac6211001262fb77a4a0775 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Tue, 6 Mar 2018 16:25:47 -0800 Subject: [PATCH 7/9] Accept locale from params and persist to session --- backend/spec/features/admin/locale_spec.rb | 1 + core/lib/spree/core/controller_helpers/common.rb | 15 +++++++++++---- .../spec/controllers/controller_helpers_spec.rb | 4 ++++ frontend/spec/features/locale_spec.rb | 12 ++++++++---- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/backend/spec/features/admin/locale_spec.rb b/backend/spec/features/admin/locale_spec.rb index 9b8017d0d85..72fb641e886 100644 --- a/backend/spec/features/admin/locale_spec.rb +++ b/backend/spec/features/admin/locale_spec.rb @@ -13,6 +13,7 @@ month_names: [] }, spree: { + i18n: { this_file_language: "Français" }, admin: { tab: { orders: "Ordres" } }, diff --git a/core/lib/spree/core/controller_helpers/common.rb b/core/lib/spree/core/controller_helpers/common.rb index bdae648043b..86c90f7e562 100644 --- a/core/lib/spree/core/controller_helpers/common.rb +++ b/core/lib/spree/core/controller_helpers/common.rb @@ -48,10 +48,17 @@ def accurate_title private def set_user_language - locale = session[:locale] - locale ||= config_locale if respond_to?(:config_locale, true) - locale ||= Rails.application.config.i18n.default_locale - locale ||= I18n.default_locale + available_locales = Spree.i18n_available_locales + locale = [ + params[:locale], + session[:locale], + (config_locale if respond_to?(:config_locale, true)), + I18n.default_locale + ].detect do |candidate| + candidate && + available_locales.include?(candidate.to_sym) + end + session[:locale] = locale I18n.locale = locale Carmen.i18n_backend.locale = locale end diff --git a/frontend/spec/controllers/controller_helpers_spec.rb b/frontend/spec/controllers/controller_helpers_spec.rb index 7c1e3e1d5b1..dcc8318ec19 100644 --- a/frontend/spec/controllers/controller_helpers_spec.rb +++ b/frontend/spec/controllers/controller_helpers_spec.rb @@ -9,9 +9,13 @@ before do I18n.enforce_available_locales = false Spree::Frontend::Config[:locale] = :de + I18n.backend.store_translations(:de, spree: { + i18n: { this_file_language: "Deutsch (DE)" } + }) end after do + I18n.reload! Spree::Frontend::Config[:locale] = :en I18n.locale = :en I18n.enforce_available_locales = true diff --git a/frontend/spec/features/locale_spec.rb b/frontend/spec/features/locale_spec.rb index 533fd088893..c1b9b9accfe 100644 --- a/frontend/spec/features/locale_spec.rb +++ b/frontend/spec/features/locale_spec.rb @@ -15,13 +15,17 @@ def with_locale(locale) context 'shopping cart link and page' do before do - I18n.backend.store_translations(:fr, - spree: { - cart: 'Panier', - shopping_cart: 'Panier' + I18n.backend.store_translations(:fr, spree: { + i18n: { this_file_language: "Français" }, + cart: 'Panier', + shopping_cart: 'Panier' }) end + after do + I18n.reload! + end + it 'should be in french' do with_locale('fr') do visit spree.root_path From 36b57596f7cc4b662a9feee7af686c8298dd90b5 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Wed, 28 Mar 2018 16:25:24 -0700 Subject: [PATCH 8/9] Adjust locale chooser to work with solidus_i18n --- .../assets/javascripts/spree/backend/locale_selection.js | 6 ++++-- backend/app/controllers/spree/admin/locale_controller.rb | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/app/assets/javascripts/spree/backend/locale_selection.js b/backend/app/assets/javascripts/spree/backend/locale_selection.js index b5af51a1cfe..24a60533622 100644 --- a/backend/app/assets/javascripts/spree/backend/locale_selection.js +++ b/backend/app/assets/javascripts/spree/backend/locale_selection.js @@ -7,9 +7,11 @@ Spree.ready(function() { type: "PUT", dataType: "json", url: Spree.pathFor("admin/locale/set"), - data: { locale: localeSelect.value }, + data: { + switch_to_locale: localeSelect.value + }, success: function(data) { - window.location.reload(); + document.location.href = data.location; } }); }); diff --git a/backend/app/controllers/spree/admin/locale_controller.rb b/backend/app/controllers/spree/admin/locale_controller.rb index c910f383d86..a21d1ca2ce6 100644 --- a/backend/app/controllers/spree/admin/locale_controller.rb +++ b/backend/app/controllers/spree/admin/locale_controller.rb @@ -4,13 +4,14 @@ module Spree module Admin class LocaleController < Spree::Admin::BaseController def set - locale = params[:locale].to_s.presence + locale = params[:switch_to_locale].to_s.presence if locale && I18n.available_locales.include?(locale.to_sym) + I18n.locale = locale session[:locale] = locale respond_to do |format| - format.json { render json: { locale: locale } } + format.json { render json: { locale: locale, location: spree.admin_url } } end else respond_to do |format| From 63721f91fbbc7bd3c87880107ac9e9a7b0d4116b Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Wed, 28 Mar 2018 16:39:57 -0700 Subject: [PATCH 9/9] Move locale selection div inside if statement --- .../spree/admin/shared/_locale_selection.html.erb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/app/views/spree/admin/shared/_locale_selection.html.erb b/backend/app/views/spree/admin/shared/_locale_selection.html.erb index bb43123b0a4..aa745688cc8 100644 --- a/backend/app/views/spree/admin/shared/_locale_selection.html.erb +++ b/backend/app/views/spree/admin/shared/_locale_selection.html.erb @@ -1,6 +1,6 @@ -
- <% available_locales = Spree.i18n_available_locales %> - <% if available_locales.size > 1 %> +<% available_locales = Spree.i18n_available_locales %> +<% if available_locales.size > 1 %> +
- <% end %> -
+
+<% end %>