From 822150f858559dc264a0796254330c0166cdf556 Mon Sep 17 00:00:00 2001 From: juniwalk Date: Fri, 13 Feb 2026 13:38:16 +0100 Subject: [PATCH 1/3] Added new Cookie locale resolver --- src/LocalesResolvers/Cookie.php | 58 +++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/LocalesResolvers/Cookie.php diff --git a/src/LocalesResolvers/Cookie.php b/src/LocalesResolvers/Cookie.php new file mode 100644 index 0000000..6e203fe --- /dev/null +++ b/src/LocalesResolvers/Cookie.php @@ -0,0 +1,58 @@ +httpRequest = $httpRequest; + $this->httpResponse = $httpResponse; + } + + public function setLocale( + ?string $locale, + ?string $expire = null, + ): self + { + if (is_string($locale)) { + $this->httpResponse->setCookie(self::$parameter, $locale, $expire ?? self::$expire); + + } else { + $this->httpResponse->deleteCookie(self::$parameter); + + } + + return $this; + } + + public function resolve( + Translator $translator, + ): ?string + { + $locale = $this->httpRequest->getCookie(self::$parameter); + + if (is_string($locale)) { + return $locale; + } + + return null; + } + +} From d6ced46000aad46d5b8ba666d27ced7647ec5948 Mon Sep 17 00:00:00 2001 From: juniwalk Date: Fri, 13 Feb 2026 14:39:55 +0100 Subject: [PATCH 2/3] Added test for new CookieResolver --- tests/Tests/LocalesResolvers/CookieTest.phpt | 68 ++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/Tests/LocalesResolvers/CookieTest.phpt diff --git a/tests/Tests/LocalesResolvers/CookieTest.phpt b/tests/Tests/LocalesResolvers/CookieTest.phpt new file mode 100644 index 0000000..9bb7a6e --- /dev/null +++ b/tests/Tests/LocalesResolvers/CookieTest.phpt @@ -0,0 +1,68 @@ +resolve(null)); + Assert::same('cs', $this->resolve('cs')); + Assert::same('en', $this->resolve('en')); + Assert::null($this->resolve(null)); + } + + private function resolve( + ?string $locale + ): ?string + { + $response = Mockery::mock(IResponse::class); + $response->shouldReceive('setCookie')->andReturnUsing(function ($name, $value) { + self::$cookies[$name] = $value; + self::$cookies = array_filter(self::$cookies); + }); + $response->shouldReceive('deleteCookie')->andReturnUsing(function ($name) { + unset(self::$cookies[$name]); + }); + + $request = Mockery::mock(IRequest::class); + $request->shouldReceive('getCookie')->andReturnUsing(function ($name) { + return self::$cookies[$name] ?? null; + }); + + $resolver = new Cookie( + $request, + $response, + ); + + $translator = new Translator( + new LocaleResolver($this->container), + new FallbackResolver(), + 'en' + ); + + $resolver->setLocale($locale); + + return $resolver->resolve($translator); + } + +} + +(new CookieTest($container))->run(); From 400dc116e552cb810b2de70413aaae4bc2ea24a3 Mon Sep 17 00:00:00 2001 From: juniwalk Date: Fri, 13 Feb 2026 14:43:31 +0100 Subject: [PATCH 3/3] Remove nullable from self::$expire to fix phpstan issue --- src/LocalesResolvers/Cookie.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LocalesResolvers/Cookie.php b/src/LocalesResolvers/Cookie.php index 6e203fe..1953de0 100644 --- a/src/LocalesResolvers/Cookie.php +++ b/src/LocalesResolvers/Cookie.php @@ -11,7 +11,7 @@ class Cookie implements ResolverInterface public static string $parameter = 'locale'; - public static ?string $expire = '+1 year'; + public static string $expire = '+1 year'; private IRequest $httpRequest;