diff --git a/app/Controllers/AdminController.php b/app/Controllers/AdminController.php index 7ada958..6269ba5 100644 --- a/app/Controllers/AdminController.php +++ b/app/Controllers/AdminController.php @@ -11,6 +11,7 @@ class AdminController extends Controller { /** + * @param Request $request * @param Response $response * @return Response * @throws FileNotFoundException @@ -18,7 +19,7 @@ class AdminController extends Controller * @throws \Twig\Error\RuntimeError * @throws \Twig\Error\SyntaxError */ - public function system(Response $response): Response + public function system(Request $request, Response $response): Response { $usersCount = $this->database->query('SELECT COUNT(*) AS `count` FROM `users`')->fetch()->count; $mediasCount = $this->database->query('SELECT COUNT(*) AS `count` FROM `uploads`')->fetch()->count; @@ -41,6 +42,7 @@ class AdminController extends Controller 'post_max_size' => ini_get('post_max_size'), 'upload_max_filesize' => ini_get('upload_max_filesize'), 'installed_lang' => $this->lang->getList(), + 'forced_lang' => $request->getAttribute('forced_lang') ]); } @@ -78,16 +80,16 @@ class AdminController extends Controller */ public function applyLang(Request $request, Response $response): Response { - $config = require BASE_DIR.'config.php'; - if (param($request, 'lang') !== 'auto') { - $config['lang'] = param($request, 'lang'); + if (!$this->database->query('SELECT `value` FROM `settings` WHERE `key` = \'lang\'')->fetch()) { + $this->database->query('INSERT INTO `settings`(`key`, `value`) VALUES (\'lang\', ?)', param($request, 'lang')); + } else { + $this->database->query('UPDATE `settings` SET `value`=? WHERE `key` = \'lang\'', param($request, 'lang')); + } } else { - unset($config['lang']); + $this->database->query('DELETE FROM `settings` WHERE `key` = \'lang\''); } - file_put_contents(BASE_DIR.'config.php', 'session->alert(lang('lang_set', [param($request, 'lang')])); return redirect($response, route('system')); diff --git a/app/Controllers/Controller.php b/app/Controllers/Controller.php index 9e701b3..e67b77e 100644 --- a/app/Controllers/Controller.php +++ b/app/Controllers/Controller.php @@ -5,6 +5,7 @@ namespace App\Controllers; use App\Database\DB; use App\Web\Lang; use App\Web\Session; +use App\Web\View; use DI\Container; use DI\DependencyException; use DI\NotFoundException; @@ -14,11 +15,10 @@ use Monolog\Logger; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Exception\HttpNotFoundException; use Slim\Exception\HttpUnauthorizedException; -use Twig\Environment; /** * @property Session|null session - * @property Environment view + * @property View view * @property DB|null database * @property Logger|null logger * @property Filesystem|null storage diff --git a/app/Factories/ViewFactory.php b/app/Factories/ViewFactory.php index 2ebef52..32edf9c 100644 --- a/app/Factories/ViewFactory.php +++ b/app/Factories/ViewFactory.php @@ -26,7 +26,7 @@ class ViewFactory 'auto_reload' => $config['debug'], ]); - $request = ServerRequestCreatorFactory::create()->createServerRequestFromGlobals(); + $request = ServerRequestCreatorFactory::determineServerRequestCreator()->createServerRequestFromGlobals(); $twig->addGlobal('config', $config); $twig->addGlobal('request', $request); @@ -42,6 +42,7 @@ class ViewFactory $twig->addFunction(new TwigFunction('mime2font', 'mime2font')); $twig->addFunction(new TwigFunction('queryParams', 'queryParams')); $twig->addFunction(new TwigFunction('isDisplayableImage', 'isDisplayableImage')); + $twig->addFunction(new TwigFunction('inPath', 'inPath')); return new View($twig); } @@ -57,7 +58,7 @@ class ViewFactory 'auto_reload' => $config['debug'], ]); - $request = ServerRequestCreatorFactory::create()->createServerRequestFromGlobals(); + $request = ServerRequestCreatorFactory::determineServerRequestCreator()->createServerRequestFromGlobals(); $twig->addGlobal('config', $config); $twig->addGlobal('request', $request); diff --git a/app/Middleware/LangMiddleware.php b/app/Middleware/LangMiddleware.php new file mode 100644 index 0000000..fc0417b --- /dev/null +++ b/app/Middleware/LangMiddleware.php @@ -0,0 +1,29 @@ +database->query('SELECT `value` FROM `settings` WHERE `key` = \'lang\'')->fetch(); + if ($forcedLang) { + $this->lang::setLang($forcedLang->value); + $request = $request->withAttribute('forced_lang', $forcedLang->value); + } + + return $handler->handle($request); + } +} \ No newline at end of file diff --git a/app/Web/Lang.php b/app/Web/Lang.php index b052729..6ce38c6 100644 --- a/app/Web/Lang.php +++ b/app/Web/Lang.php @@ -72,6 +72,15 @@ class Lang return self::$lang; } + + /** + * @param $lang + */ + public static function setLang($lang) + { + self::$lang = $lang; + } + /** * @return array */ diff --git a/app/helpers.php b/app/helpers.php index 102d137..1f6c7ba 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -352,8 +352,7 @@ if (!function_exists('queryParams')) { */ function queryParams(array $replace = []) { - $serverRequestCreator = ServerRequestCreatorFactory::create(); - $request = $serverRequestCreator->createServerRequestFromGlobals(); + $request = ServerRequestCreatorFactory::determineServerRequestCreator()->createServerRequestFromGlobals(); $params = array_replace_recursive($request->getQueryParams(), $replace); @@ -361,6 +360,20 @@ if (!function_exists('queryParams')) { } } +if (!function_exists('inPath')) { + /** + * Check if uri start with a path + * @param string $uri + * @param string $path + * @return bool + */ + function inPath(string $uri, string $path): bool + { + $path = parse_url(urlFor($path), PHP_URL_PATH); + return substr($uri, 0, strlen($uri)) === $path; + } +} + if (!function_exists('glob_recursive')) { /** * Does not support flag GLOB_BRACE diff --git a/bootstrap/app.php b/bootstrap/app.php index 7f8bc89..d304fb9 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -4,6 +4,7 @@ use App\Exception\Handlers\AppErrorHandler; use App\Exception\Handlers\Renderers\HtmlErrorRenderer; use App\Factories\ViewFactory; use App\Middleware\InjectMiddleware; +use App\Middleware\LangMiddleware; use App\Middleware\RememberMiddleware; use App\Web\View; use DI\Bridge\Slim\Bridge; @@ -67,6 +68,7 @@ if (!$config['debug']) { } $app->add(InjectMiddleware::class); +$app->add(LangMiddleware::class); $app->add(RememberMiddleware::class); // Permanently redirect paths with a trailing slash to their non-trailing counterpart diff --git a/bootstrap/container.php b/bootstrap/container.php index d5a7a1c..f35f55b 100644 --- a/bootstrap/container.php +++ b/bootstrap/container.php @@ -91,11 +91,7 @@ return [ }), 'storage' => get(Filesystem::class), - Lang::class => factory(function (Container $container) { - $config = $container->get('config'); - if (isset($config['lang'])) { - return Lang::build($config['lang'], BASE_DIR.'resources/lang/'); - } + Lang::class => factory(function () { return Lang::build(Lang::recognize(), BASE_DIR.'resources/lang/'); }), 'lang' => get(Lang::class), diff --git a/install/index.php b/install/index.php index f960c2c..054c696 100644 --- a/install/index.php +++ b/install/index.php @@ -204,6 +204,7 @@ $app->post('/', function (Request $request, Response $response, Filesystem $stor // if is upgrading and existing installation, put it out maintenance if ($installed) { unset($config['maintenance']); + unset($config['lang']); } // Finally write the config diff --git a/resources/templates/comp/navbar.twig b/resources/templates/comp/navbar.twig index 078ba18..5b34560 100644 --- a/resources/templates/comp/navbar.twig +++ b/resources/templates/comp/navbar.twig @@ -7,23 +7,23 @@