diff --git a/src/Middleware/DetectLocaleMiddleware.php b/src/Middleware/DetectLocaleMiddleware.php index 83426d38..e2cb6fa9 100644 --- a/src/Middleware/DetectLocaleMiddleware.php +++ b/src/Middleware/DetectLocaleMiddleware.php @@ -96,29 +96,31 @@ class DetectLocaleMiddleware implements HTTPMiddleware */ public function process(HTTPRequest $request, callable $delegate) { - $state = FluentState::singleton(); - $locale = $state->getLocale(); - - if (!$locale) { - $locale = $this->getLocale($request); - $state->setLocale($locale); - } - - // Validate the user is allowed to access this locale - $this->validateAllowedLocale($state); - - if ($locale && $state->getIsFrontend()) { - i18n::set_locale($state->getLocale()); - } - - // Persist the current locale if it has a value. - // Distinguishes null from empty strings in order to unset locales. - $newLocale = $state->getLocale(); - if (!is_null($newLocale)) { - $this->setPersistLocale($request, $newLocale); - } - - return $delegate($request); + return FluentState::singleton() + ->withState(function ($state) use ($delegate, $request) { + $locale = $state->getLocale(); + + if (!$locale) { + $locale = $this->getLocale($request); + $state->setLocale($locale); + } + + // Validate the user is allowed to access this locale + $this->validateAllowedLocale($state); + + if ($locale && $state->getIsFrontend()) { + i18n::set_locale($state->getLocale()); + } + + // Persist the current locale if it has a value. + // Distinguishes null from empty strings in order to unset locales. + $newLocale = $state->getLocale(); + if (!is_null($newLocale)) { + $this->setPersistLocale($request, $newLocale); + } + + return $delegate($request); + }); } /** diff --git a/src/Middleware/InitStateMiddleware.php b/src/Middleware/InitStateMiddleware.php index 49f33c33..e30ac8c5 100644 --- a/src/Middleware/InitStateMiddleware.php +++ b/src/Middleware/InitStateMiddleware.php @@ -8,7 +8,6 @@ use SilverStripe\Control\Middleware\HTTPMiddleware; use SilverStripe\Core\Config\Configurable; use SilverStripe\Core\Environment; -use SilverStripe\Core\Injector\Injector; use TractorCow\Fluent\Extension\FluentDirectorExtension; use TractorCow\Fluent\Model\Domain; use TractorCow\Fluent\State\FluentState; @@ -33,31 +32,30 @@ class InitStateMiddleware implements HTTPMiddleware public function process(HTTPRequest $request, callable $delegate) { - $state = FluentState::create(); - Injector::inst()->registerService($state); - - // Detect frontend - $isFrontend = $this->getIsFrontend($request); - - // Only set domain mode on the frontend - $isDomainMode = $isFrontend ? $this->getIsDomainMode($request) : false; - - // Don't set domain unless in domain mode - $domain = $isDomainMode ? Director::host($request) : null; - - // Update state - $state - ->setIsFrontend($isFrontend) - ->setIsDomainMode($isDomainMode) - ->setDomain($domain); - - return $delegate($request); + return FluentState::singleton() + ->withState(function ($state) use ($delegate, $request) { + // Detect frontend + $isFrontend = $this->getIsFrontend($request); + + // Only set domain mode on the frontend + $isDomainMode = $isFrontend ? $this->getIsDomainMode($request) : false; + + // Don't set domain unless in domain mode + $domain = $isDomainMode ? Director::host($request) : null; + // Update state + $state + ->setIsFrontend($isFrontend) + ->setIsDomainMode($isDomainMode) + ->setDomain($domain); + + return $delegate($request); + }); } /** * Determine whether the website is being viewed from the frontend or not * - * @param HTTPRequest $request + * @param HTTPRequest $request * @return bool */ public function getIsFrontend(HTTPRequest $request) @@ -83,7 +81,7 @@ public function getIsFrontend(HTTPRequest $request) /** * Determine whether the website is running in domain segmentation mode * - * @param HTTPRequest $request + * @param HTTPRequest $request * @return bool */ public function getIsDomainMode(HTTPRequest $request) diff --git a/src/State/FluentState.php b/src/State/FluentState.php index aa6887cb..b8970121 100644 --- a/src/State/FluentState.php +++ b/src/State/FluentState.php @@ -5,6 +5,7 @@ use InvalidArgumentException; use SilverStripe\Core\Injector\Injectable; use SilverStripe\Core\Injector\Injector; +use SilverStripe\i18n\i18n; /** * Stores the current fluent state @@ -145,11 +146,13 @@ public function setIsFrontend($isFrontend) public function withState(callable $callback) { $newState = clone $this; + $oldLocale = i18n::get_locale(); // Backup locale in case the callback modifies this try { Injector::inst()->registerService($newState); return $callback($newState); } finally { Injector::inst()->registerService($this); + i18n::set_locale($oldLocale); } } }