diff --git a/config/application.rb b/config/application.rb index ad39ae88f..77e52538f 100644 --- a/config/application.rb +++ b/config/application.rb @@ -48,6 +48,8 @@ module Consul config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] config.i18n.load_path += Dir[Rails.root.join('config', 'locales', 'custom', '**', '*.{rb,yml}')] + config.after_initialize { Globalize.set_fallbacks_to_all_available_locales } + config.assets.paths << Rails.root.join("app", "assets", "fonts") # Do not swallow errors in after_commit/after_rollback callbacks. diff --git a/config/initializers/globalize.rb b/config/initializers/globalize.rb index d0836d0cc..d5834f217 100644 --- a/config/initializers/globalize.rb +++ b/config/initializers/globalize.rb @@ -11,3 +11,9 @@ module Globalize end end end + +def Globalize.set_fallbacks_to_all_available_locales + Globalize.fallbacks = I18n.available_locales.each_with_object({}) do |locale, fallbacks| + fallbacks[locale] = (I18n.fallbacks[locale] + I18n.available_locales).uniq + end +end diff --git a/spec/features/legislation/processes_spec.rb b/spec/features/legislation/processes_spec.rb index 9989c5ee8..17c750d81 100644 --- a/spec/features/legislation/processes_spec.rb +++ b/spec/features/legislation/processes_spec.rb @@ -141,6 +141,14 @@ feature 'Legislation' do expect(page).to_not have_content("Additional information") end + + scenario "Shows another translation when the default locale isn't available" do + process = create(:legislation_process, title_fr: "Français") + process.translations.where(locale: :en).first.destroy + + visit legislation_process_path(process) + expect(page).to have_content("Français") + end end context 'debate phase' do diff --git a/spec/models/admin_notification_spec.rb b/spec/models/admin_notification_spec.rb index eeb974e83..daaae0c32 100644 --- a/spec/models/admin_notification_spec.rb +++ b/spec/models/admin_notification_spec.rb @@ -3,6 +3,8 @@ require 'rails_helper' describe AdminNotification do let(:admin_notification) { build(:admin_notification) } + it_behaves_like "globalizable", :admin_notification + it "is valid" do expect(admin_notification).to be_valid end diff --git a/spec/models/concerns/globalizable.rb b/spec/models/concerns/globalizable.rb new file mode 100644 index 000000000..b63734117 --- /dev/null +++ b/spec/models/concerns/globalizable.rb @@ -0,0 +1,56 @@ +require "spec_helper" + +shared_examples_for "globalizable" do |factory_name| + let(:record) { create(factory_name) } + let(:field) { record.translated_attribute_names.first } + + describe "Fallbacks" do + before do + allow(I18n).to receive(:available_locales).and_return(%i[ar de en es fr]) + + record.update_attribute(field, "In English") + + { es: "En español", de: "Deutsch" }.each do |locale, text| + Globalize.with_locale(locale) do + record.translated_attribute_names.each do |attribute| + record.update_attribute(attribute, record.send(attribute)) + end + + record.update_attribute(field, text) + end + end + end + + after do + allow(I18n).to receive(:available_locales).and_call_original + allow(I18n.fallbacks).to receive(:[]).and_call_original + Globalize.set_fallbacks_to_all_available_locales + end + + context "With a defined fallback" do + before do + allow(I18n.fallbacks).to receive(:[]).and_return([:fr, :es]) + Globalize.set_fallbacks_to_all_available_locales + end + + it "Falls back to the defined fallback" do + Globalize.with_locale(:fr) do + expect(record.send(field)).to eq "En español" + end + end + end + + context "Without a defined fallback" do + before do + allow(I18n.fallbacks).to receive(:[]).and_return([:fr]) + Globalize.set_fallbacks_to_all_available_locales + end + + it "Falls back to the first available locale" do + Globalize.with_locale(:fr) do + expect(record.send(field)).to eq "Deutsch" + end + end + end + end +end