Changed lang configuration option
This commit is contained in:
parent
29dd38feb9
commit
3cd5dfbcec
11 changed files with 77 additions and 24 deletions
|
@ -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,15 +80,15 @@ 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 {
|
||||
unset($config['lang']);
|
||||
$this->database->query('UPDATE `settings` SET `value`=? WHERE `key` = \'lang\'', param($request, 'lang'));
|
||||
}
|
||||
} else {
|
||||
$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')]));
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
app/Middleware/LangMiddleware.php
Normal file
29
app/Middleware/LangMiddleware.php
Normal file
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -72,6 +72,15 @@ class Lang
|
|||
return self::$lang;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param $lang
|
||||
*/
|
||||
public static function setLang($lang)
|
||||
{
|
||||
self::$lang = $lang;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue