1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * Redistributions of files must retain the above copyright notice.
8: *
9: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
10: * @link https://cakephp.org CakePHP(tm) Project
11: * @since 3.3.0
12: * @license https://opensource.org/licenses/mit-license.php MIT License
13: */
14: namespace Cake\I18n\Middleware;
15:
16: use Cake\I18n\I18n;
17: use Locale;
18: use Psr\Http\Message\ResponseInterface;
19: use Psr\Http\Message\ServerRequestInterface;
20:
21: /**
22: * Sets the runtime default locale for the request based on the
23: * Accept-Language header. The default will only be set if it
24: * matches the list of passed valid locales.
25: */
26: class LocaleSelectorMiddleware
27: {
28: /**
29: * List of valid locales for the request
30: *
31: * @var array
32: */
33: protected $locales = [];
34:
35: /**
36: * Constructor.
37: *
38: * @param array $locales A list of accepted locales, or ['*'] to accept any
39: * locale header value.
40: */
41: public function __construct(array $locales = [])
42: {
43: $this->locales = $locales;
44: }
45:
46: /**
47: * @param ServerRequestInterface $request The request.
48: * @param ResponseInterface $response The response.
49: * @param callable $next The next middleware to call.
50: * @return \Psr\Http\Message\ResponseInterface A response.
51: */
52: public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
53: {
54: $locale = Locale::acceptFromHttp($request->getHeaderLine('Accept-Language'));
55: if (!$locale) {
56: return $next($request, $response);
57: }
58: if ($this->locales !== ['*']) {
59: $locale = Locale::lookup($this->locales, $locale, true);
60: }
61: if ($locale || $this->locales === ['*']) {
62: I18n::setLocale($locale);
63: }
64:
65: return $next($request, $response);
66: }
67: }
68: