Browse Source

Changed lang configuration option

Sergio Brighenti 5 years ago
parent
commit
3cd5dfbcec

+ 9 - 7
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', '<?php'.PHP_EOL.'return '.var_export($config, true).';');
-
         $this->session->alert(lang('lang_set', [param($request, 'lang')]));
 
         return redirect($response, route('system'));

+ 2 - 2
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

+ 3 - 2
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);

+ 29 - 0
app/Middleware/LangMiddleware.php

@@ -0,0 +1,29 @@
+<?php
+
+
+namespace App\Middleware;
+
+
+use Psr\Http\Message\ResponseInterface as Response;
+use Psr\Http\Message\ServerRequestInterface as Request;
+use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
+
+class LangMiddleware extends Middleware
+{
+
+    /**
+     * @param  Request  $request
+     * @param  RequestHandler  $handler
+     * @return Response
+     */
+    public function __invoke(Request $request, RequestHandler $handler)
+    {
+        $forcedLang = $this->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);
+    }
+}

+ 9 - 0
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
      */

+ 15 - 2
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

+ 2 - 0
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

+ 1 - 5
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),

+ 1 - 0
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

+ 4 - 4
resources/templates/comp/navbar.twig

@@ -7,23 +7,23 @@
         <div class="collapse navbar-collapse" id="navbarCollapse">
             <ul class="navbar-nav mr-auto">
                 <li class="nav-item">
-                    <a href="{{ route('home') }}" class="nav-link {{ request.uri.path starts with '/home' ? 'active' }}"><i class="fas fa-fw fa-home"></i>
+                    <a href="{{ route('home') }}" class="nav-link {{ inPath(request.uri.path, '/home') ? 'active' }}"><i class="fas fa-fw fa-home"></i>
                         {{ lang('home') }}
                     </a>
                 </li>
                 <li class="nav-item">
-                    <a href="{{ route('upload') }}" class="nav-link {{ request.uri.path starts with '/upload' ? 'active' }}"><i class="fas fa-fw fa-upload"></i>
+                    <a href="{{ route('upload') }}" class="nav-link {{ inPath(request.uri.path, '/upload') ? 'active' }}"><i class="fas fa-fw fa-upload"></i>
                         {{ lang('upload') }}
                     </a>
                 </li>
                 {% if session.get('admin') %}
                     <li class="nav-item">
-                        <a href="{{ route('user.index') }}" class="nav-link {{ request.uri.path starts with '/user' ? 'active' }}"><i class="fas fa-fw fa-users"></i>
+                        <a href="{{ route('user.index') }}" class="nav-link {{ inPath(request.uri.path, '/users') ? 'active' }}"><i class="fas fa-fw fa-users"></i>
                             {{ lang('users') }}
                         </a>
                     </li>
                     <li class="nav-item">
-                        <a href="{{ route('system') }}" class="nav-link {{ request.uri.path starts with '/system' ? 'active' }}"><i class="fas fa-fw fa-cog"></i>
+                        <a href="{{ route('system') }}" class="nav-link {{ inPath(request.uri.path, '/system') ? 'active' }}"><i class="fas fa-fw fa-cog"></i>
                             {{ lang('system') }}
                         </a>
                     </li>

+ 2 - 2
resources/templates/dashboard/system.twig

@@ -86,9 +86,9 @@
                                     <div class="form-group row">
                                         <div class="col-sm-12">
                                             <select class="form-control" id="lang" name="lang">
-                                                <option value="auto" selected>({{ lang('auto_set') }})</option>
+                                                <option value="auto">({{ lang('auto_set') }})</option>
                                                 {% for lang, name in installed_lang %}
-                                                    <option value="{{ lang }}">{{ name }}</option>
+                                                    <option value="{{ lang }}"{{ forced_lang == lang ? ' selected' }}>{{ name }}</option>
                                                 {% endfor %}
                                             </select>
                                             <small>{{ lang('default_lang_behavior') }}</small>