diff --git a/.rubocop.yml b/.rubocop.yml
index eef2eaac0..96d7572b5 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -574,6 +574,7 @@ RSpec/InstanceVariable:
Enabled: true
Exclude:
- spec/controllers/concerns/has_orders_spec.rb
+ - spec/form_builders/translatable_form_builder_spec.rb
RSpec/LetBeforeExamples:
Enabled: true
diff --git a/app/components/admin/site_customization/content_blocks/form_content_block_component.html.erb b/app/components/admin/site_customization/content_blocks/form_content_block_component.html.erb
index 0f36892b6..55ea3f573 100644
--- a/app/components/admin/site_customization/content_blocks/form_content_block_component.html.erb
+++ b/app/components/admin/site_customization/content_blocks/form_content_block_component.html.erb
@@ -6,7 +6,7 @@
<%= f.select :name, options_for_select(valid_blocks, selected_content_block) %>
- <%= f.select :locale, I18n.available_locales %>
+ <%= f.select :locale, Setting.enabled_locales %>
diff --git a/app/components/admin/site_customization/content_blocks/form_heading_content_block_component.html.erb b/app/components/admin/site_customization/content_blocks/form_heading_content_block_component.html.erb
index 862794114..486b9b4cd 100644
--- a/app/components/admin/site_customization/content_blocks/form_heading_content_block_component.html.erb
+++ b/app/components/admin/site_customization/content_blocks/form_heading_content_block_component.html.erb
@@ -7,7 +7,7 @@
<%= label_tag :locale %>
- <%= select_tag :locale, options_for_select(I18n.available_locales, content_block.locale.to_sym) %>
+ <%= select_tag :locale, options_for_select(Setting.enabled_locales, content_block.locale.to_sym) %>
<%= label_tag :body %>
diff --git a/app/components/admin/site_customization/information_texts/form_component.html.erb b/app/components/admin/site_customization/information_texts/form_component.html.erb
index b224a0cc1..b8f8b6444 100644
--- a/app/components/admin/site_customization/information_texts/form_component.html.erb
+++ b/app/components/admin/site_customization/information_texts/form_component.html.erb
@@ -1,13 +1,13 @@
<%= render Shared::GlobalizeLocalesComponent.new %>
<%= form_tag admin_site_customization_information_texts_path do %>
- <% I18n.available_locales.each do |l| %>
+ <% enabled_locales.each do |l| %>
<%= translation_enabled_tag l, site_customization_enable_translation?(l) %>
<% end %>
<% contents.each do |group| %>
<% group.each do |content| %>
<%= content.key %>
- <% content.globalize_locales.each do |locale| %>
+ <% (content.globalize_locales & enabled_locales.map(&:to_sym)).each do |locale| %>
<%= render Admin::SiteCustomization::InformationTexts::FormFieldComponent.new(content, locale: locale) %>
<% end %>
<% end %>
diff --git a/app/components/admin/site_customization/information_texts/form_component.rb b/app/components/admin/site_customization/information_texts/form_component.rb
index 49521f9e1..862e5a759 100644
--- a/app/components/admin/site_customization/information_texts/form_component.rb
+++ b/app/components/admin/site_customization/information_texts/form_component.rb
@@ -11,4 +11,8 @@ class Admin::SiteCustomization::InformationTexts::FormComponent < ApplicationCom
def translation_enabled_tag(locale, enabled)
hidden_field_tag("enabled_translations[#{locale}]", (enabled ? 1 : 0))
end
+
+ def enabled_locales
+ Setting.enabled_locales
+ end
end
diff --git a/app/components/layout/locale_switcher_component.rb b/app/components/layout/locale_switcher_component.rb
index 304bfd119..bce22d522 100644
--- a/app/components/layout/locale_switcher_component.rb
+++ b/app/components/layout/locale_switcher_component.rb
@@ -12,7 +12,7 @@ class Layout::LocaleSwitcherComponent < ApplicationComponent
end
def locales
- I18n.available_locales
+ Setting.enabled_locales
end
def label
diff --git a/app/components/shared/globalize_locales_component.html.erb b/app/components/shared/globalize_locales_component.html.erb
index aa73c9b24..664d298db 100644
--- a/app/components/shared/globalize_locales_component.html.erb
+++ b/app/components/shared/globalize_locales_component.html.erb
@@ -13,7 +13,7 @@
<%= select_language_error %>
<% if manage_languages %>
- <% I18n.available_locales.each do |locale| %>
+ <% Setting.enabled_locales.each do |locale| %>
<%= link_to t("shared.translations.remove_language"), "#",
style: display_destroy_locale_style(locale),
class: "delete js-delete-language js-delete-#{locale}",
diff --git a/app/components/shared/globalize_locales_component.rb b/app/components/shared/globalize_locales_component.rb
index 8b551ceb6..8bc2696ce 100644
--- a/app/components/shared/globalize_locales_component.rb
+++ b/app/components/shared/globalize_locales_component.rb
@@ -15,7 +15,7 @@ class Shared::GlobalizeLocalesComponent < ApplicationComponent
end
def available_locales
- I18n.available_locales.select { |locale| enabled_locale?(resource, locale) }.map do |locale|
+ Setting.enabled_locales.select { |locale| enabled_locale?(resource, locale) }.map do |locale|
[name_for_locale(locale), locale, { data: { locale: locale }}]
end
end
@@ -84,7 +84,7 @@ class Shared::GlobalizeLocalesComponent < ApplicationComponent
end
def all_language_options
- I18n.available_locales.map do |locale|
+ Setting.enabled_locales.map do |locale|
[name_for_locale(locale), locale]
end
end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index f05714b53..28493bd02 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -51,9 +51,9 @@ class ApplicationController < ActionController::Base
end
def current_locale
- if I18n.available_locales.include?(params[:locale]&.to_sym)
+ if Setting.enabled_locales.include?(params[:locale]&.to_sym)
params[:locale]
- elsif I18n.available_locales.include?(session[:locale]&.to_sym)
+ elsif Setting.enabled_locales.include?(session[:locale]&.to_sym)
session[:locale]
else
I18n.default_locale
diff --git a/app/controllers/management/base_controller.rb b/app/controllers/management/base_controller.rb
index 185a0fc07..2307d5ea3 100644
--- a/app/controllers/management/base_controller.rb
+++ b/app/controllers/management/base_controller.rb
@@ -40,7 +40,7 @@ class Management::BaseController < ActionController::Base
end
def switch_locale(&action)
- if params[:locale] && I18n.available_locales.include?(params[:locale].to_sym)
+ if params[:locale] && Setting.enabled_locales.include?(params[:locale].to_sym)
session[:locale] = params[:locale].to_s
end
diff --git a/app/controllers/subscriptions_controller.rb b/app/controllers/subscriptions_controller.rb
index 315905001..e1a50316a 100644
--- a/app/controllers/subscriptions_controller.rb
+++ b/app/controllers/subscriptions_controller.rb
@@ -38,6 +38,6 @@ class SubscriptionsController < ApplicationController
end
def find_locale
- I18n.available_locales.find { |locale| locale == @user.locale&.to_sym } || I18n.locale
+ Setting.enabled_locales.find { |locale| locale == @user.locale&.to_sym } || I18n.locale
end
end
diff --git a/app/form_builders/translatable_form_builder.rb b/app/form_builders/translatable_form_builder.rb
index e185542ff..cc1700ca1 100644
--- a/app/form_builders/translatable_form_builder.rb
+++ b/app/form_builders/translatable_form_builder.rb
@@ -63,7 +63,7 @@ class TranslatableFormBuilder < ConsulFormBuilder
def visible_locales
if @template.translations_interface_enabled?
- @object.globalize_locales
+ Setting.enabled_locales & @object.globalize_locales
else
[I18n.locale]
end
diff --git a/app/models/budget/content_block.rb b/app/models/budget/content_block.rb
index fef73dc9a..95608f30d 100644
--- a/app/models/budget/content_block.rb
+++ b/app/models/budget/content_block.rb
@@ -1,6 +1,6 @@
class Budget
class ContentBlock < ApplicationRecord
- validates :locale, presence: true, inclusion: { in: I18n.available_locales.map(&:to_s) }
+ validates :locale, presence: true, inclusion: { in: ->(*) { Setting.enabled_locales.map(&:to_s) }}
validates :heading, presence: true, uniqueness: { scope: :locale }
belongs_to :heading
diff --git a/app/models/i18n_content.rb b/app/models/i18n_content.rb
index c17a7dee2..72c656c95 100644
--- a/app/models/i18n_content.rb
+++ b/app/models/i18n_content.rb
@@ -119,7 +119,7 @@ class I18nContent < ApplicationRecord
end
end
- def self.update(contents, enabled_translations = I18n.available_locales)
+ def self.update(contents, enabled_translations = Setting.enabled_locales)
contents.each do |content|
values = content[:values].slice(*translation_params(enabled_translations))
diff --git a/app/models/setting.rb b/app/models/setting.rb
index 5427afccf..0dee92c84 100644
--- a/app/models/setting.rb
+++ b/app/models/setting.rb
@@ -95,6 +95,7 @@ class Setting < ApplicationRecord
"html.per_page_code_body": "",
# Code to be included at the top (inside ) of every page (useful for tracking)
"html.per_page_code_head": "",
+ "locales.enabled": nil,
"map.latitude": 51.48,
"map.longitude": 0.0,
"map.zoom": 10,
@@ -219,5 +220,11 @@ class Setting < ApplicationRecord
def archived_proposals_date_limit
Setting["months_to_archive_proposals"].to_i.months.ago
end
+
+ def enabled_locales
+ locales = Setting["locales.enabled"].to_s.split.map(&:to_sym)
+
+ (locales & I18n.available_locales).presence || I18n.available_locales
+ end
end
end
diff --git a/app/models/site_customization/content_block.rb b/app/models/site_customization/content_block.rb
index 7d42817e6..a7e95d0ab 100644
--- a/app/models/site_customization/content_block.rb
+++ b/app/models/site_customization/content_block.rb
@@ -1,7 +1,7 @@
class SiteCustomization::ContentBlock < ApplicationRecord
VALID_BLOCKS = %w[top_links footer footer_legal subnavigation_left subnavigation_right].freeze
- validates :locale, presence: true, inclusion: { in: I18n.available_locales.map(&:to_s) }
+ validates :locale, presence: true, inclusion: { in: ->(*) { Setting.enabled_locales.map(&:to_s) }}
validates :name, presence: true, uniqueness: { scope: :locale }, inclusion: { in: ->(*) { VALID_BLOCKS }}
def self.block_for(name, locale)
diff --git a/db/dev_seeds.rb b/db/dev_seeds.rb
index 00f102f22..5c67ac52f 100644
--- a/db/dev_seeds.rb
+++ b/db/dev_seeds.rb
@@ -23,7 +23,11 @@ def log(msg)
end
def random_locales
- [I18n.default_locale, *(I18n.available_locales & %i[en es]), *I18n.available_locales.sample(4)].uniq.take(5)
+ [
+ I18n.default_locale,
+ *(Setting.enabled_locales & %i[en es]),
+ *Setting.enabled_locales.sample(4)
+ ].uniq.take(5)
end
def random_locales_attributes(**attribute_names_with_values)
diff --git a/db/dev_seeds/banners.rb b/db/dev_seeds/banners.rb
index 345ae4e90..9716978ae 100644
--- a/db/dev_seeds/banners.rb
+++ b/db/dev_seeds/banners.rb
@@ -9,7 +9,7 @@ section "Creating banners" do
post_started_at: rand((1.week.ago)..(1.day.ago)),
post_ended_at: rand((1.day.ago)..(1.week.from_now)),
created_at: rand((1.week.ago)..Time.current))
- I18n.available_locales.map do |locale|
+ Setting.enabled_locales.map do |locale|
Globalize.with_locale(locale) do
banner.description = "Description for locale #{locale}"
banner.title = "Title for locale #{locale}"
diff --git a/db/dev_seeds/polls.rb b/db/dev_seeds/polls.rb
index e0b62a899..44021a782 100644
--- a/db/dev_seeds/polls.rb
+++ b/db/dev_seeds/polls.rb
@@ -41,7 +41,7 @@ section "Creating polls" do
Poll.find_each do |poll|
name = poll.name
- I18n.available_locales.map do |locale|
+ Setting.enabled_locales.map do |locale|
Globalize.with_locale(locale) do
poll.name = "#{name} (#{locale})"
poll.summary = "Summary for locale #{locale}"
@@ -59,7 +59,7 @@ section "Creating Poll Questions & Answers" do
question = Poll::Question.new(author: User.sample,
title: question_title,
poll: poll)
- I18n.available_locales.map do |locale|
+ Setting.enabled_locales.map do |locale|
Globalize.with_locale(locale) do
question.title = "#{question_title} (#{locale})"
end
@@ -71,7 +71,7 @@ section "Creating Poll Questions & Answers" do
title: title.capitalize,
description: description,
given_order: index + 1)
- I18n.available_locales.map do |locale|
+ Setting.enabled_locales.map do |locale|
Globalize.with_locale(locale) do
answer.title = "#{title} (#{locale})"
answer.description = "#{description} (#{locale})"
@@ -235,7 +235,7 @@ section "Creating Poll Questions from Proposals" do
question = Poll::Question.new(poll: poll)
question.copy_attributes_from_proposal(proposal)
question_title = question.title
- I18n.available_locales.map do |locale|
+ Setting.enabled_locales.map do |locale|
Globalize.with_locale(locale) do
question.title = "#{question_title} (#{locale})"
end
@@ -247,7 +247,7 @@ section "Creating Poll Questions from Proposals" do
title: title.capitalize,
description: description,
given_order: index + 1)
- I18n.available_locales.map do |locale|
+ Setting.enabled_locales.map do |locale|
Globalize.with_locale(locale) do
answer.title = "#{title} (#{locale})"
answer.description = "#{description} (#{locale})"
@@ -265,7 +265,7 @@ section "Creating Successful Proposals" do
question = Poll::Question.new(poll: poll)
question.copy_attributes_from_proposal(proposal)
question_title = question.title
- I18n.available_locales.map do |locale|
+ Setting.enabled_locales.map do |locale|
Globalize.with_locale(locale) do
question.title = "#{question_title} (#{locale})"
end
@@ -277,7 +277,7 @@ section "Creating Successful Proposals" do
title: title.capitalize,
description: description,
given_order: index + 1)
- I18n.available_locales.map do |locale|
+ Setting.enabled_locales.map do |locale|
Globalize.with_locale(locale) do
answer.title = "#{title} (#{locale})"
answer.description = "#{description} (#{locale})"
diff --git a/db/pages/accessibility.rb b/db/pages/accessibility.rb
index c499199ca..8d2e2d824 100644
--- a/db/pages/accessibility.rb
+++ b/db/pages/accessibility.rb
@@ -104,7 +104,7 @@ end
if SiteCustomization::Page.find_by(slug: "accessibility").nil?
page = SiteCustomization::Page.new(slug: "accessibility", status: "published")
- I18n.available_locales.each do |locale|
+ Setting.enabled_locales.each do |locale|
I18n.with_locale(locale) { generate_content(page) }
end
end
diff --git a/db/pages/census_terms.rb b/db/pages/census_terms.rb
index b5c3a43c3..27ac3fc45 100644
--- a/db/pages/census_terms.rb
+++ b/db/pages/census_terms.rb
@@ -7,7 +7,7 @@ end
if SiteCustomization::Page.find_by(slug: "census_terms").nil?
page = SiteCustomization::Page.new(slug: "census_terms", status: "published")
page.print_content_flag = true
- I18n.available_locales.each do |locale|
+ Setting.enabled_locales.each do |locale|
I18n.with_locale(locale) { generate_content(page) }
end
end
diff --git a/db/pages/conditions.rb b/db/pages/conditions.rb
index 539fc6afe..314d0db61 100644
--- a/db/pages/conditions.rb
+++ b/db/pages/conditions.rb
@@ -8,7 +8,7 @@ end
if SiteCustomization::Page.find_by(slug: "conditions").nil?
page = SiteCustomization::Page.new(slug: "conditions", status: "published")
page.print_content_flag = true
- I18n.available_locales.each do |locale|
+ Setting.enabled_locales.each do |locale|
I18n.with_locale(locale) { generate_content(page) }
end
end
diff --git a/db/pages/faq.rb b/db/pages/faq.rb
index 362801a2e..983b78665 100644
--- a/db/pages/faq.rb
+++ b/db/pages/faq.rb
@@ -5,7 +5,7 @@ def generate_content(page)
end
if SiteCustomization::Page.find_by(slug: "faq").nil?
page = SiteCustomization::Page.new(slug: "faq", status: "published")
- I18n.available_locales.each do |locale|
+ Setting.enabled_locales.each do |locale|
I18n.with_locale(locale) { generate_content(page) }
end
end
diff --git a/db/pages/privacy.rb b/db/pages/privacy.rb
index 5f215810d..dfa82b492 100644
--- a/db/pages/privacy.rb
+++ b/db/pages/privacy.rb
@@ -7,7 +7,7 @@ end
if SiteCustomization::Page.find_by(slug: "privacy").nil?
page = SiteCustomization::Page.new(slug: "privacy", status: "published")
page.print_content_flag = true
- I18n.available_locales.each do |locale|
+ Setting.enabled_locales.each do |locale|
I18n.with_locale(locale) { generate_content(page) }
end
end
diff --git a/db/pages/welcome_level_three_verified.rb b/db/pages/welcome_level_three_verified.rb
index 5467f5917..0fd6a6eac 100644
--- a/db/pages/welcome_level_three_verified.rb
+++ b/db/pages/welcome_level_three_verified.rb
@@ -17,7 +17,7 @@ end
if SiteCustomization::Page.find_by(slug: "welcome_level_three_verified").nil?
page = SiteCustomization::Page.new(slug: "welcome_level_three_verified", status: "published")
- I18n.available_locales.each do |locale|
+ Setting.enabled_locales.each do |locale|
I18n.with_locale(locale) { generate_content(page) }
end
end
diff --git a/db/pages/welcome_level_two_verified.rb b/db/pages/welcome_level_two_verified.rb
index 251fc6b04..27d2fba32 100644
--- a/db/pages/welcome_level_two_verified.rb
+++ b/db/pages/welcome_level_two_verified.rb
@@ -22,7 +22,7 @@ def generate_content(page)
end
if SiteCustomization::Page.find_by(slug: "welcome_level_two_verified").nil?
page = SiteCustomization::Page.new(slug: "welcome_level_two_verified", status: "published")
- I18n.available_locales.each do |locale|
+ Setting.enabled_locales.each do |locale|
I18n.with_locale(locale) { generate_content(page) }
end
end
diff --git a/db/pages/welcome_not_verified.rb b/db/pages/welcome_not_verified.rb
index 4263130f0..946570101 100644
--- a/db/pages/welcome_not_verified.rb
+++ b/db/pages/welcome_not_verified.rb
@@ -22,7 +22,7 @@ def generate_content(page)
end
if SiteCustomization::Page.find_by(slug: "welcome_not_verified").nil?
page = SiteCustomization::Page.new(slug: "welcome_not_verified", status: "published")
- I18n.available_locales.each do |locale|
+ Setting.enabled_locales.each do |locale|
I18n.with_locale(locale) { generate_content(page) }
end
end
diff --git a/spec/components/admin/site_customization/content_blocks/form_content_block_component_spec.rb b/spec/components/admin/site_customization/content_blocks/form_content_block_component_spec.rb
new file mode 100644
index 000000000..6e44168b6
--- /dev/null
+++ b/spec/components/admin/site_customization/content_blocks/form_content_block_component_spec.rb
@@ -0,0 +1,18 @@
+require "rails_helper"
+
+describe Admin::SiteCustomization::ContentBlocks::FormContentBlockComponent do
+ describe "locale selector" do
+ let(:content_block) { create(:site_customization_content_block, locale: "de") }
+ let(:component) do
+ Admin::SiteCustomization::ContentBlocks::FormContentBlockComponent.new(content_block)
+ end
+
+ it "only includes enabled settings" do
+ Setting["locales.enabled"] = "de fr"
+
+ render_inline component
+
+ expect(page).to have_select "locale", options: ["de", "fr"]
+ end
+ end
+end
diff --git a/spec/components/admin/site_customization/content_blocks/form_heading_content_block_component_spec.rb b/spec/components/admin/site_customization/content_blocks/form_heading_content_block_component_spec.rb
new file mode 100644
index 000000000..b04c8a64d
--- /dev/null
+++ b/spec/components/admin/site_customization/content_blocks/form_heading_content_block_component_spec.rb
@@ -0,0 +1,18 @@
+require "rails_helper"
+
+describe Admin::SiteCustomization::ContentBlocks::FormHeadingContentBlockComponent do
+ describe "locale selector" do
+ let(:content_block) { create(:heading_content_block, locale: "de") }
+ let(:component) do
+ Admin::SiteCustomization::ContentBlocks::FormHeadingContentBlockComponent.new(content_block)
+ end
+
+ it "only includes enabled settings" do
+ Setting["locales.enabled"] = "de fr"
+
+ render_inline component
+
+ expect(page).to have_select "locale", options: ["de", "fr"]
+ end
+ end
+end
diff --git a/spec/components/admin/site_customization/information_texts/form_component_spec.rb b/spec/components/admin/site_customization/information_texts/form_component_spec.rb
new file mode 100644
index 000000000..614ef28f9
--- /dev/null
+++ b/spec/components/admin/site_customization/information_texts/form_component_spec.rb
@@ -0,0 +1,29 @@
+require "rails_helper"
+
+describe Admin::SiteCustomization::InformationTexts::FormComponent do
+ describe "enabled_translations fields" do
+ it "renders fields for enabled locales" do
+ Setting["locales.enabled"] = "en es"
+ content = create(:i18n_content)
+
+ render_inline Admin::SiteCustomization::InformationTexts::FormComponent.new([[content]])
+
+ expect(page).to have_css "input[name^='enabled_translations']", count: 2, visible: :all
+ expect(page).to have_css "input[name='enabled_translations[en]']", visible: :hidden
+ expect(page).to have_css "input[name='enabled_translations[es]']", visible: :hidden
+ end
+ end
+
+ describe "text fields" do
+ it "renders fields for enabled locales" do
+ Setting["locales.enabled"] = "en es"
+ content = create(:i18n_content, key: "system.failure")
+
+ render_inline Admin::SiteCustomization::InformationTexts::FormComponent.new([[content]])
+
+ expect(page).to have_css "textarea[name^='contents[content_system.failure]']", count: 2, visible: :all
+ expect(page).to have_field "contents[content_system.failure]values[value_en]"
+ expect(page).to have_field "contents[content_system.failure]values[value_es]"
+ end
+ end
+end
diff --git a/spec/components/layout/locale_switcher_component_spec.rb b/spec/components/layout/locale_switcher_component_spec.rb
index 1063ede2f..f043f3550 100644
--- a/spec/components/layout/locale_switcher_component_spec.rb
+++ b/spec/components/layout/locale_switcher_component_spec.rb
@@ -97,4 +97,20 @@ describe Layout::LocaleSwitcherComponent do
expect(page).to have_css "[href='/?locale=en'][data-turbolinks=true]"
end
end
+
+ context "when not all available locales are enabled" do
+ before do
+ allow(I18n).to receive(:available_locales).and_return(%i[en es fr])
+ Setting["locales.enabled"] = "es fr"
+ end
+
+ it "displays the enabled locales" do
+ render_inline component
+
+ expect(page).to have_link count: 2
+ expect(page).to have_link "Español"
+ expect(page).to have_link "Français"
+ expect(page).not_to have_link "English"
+ end
+ end
end
diff --git a/spec/components/shared/globalize_locales_component_spec.rb b/spec/components/shared/globalize_locales_component_spec.rb
new file mode 100644
index 000000000..da2dae47f
--- /dev/null
+++ b/spec/components/shared/globalize_locales_component_spec.rb
@@ -0,0 +1,49 @@
+require "rails_helper"
+
+describe Shared::GlobalizeLocalesComponent do
+ describe "Language selector" do
+ it "only includes enabled locales" do
+ Setting["locales.enabled"] = "en nl"
+
+ I18n.with_locale(:en) do
+ render_inline Shared::GlobalizeLocalesComponent.new
+
+ expect(page).to have_select options: ["Choose language", "English"]
+ end
+
+ I18n.with_locale(:es) do
+ render_inline Shared::GlobalizeLocalesComponent.new
+
+ expect(page).to have_select options: ["Seleccionar idioma"]
+ end
+ end
+ end
+
+ describe "links to destroy languages" do
+ it "only includes enabled locales" do
+ Setting["locales.enabled"] = "en nl"
+
+ I18n.with_locale(:en) do
+ render_inline Shared::GlobalizeLocalesComponent.new
+
+ expect(page).to have_css "a[data-locale]", count: 1
+ end
+
+ I18n.with_locale(:es) do
+ render_inline Shared::GlobalizeLocalesComponent.new
+
+ expect(page).not_to have_css "a[data-locale]"
+ end
+ end
+ end
+
+ describe "Add language selector" do
+ it "only includes enabled locales" do
+ Setting["locales.enabled"] = "en nl"
+
+ render_inline Shared::GlobalizeLocalesComponent.new
+
+ expect(page).to have_select options: ["Add language", "English", "Nederlands"]
+ end
+ end
+end
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index 6e46ab7d7..f9bc09b65 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -54,6 +54,22 @@ describe ApplicationController do
expect(response.body).to eq "es"
end
+ it "only accepts enabled locales" do
+ Setting["locales.enabled"] = "en es fr"
+
+ get :index, params: { locale: :es }
+
+ expect(response.body).to eq "es"
+
+ get :index, params: { locale: :de }
+
+ expect(response.body).to eq "es"
+
+ get :index, params: { locale: :fr }
+
+ expect(response.body).to eq "fr"
+ end
+
context "authenticated user" do
let(:user) { create(:user) }
before { sign_in(user) }
diff --git a/spec/controllers/management/base_controller_spec.rb b/spec/controllers/management/base_controller_spec.rb
index 0aa4202fe..9abe44fbb 100644
--- a/spec/controllers/management/base_controller_spec.rb
+++ b/spec/controllers/management/base_controller_spec.rb
@@ -64,5 +64,21 @@ describe Management::BaseController do
expect(response.body).to eq "es"
end
+
+ it "only accepts enabled locales" do
+ Setting["locales.enabled"] = "en es fr"
+
+ get :index, params: { locale: :es }
+
+ expect(response.body).to eq "es"
+
+ get :index, params: { locale: :de }
+
+ expect(response.body).to eq "es"
+
+ get :index, params: { locale: :fr }
+
+ expect(response.body).to eq "fr"
+ end
end
end
diff --git a/spec/controllers/subscriptions_controller_spec.rb b/spec/controllers/subscriptions_controller_spec.rb
index 1e1124125..e675136de 100644
--- a/spec/controllers/subscriptions_controller_spec.rb
+++ b/spec/controllers/subscriptions_controller_spec.rb
@@ -28,8 +28,10 @@ describe SubscriptionsController do
expect(session[:locale]).to eq "es"
end
- it "only accepts available locales" do
- create(:user, locale: "wl", subscriptions_token: "mytoken")
+ it "only accepts enabled locales" do
+ Setting["locales.enabled"] = "en nl"
+
+ create(:user, locale: "es", subscriptions_token: "mytoken")
get :edit, params: { token: "mytoken" }
diff --git a/spec/form_builders/translatable_form_builder_spec.rb b/spec/form_builders/translatable_form_builder_spec.rb
new file mode 100644
index 000000000..fd8747f3f
--- /dev/null
+++ b/spec/form_builders/translatable_form_builder_spec.rb
@@ -0,0 +1,46 @@
+require "rails_helper"
+
+describe TranslatableFormBuilder do
+ before do
+ dummy_banner = Class.new(ApplicationRecord) do
+ def self.name
+ "DummyBanner"
+ end
+ self.table_name = "banners"
+
+ translates :title, touch: true
+ include Globalizable
+ has_many :translations, class_name: "DummyBanner::Translation", foreign_key: "banner_id"
+ end
+
+ stub_const("DummyBanner", dummy_banner)
+ end
+
+ let(:builder) do
+ TranslatableFormBuilder.new(:dummy, DummyBanner.new, ApplicationController.new.view_context, {})
+ end
+
+ describe "#translatable_fields" do
+ it "renders fields for the enabled locales when the translation interface is enabled" do
+ Setting["feature.translation_interface"] = true
+ Setting["locales.enabled"] = "en fr"
+
+ builder.translatable_fields do |translations_builder|
+ render translations_builder.text_field :title
+ end
+
+ expect(page).to have_field "Title", count: 2
+ end
+ end
+
+ attr_reader :content
+
+ def render(content)
+ @content ||= ""
+ @content << content
+ end
+
+ def page
+ Capybara::Node::Simple.new(content)
+ end
+end
diff --git a/spec/models/budget/content_block_spec.rb b/spec/models/budget/content_block_spec.rb
index 543035e6e..4ffbd1ca4 100644
--- a/spec/models/budget/content_block_spec.rb
+++ b/spec/models/budget/content_block_spec.rb
@@ -20,6 +20,14 @@ describe Budget::ContentBlock do
expect(valid_block).to be_valid
end
+ it "is not valid with a disabled locale" do
+ Setting["locales.enabled"] = "nl pt-BR"
+
+ block.locale = "en"
+
+ expect(block).not_to be_valid
+ end
+
describe "#name" do
it "uses the heading name" do
block = Budget::ContentBlock.new(heading: Budget::Heading.new(name: "Central"))
diff --git a/spec/models/i18n_content_spec.rb b/spec/models/i18n_content_spec.rb
index 6fe557ae6..e3a38816a 100644
--- a/spec/models/i18n_content_spec.rb
+++ b/spec/models/i18n_content_spec.rb
@@ -160,6 +160,16 @@ RSpec.describe I18nContent do
end
it "does not store new keys for disabled translations" do
+ Setting["locales.enabled"] = "es"
+
+ I18nContent.update([{ id: "shared.yes", values: { "value_en" => "Oh, yeah" }}])
+
+ expect(I18nContent.all).to be_empty
+ end
+
+ it "uses different enabled translations when given a parameter" do
+ Setting["locales.enabled"] = "en es"
+
I18nContent.update([{ id: "shared.yes", values: { "value_en" => "Oh, yeah" }}], [:es])
expect(I18nContent.all).to be_empty
diff --git a/spec/models/setting_spec.rb b/spec/models/setting_spec.rb
index d31c4ef3c..5df0fd8bc 100644
--- a/spec/models/setting_spec.rb
+++ b/spec/models/setting_spec.rb
@@ -258,4 +258,50 @@ describe Setting do
expect(Setting.force_presence_postal_code?).to be true
end
end
+
+ describe ".available_locales" do
+ before { allow(I18n).to receive(:available_locales).and_return(%i[de en es pt-BR]) }
+
+ it "uses I18n available locales by default" do
+ Setting["locales.enabled"] = ""
+
+ expect(Setting.enabled_locales).to eq %i[de en es pt-BR]
+ end
+
+ it "defines available locales with a space-separated list" do
+ Setting["locales.enabled"] = "de es"
+
+ expect(Setting.enabled_locales).to eq %i[de es]
+ end
+
+ it "handles locales which include a dash" do
+ Setting["locales.enabled"] = "de en pt-BR"
+
+ expect(Setting.enabled_locales).to eq %i[de en pt-BR]
+ end
+
+ it "ignores extra whitespace between locales" do
+ Setting["locales.enabled"] = " de en pt-BR "
+
+ expect(Setting.enabled_locales).to eq %i[de en pt-BR]
+ end
+
+ it "ignores locales which aren't available" do
+ Setting["locales.enabled"] = "de es en-US fr zh-CN"
+
+ expect(Setting.enabled_locales).to eq %i[de es]
+ end
+
+ it "ignores words that don't make sense in this context" do
+ Setting["locales.enabled"] = "yes es 1234 en SuperCool"
+
+ expect(Setting.enabled_locales).to eq %i[es en]
+ end
+
+ it "uses I18n available locales when no locale is available" do
+ Setting["locales.enabled"] = "nl fr zh-CN"
+
+ expect(Setting.enabled_locales).to eq %i[de en es pt-BR]
+ end
+ end
end
diff --git a/spec/models/site_customization/content_block_spec.rb b/spec/models/site_customization/content_block_spec.rb
index a61753f12..3be09e812 100644
--- a/spec/models/site_customization/content_block_spec.rb
+++ b/spec/models/site_customization/content_block_spec.rb
@@ -27,4 +27,12 @@ RSpec.describe SiteCustomization::ContentBlock do
block.name = "top_links"
expect(block).not_to be_valid
end
+
+ it "is not valid with a disabled locale" do
+ Setting["locales.enabled"] = "nl pt-BR"
+
+ block.locale = "en"
+
+ expect(block).not_to be_valid
+ end
end