From 6c20570d2a4c6cb698d0a08dbcb86ecc2a25a131 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Mon, 27 Jul 2026 11:16:14 +0200 Subject: Pin admin content reads to the default locale --- app/controllers/admin_controller.rb | 1 + app/controllers/assets_controller.rb | 1 + .../concerns/pinned_to_default_locale.rb | 22 ++++++++++++++++++++++ app/controllers/events_controller.rb | 3 ++- app/controllers/node_actions_controller.rb | 1 + app/controllers/nodes_controller.rb | 7 +------ app/controllers/otp_enrollments_controller.rb | 2 ++ app/controllers/related_assets_controller.rb | 2 ++ app/controllers/revisions_controller.rb | 1 + app/controllers/users_controller.rb | 1 + 10 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 app/controllers/concerns/pinned_to_default_locale.rb (limited to 'app') diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 2b35fd20..3b8b3582 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -1,4 +1,5 @@ class AdminController < ApplicationController + include PinnedToDefaultLocale # Private diff --git a/app/controllers/assets_controller.rb b/app/controllers/assets_controller.rb index f1c259e3..988d56d1 100644 --- a/app/controllers/assets_controller.rb +++ b/app/controllers/assets_controller.rb @@ -1,4 +1,5 @@ class AssetsController < ApplicationController + include PinnedToDefaultLocale # Private diff --git a/app/controllers/concerns/pinned_to_default_locale.rb b/app/controllers/concerns/pinned_to_default_locale.rb new file mode 100644 index 00000000..6c7fb900 --- /dev/null +++ b/app/controllers/concerns/pinned_to_default_locale.rb @@ -0,0 +1,22 @@ +# Chrome locale and content locale are separate concerns, and in the +# admin they must not touch. Globalize.locale falls back to +# I18n.locale when unset, so without this pin a visit to /en/admin +# would silently switch every Page and MenuItem read to its English +# translation. +# +# Translation editors are the exception and select their locale from +# params, not from the chrome. They nest their own +# Globalize.with_locale inside this one, which wins. +module PinnedToDefaultLocale + extend ActiveSupport::Concern + + included do + around_action :pin_to_default_locale + end + + private + + def pin_to_default_locale + Globalize.with_locale(I18n.default_locale) { yield } + end +end diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index f2c710bd..a322181d 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -1,5 +1,6 @@ class EventsController < ApplicationController - + include PinnedToDefaultLocale + # Private before_action :login_required diff --git a/app/controllers/node_actions_controller.rb b/app/controllers/node_actions_controller.rb index 0f547732..f20bdb7d 100644 --- a/app/controllers/node_actions_controller.rb +++ b/app/controllers/node_actions_controller.rb @@ -1,4 +1,5 @@ class NodeActionsController < ApplicationController + include PinnedToDefaultLocale before_action :login_required diff --git a/app/controllers/nodes_controller.rb b/app/controllers/nodes_controller.rb index 2a2cde33..4ac3d99a 100644 --- a/app/controllers/nodes_controller.rb +++ b/app/controllers/nodes_controller.rb @@ -1,4 +1,5 @@ class NodesController < ApplicationController + include PinnedToDefaultLocale # Private @@ -18,8 +19,6 @@ class NodesController < ApplicationController :restore_from_trash ] - around_action :pin_to_default_locale, :only => [:show, :edit, :update, :autosave] - def index @nodes = Node.root.descendants.includes(:head, :draft) .order('id DESC') @@ -295,10 +294,6 @@ class NodesController < ApplicationController end end - def pin_to_default_locale - Globalize.with_locale(I18n.default_locale) { yield } - end - def descendant_counts_for(ordered_with_level) counts = Hash.new(0) stack = [] # [node, level, index] diff --git a/app/controllers/otp_enrollments_controller.rb b/app/controllers/otp_enrollments_controller.rb index 54b82214..82fc98dc 100644 --- a/app/controllers/otp_enrollments_controller.rb +++ b/app/controllers/otp_enrollments_controller.rb @@ -2,6 +2,8 @@ # an administrator must never hold another account's secret -- admins get # the witnessed reset on the user page instead. class OtpEnrollmentsController < ApplicationController + include PinnedToDefaultLocale + before_action :login_required layout 'admin' diff --git a/app/controllers/related_assets_controller.rb b/app/controllers/related_assets_controller.rb index 3aa6d3db..ef6cbe56 100644 --- a/app/controllers/related_assets_controller.rb +++ b/app/controllers/related_assets_controller.rb @@ -1,4 +1,6 @@ class RelatedAssetsController < ApplicationController + include PinnedToDefaultLocale + before_action :login_required before_action :find_node diff --git a/app/controllers/revisions_controller.rb b/app/controllers/revisions_controller.rb index 9f920b03..cddb9e72 100644 --- a/app/controllers/revisions_controller.rb +++ b/app/controllers/revisions_controller.rb @@ -1,4 +1,5 @@ class RevisionsController < ApplicationController + include PinnedToDefaultLocale # Private diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 12531d86..cb71db23 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,4 +1,5 @@ class UsersController < ApplicationController + include PinnedToDefaultLocale # Private -- cgit v1.3