Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions src/LocalesResolvers/Cookie.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php declare(strict_types=1);

namespace Contributte\Translation\LocalesResolvers;

use Contributte\Translation\Translator;
use Nette\Http\IRequest;
use Nette\Http\IResponse;

class Cookie implements ResolverInterface
{

public static string $parameter = 'locale';

public static string $expire = '+1 year';

private IRequest $httpRequest;

private IResponse $httpResponse;

public function __construct(
IRequest $httpRequest,
IResponse $httpResponse,
)
{
$this->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;
}

}
68 changes: 68 additions & 0 deletions tests/Tests/LocalesResolvers/CookieTest.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php declare(strict_types = 1);

namespace Tests\LocalesResolvers;

use Contributte\Translation\FallbackResolver;
use Contributte\Translation\LocaleResolver;
use Contributte\Translation\LocalesResolvers\Cookie;
use Contributte\Translation\Translator;
use Mockery;
use Nette\Http\IRequest;
use Nette\Http\IResponse;
use Tester\Assert;
use Tests\TestAbstract;

$container = require __DIR__ . '/../../bootstrap.php';

final class CookieTest extends TestAbstract
{

private static array $cookies;

public function test01(): void
{
self::$cookies = [];

Assert::null($this->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();