diff --git a/CHANGELOG.md b/CHANGELOG.md index bd39c7df..8636678d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,25 @@ -# v1.9.0-beta.7 +# v1.9.0-beta.8 ## mm/dd/2018 +1. [](#improved) + * Implemented [ForkAwesome](https://forkawesome.github.io/Fork-Awesome/) and removed FontAwesome + LineAwesome + * Unset state from user if not super or user admin + * Make new System Config layout responsive [#1579](https://github.com/getgrav/grav-plugin-admin/issues/1579) + * Take admin setting for 2FA into account when showing user 2FA badge [#1568](https://github.com/getgrav/grav-plugin-admin/issues/1568) + * v.1.8.16 fixes merged in +1. [](#bugfix) + * Removed `tabs`, `tab`, and `toggle` fields as they are now in Form plugin + * Fix issue with new page always showing modular page templates [#1573](https://github.com/getgrav/grav-plugin-admin/issues/1573) + * Fixed issue deleting files in plugins/themes/config + +# v1.9.0-beta.7 +## 12/14/2018 + 1. [](#bugfix) * Fixed user login / remember me triggering before admin gets initialized + * Fixed a bug when deleting files via AJAX + * Fixed error page not to be the frontend version + * Added `merge_items` option for `field.selectize` to allow storing custom items [#1461](https://github.com/getgrav/grav-plugin-admin/issues/1461) # v1.9.0-beta.6 ## 11/12/2018 @@ -55,6 +72,21 @@ * New `Backups` configuration panel in tools * New `Cache::purge()` option in cache drop-down to clear out old cache only +# v1.8.16 +## mm/dd/2019 + +1. [](#bugfix) + * Fixed calendar js module not properly loading for datetime field [#1581](https://github.com/getgrav/grav-plugin-admin/issues/1581) + * Fixed deleting file when using file field type [#1558](https://github.com/getgrav/grav-plugin-admin/issues/1558) + +# v1.8.15 +## 12/14/2018 + +1. [](#improved) + * Fire `onAdminSave()` event during `AdminController::taskSaveAs()` [#1544](https://github.com/getgrav/grav-plugin-admin/issues/1544) +1. [](#bugfix) + * Clean user post to ensure dynamically added form fields are not saved + # v1.8.14 ## 11/12/2018 @@ -86,7 +118,7 @@ 1. [](#improved) * Change usage of basename where possible [#1480](https://github.com/getgrav/grav-plugin-admin/pull/1480) * Improved filename validation (requires Grav 1.5.3) - * Updated various lang strings + * Updated various lang codes 1. [](#bugfix) * File Uploads: Do not trust mimetype sent by the browser * Fixed file extension detection diff --git a/admin.php b/admin.php index f1361a24..1c1f0a03 100644 --- a/admin.php +++ b/admin.php @@ -8,6 +8,7 @@ use Grav\Common\Language\Language; use Grav\Common\Page\Page; use Grav\Common\Page\Pages; use Grav\Common\Plugin; +use Grav\Common\Session; use Grav\Common\Uri; use Grav\Common\Utils; use Grav\Common\User\User; @@ -19,7 +20,6 @@ use Grav\Plugin\Admin\Twig\AdminTwigExtension; use Grav\Plugin\Form\Form; use Grav\Plugin\Login\Login; use RocketTheme\Toolbox\Event\Event; -use RocketTheme\Toolbox\Session\Session; class AdminPlugin extends Plugin { @@ -230,8 +230,8 @@ class AdminPlugin extends Plugin $inflector = new Inflector(); - $data['fullname'] = isset($data['fullname']) ? $data['fullname'] : $inflector->titleize($username); - $data['title'] = isset($data['title']) ? $data['title'] : 'Administrator'; + $data['fullname'] = $data['fullname'] ?? $inflector->titleize($username); + $data['title'] = $data['title'] ?? 'Administrator'; $data['state'] = 'enabled'; $data['access'] = ['admin' => ['login' => true, 'super' => true], 'site' => ['login' => true]]; @@ -327,14 +327,14 @@ class AdminPlugin extends Plugin // Set original route for the home page. $home = '/' . trim($this->config->get('system.home.alias'), '/'); - // set the default if not set before - $this->session->expert = $this->session->expert ?: false; - // set session variable if it's passed via the url if ($this->uri->param('mode') === 'expert') { $this->session->expert = true; } elseif ($this->uri->param('mode') === 'normal') { $this->session->expert = false; + } else { + // set the default if not set before + $this->session->expert = $this->session->expert ?? false; } /** @var Pages $pages */ @@ -361,7 +361,7 @@ class AdminPlugin extends Plugin Pages::types(); // Handle tasks. - $this->admin->task = $task = !empty($post['task']) ? $post['task'] : $this->uri->param('task'); + $this->admin->task = $task = $this->grav['task']; if ($task) { $this->initializeController($task, $post); } elseif ($this->template === 'logs' && $this->route) { @@ -424,13 +424,19 @@ class AdminPlugin extends Plugin if (empty($this->grav['page'])) { if ($this->grav['user']->authenticated) { $event = $this->grav->fireEvent('onPageNotFound'); + /** @var Page $page */ + $page = $event->page; - if (isset($event->page)) { - unset($this->grav['page']); - $this->grav['page'] = $event->page; - } else { - throw new \RuntimeException('Page Not Found', 404); + if (!$page || !$page->routable()) { + $error_file = $this->grav['locator']->findResource('plugins://admin/pages/admin/error.md'); + $page = new Page; + $page->init(new \SplFileInfo($error_file)); + $page->slug(basename($this->route)); + $page->routable(true); } + + unset($this->grav['page']); + $this->grav['page'] = $page; } else { // Not Found and not logged in: Display login page. $login_file = $this->grav['locator']->findResource('plugins://admin/pages/admin/login.md'); @@ -487,6 +493,7 @@ class AdminPlugin extends Plugin $theme_url = '/' . ltrim($this->grav['locator']->findResource('plugin://admin/themes/' . $this->theme, false), '/'); $twig->twig_vars['theme_url'] = $theme_url; + $twig->twig_vars['preset_url'] = $twig->twig_vars['preset_url'] ?? $theme_url; $twig->twig_vars['base_url'] = $twig->twig_vars['base_url_relative']; $twig->twig_vars['base_path'] = GRAV_ROOT; $twig->twig_vars['admin'] = $this->admin; @@ -577,15 +584,6 @@ class AdminPlugin extends Plugin 'section' => [ 'input@' => false ], - 'tab' => [ - 'input@' => false - ], - 'tabs' => [ - 'input@' => false - ], - 'key' => [ - 'input@' => false - ], 'list' => [ 'array' => true ], @@ -605,6 +603,7 @@ class AdminPlugin extends Plugin $this->enable([ 'onTwigExtensions' => ['onTwigExtensions', 1000], 'onPagesInitialized' => ['onPagesInitialized', 1000], + 'onTwigLoader' => ['onTwigLoader', 1000], 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 1000], 'onTwigSiteVariables' => ['onTwigSiteVariables', 1000], 'onAssetsInitialized' => ['onAssetsInitialized', 1000], @@ -649,7 +648,7 @@ class AdminPlugin extends Plugin // Double check we have system.yaml, site.yaml etc $config_path = $this->grav['locator']->findResource('user://config'); - foreach ($this->admin->configurations() as $config_file) { + foreach ($this->admin::configurations() as $config_file) { $config_file = "{$config_path}/{$config_file}.yaml"; if (!file_exists($config_file)) { touch($config_file); @@ -740,7 +739,7 @@ class AdminPlugin extends Plugin foreach ($strings as $string) { $separator = (end($strings) === $string) ? '' : ','; - $translations .= '"' . $string . '": "' . htmlspecialchars($this->admin->translate('PLUGIN_ADMIN.' . $string)) . '"' . $separator; + $translations .= '"' . $string . '": "' . htmlspecialchars($this->admin::translate('PLUGIN_ADMIN.' . $string)) . '"' . $separator; } $translations .= '};'; @@ -749,7 +748,7 @@ class AdminPlugin extends Plugin $strings = ['RESOLUTION_MIN', 'RESOLUTION_MAX']; foreach ($strings as $string) { $separator = (end($strings) === $string) ? '' : ','; - $translations .= '"' . $string . '": "' . $this->admin->translate('PLUGIN_FORM.' . $string) . '"' . $separator; + $translations .= '"' . $string . '": "' . $this->admin::translate('PLUGIN_FORM.' . $string) . '"' . $separator; } $translations .= '};'; @@ -783,7 +782,7 @@ class AdminPlugin extends Plugin ]; foreach ($strings as $string) { $separator = (end($strings) === $string) ? '' : ','; - $translations .= '"' . $string . '": ' . json_encode($this->admin->translate('GRAV.'.$string)) . $separator; + $translations .= '"' . $string . '": ' . json_encode($this->admin::translate('GRAV.'.$string)) . $separator; } $translations .= '};'; @@ -793,6 +792,15 @@ class AdminPlugin extends Plugin $assets->addInlineJs($translations); } + // Add images to twig template paths to allow inclusion of SVG files + public function onTwigLoader() + { + $theme_paths = Grav::instance()['locator']->findResources('plugins://admin/themes/' . $this->theme . '/images'); + foreach($theme_paths as $images_path) { + $this->grav['twig']->addPath($images_path, 'admin-images'); + } + } + /** * Add the Admin Twig Extensions */ @@ -877,12 +885,10 @@ class AdminPlugin extends Plugin public function onOutputGenerated() { - // Clear flash objects for previously uploaded files - // whenever the user switches page / reloads + // Clear flash objects for previously uploaded files whenever the user switches page or reloads // ignoring any JSON / extension call if ($this->admin->task !== 'save' && empty($this->uri->extension())) { - // Discard any previously uploaded files session. - // and if there were any uploaded file, remove them from the filesystem + // Discard any previously uploaded files session and remove all uploaded files. if ($flash = $this->session->getFlashObject('files-upload')) { $flash = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($flash)); foreach ($flash as $key => $value) { @@ -918,6 +924,7 @@ class AdminPlugin extends Plugin 'admin.statistics' => 'boolean', 'admin.plugins' => 'boolean', 'admin.themes' => 'boolean', + 'admin.tools' => 'boolean', 'admin.users' => 'boolean', ]; $admin->addPermissions($permissions); diff --git a/blueprints.yaml b/blueprints.yaml index d1dcbb3c..e6d49a0e 100644 --- a/blueprints.yaml +++ b/blueprints.yaml @@ -1,5 +1,5 @@ name: Admin Panel -version: 1.9.0-beta.6 +version: 1.9.0-beta.7 testing: true description: Adds an advanced administration panel to manage your site icon: empire @@ -14,8 +14,8 @@ docs: https://github.com/getgrav/grav-plugin-admin/blob/develop/README.md license: MIT dependencies: - - { name: grav, version: '>=1.6.0-beta.4' } - - { name: form, version: '>=3.0.0-beta.1' } + - { name: grav, version: '>=1.6.0-beta.8' } + - { name: form, version: '>=3.0.0-beta.5' } - { name: login, version: '>=2.7.0' } - { name: email, version: '>=2.7.0' } @@ -163,6 +163,18 @@ form: label: Parents Levels size: small help: The number of levels to show in parent select list + + pages.show_modular: + type: toggle + label: Modular parents + hightlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + help: Show modular pages in the parent select list google_fonts: type: toggle @@ -176,15 +188,6 @@ form: type: bool help: Use Google custom fonts. Disable this to use Helvetica. Useful when using Cyrillic and other languages with unsupported characters. - admin_icons: - type: select - size: medium - label: Icon Style - default: line-awesome - options: - line-awesome: Lighter Line Icons (LineAwesome) - font-awesome: Darker Solid Icons (FontAwesome) - show_beta_msg: type: hidden diff --git a/classes/admin.php b/classes/admin.php index 94055722..8bfeb276 100644 --- a/classes/admin.php +++ b/classes/admin.php @@ -368,9 +368,12 @@ class Admin $rateLimiter = $login->getRateLimiter('login_attempts'); - $userKey = isset($credentials['username']) ? (string)$credentials['username'] : ''; + $userKey = (string)($credentials['username'] ?? ''); $ipKey = Uri::ip(); - $redirect = isset($post['redirect']) ? $post['redirect'] : $this->base . $this->route; + $redirect = $post['redirect'] ?? $this->base . $this->route; + + // Pseudonymization of the IP + $ipKey = sha1($ipKey . $this->grav['config']->get('security.salt')); // Check if the current IP has been used in failed login attempts. $attempts = count($rateLimiter->getAttempts($ipKey, 'ip')); @@ -379,7 +382,7 @@ class Admin // Check rate limit for both IP and user, but allow each IP a single try even if user is already rate limited. if ($rateLimiter->isRateLimited($ipKey, 'ip') || ($attempts && $rateLimiter->isRateLimited($userKey))) { - $this->setMessage($this->translate(['PLUGIN_LOGIN.TOO_MANY_LOGIN_ATTEMPTS', $rateLimiter->getInterval()]), 'error'); + $this->setMessage(static::translate(['PLUGIN_LOGIN.TOO_MANY_LOGIN_ATTEMPTS', $rateLimiter->getInterval()]), 'error'); $this->grav->redirect('/'); } @@ -397,7 +400,7 @@ class Admin if ($user->authorized) { $event->defMessage('PLUGIN_ADMIN.LOGIN_LOGGED_IN', 'info'); - $event->defRedirect(isset($post['redirect']) ? $post['redirect'] : $redirect); + $event->defRedirect($post['redirect'] ?? $redirect); } else { $this->session->redirect = $redirect; } @@ -413,7 +416,7 @@ class Admin $message = $event->getMessage(); if ($message) { - $this->setMessage($this->translate($message), $event->getMessageType()); + $this->setMessage(static::translate($message), $event->getMessageType()); } $redirect = $event->getRedirect(); @@ -433,9 +436,9 @@ class Admin $twoFa = $login->twoFactorAuth(); $user = $this->grav['user']; - $code = isset($data['2fa_code']) ? $data['2fa_code'] : null; + $code = $data['2fa_code'] ?? null; - $secret = isset($user->twofa_secret) ? $user->twofa_secret : null; + $secret = $user->twofa_secret ?? null; if (!$code || !$secret || !$twoFa->verifyCode($secret, $code)) { $login->logout(['admin' => true]); @@ -455,7 +458,7 @@ class Admin /** * Logout from admin. */ - public function Logout($data, $post) + public function logout($data, $post) { /** @var Login $login */ $login = $this->grav['login']; @@ -601,7 +604,7 @@ class Admin if (!$post) { $post = $this->grav['uri']->post(); - $post = isset($post['data']) ? $post['data'] : []; + $post = $post['data'] ?? []; } // Check to see if a data type is plugin-provided, before looking into core ones @@ -609,7 +612,9 @@ class Admin if ($event) { if (isset($event['data_type'])) { return $event['data_type']; - } elseif (is_string($event['type'])) { + } + + if (is_string($event['type'])) { $type = $event['type']; } } @@ -647,12 +652,12 @@ class Admin $data[$type] = $obj; } elseif (preg_match('|users/|', $type)) { $obj = User::load(preg_replace('|users/|', '', $type)); - $obj->merge($post); + $obj->merge($this->cleanUserPost($post)); $data[$type] = $obj; } elseif (preg_match('|user/|', $type)) { $obj = User::load(preg_replace('|user/|', '', $type)); - $obj->merge($post); + $obj->merge($this->cleanUserPost($post)); $data[$type] = $obj; } elseif (preg_match('|config/|', $type)) { @@ -697,6 +702,26 @@ class Admin return $data[$type]; } + /** + * Clean user form post and remove extra stuff that may be passed along + * + * @param $post + * @return array + */ + protected function cleanUserPost($post) + { + // Clean fields for all users + unset($post['hashed_password']); + + // Clean field for users who shouldn't be able to modify these fields + if (!$this->authorize(['admin.user', 'admin.super'])) { + unset($post['access']); + unset($post['state']); + } + + return $post; + } + protected function hasErrorMessage() { $msgs = $this->grav['messages']->all(); @@ -1058,7 +1083,7 @@ class Admin */ public function lastBackup() { - $file = JsonFile::instance($this->grav['locator']->findResource("log://backup.log")); + $file = JsonFile::instance($this->grav['locator']->findResource('log://backup.log')); $content = $file->content(); if (empty($content)) { return [ @@ -1381,9 +1406,9 @@ class Admin return $found_fields; } - public function getPagePathFromToken($path) + public function getPagePathFromToken($path, $page = null) { - return Utils::getPagePathFromToken($path, $this->page(true)); + return Utils::getPagePathFromToken($path, $page ?: $this->page(true)); } /** @@ -1477,7 +1502,7 @@ class Admin } } } - if ($data['visible'] == 1 && !$page->order()) { + if ((int)$data['visible'] === 1 && !$page->order()) { $header['visible'] = $data['visible']; } @@ -1498,14 +1523,10 @@ class Admin $page->frontmatter(Yaml::dump((array)$page->header(), 20)); } else { // Find out the type by looking at the parent. - $type = $parent->childType() - ? $parent->childType() - : $parent->blueprints()->get('child_type', - 'default'); + $type = $parent->childType() ?: $parent->blueprints()->get('child_type', 'default'); $page->name($type . CONTENT_EXT); $page->header(); } - $page->modularTwig($slug[0] === '_'); } return $page; @@ -1554,8 +1575,10 @@ class Admin /** * Get the files list * + * @param bool $filtered + * @param int $page_index + * @return array|null * @todo allow pagination - * @return array */ public function files($filtered = true, $page_index = 0) { @@ -1672,7 +1695,7 @@ class Admin * * @return array */ - private function getMediaOfType($type, Page $page = null, array $files) + private function getMediaOfType($type, ?Page $page, array $files) { if ($page) { $media = $page->media(); @@ -1815,6 +1838,6 @@ class Admin */ public function getReferrer() { - return isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null; + return $_SERVER['HTTP_REFERER'] ?? null; } } diff --git a/classes/adminbasecontroller.php b/classes/adminbasecontroller.php index 1fabac01..d4f135b4 100644 --- a/classes/adminbasecontroller.php +++ b/classes/adminbasecontroller.php @@ -2,12 +2,11 @@ namespace Grav\Plugin\Admin; use Grav\Common\Config\Config; -use Grav\Common\Data\Data; use Grav\Common\Filesystem\Folder; use Grav\Common\Grav; use Grav\Common\Media\Interfaces\MediaInterface; use Grav\Common\Page\Media; -use Grav\Common\Page\Pages; +use Grav\Common\Uri; use Grav\Common\Utils; use Grav\Common\Plugin; use Grav\Common\Theme; @@ -115,7 +114,7 @@ class AdminBaseController } // Grab redirect parameter. - $redirect = isset($this->post['_redirect']) ? $this->post['_redirect'] : null; + $redirect = $this->post['_redirect'] ?? null; unset($this->post['_redirect']); // Redirect if requested. @@ -138,7 +137,7 @@ class AdminBaseController if (!$nonce || !Utils::verifyNonce($nonce, 'admin-form')) { if ($this->task === 'addmedia') { - $message = sprintf($this->admin->translate('PLUGIN_ADMIN.FILE_TOO_LARGE', null), + $message = sprintf($this->admin::translate('PLUGIN_ADMIN.FILE_TOO_LARGE', null), ini_get('post_max_size')); //In this case it's more likely that the image is too big than POST can handle. Show message @@ -150,10 +149,10 @@ class AdminBaseController return false; } - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN'), 'error'); $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN') + 'message' => $this->admin::translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN') ]; return false; @@ -163,11 +162,11 @@ class AdminBaseController if ($this->task === 'logout') { $nonce = $this->grav['uri']->param('logout-nonce'); if (null === $nonce || !Utils::verifyNonce($nonce, 'logout-form')) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN'), + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN'), 'error'); $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN') + 'message' => $this->admin::translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN') ]; return false; @@ -175,11 +174,11 @@ class AdminBaseController } else { $nonce = $this->grav['uri']->param('admin-nonce'); if (null === $nonce || !Utils::verifyNonce($nonce, 'admin-form')) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN'), + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN'), 'error'); $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN') + 'message' => $this->admin::translate('PLUGIN_ADMIN.INVALID_SECURITY_TOKEN') ]; return false; @@ -257,7 +256,7 @@ class AdminBaseController if (!Utils::checkFilename($filename)) { $this->admin->json_response = [ 'status' => 'error', - 'message' => sprintf($this->admin->translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_UPLOAD', null), + 'message' => sprintf($this->admin::translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_UPLOAD', null), $filename, 'Bad filename') ]; @@ -267,7 +266,7 @@ class AdminBaseController if (!isset($settings->destination)) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.DESTINATION_NOT_SPECIFIED', null) + 'message' => $this->admin::translate('PLUGIN_ADMIN.DESTINATION_NOT_SPECIFIED', null) ]; return false; @@ -277,7 +276,7 @@ class AdminBaseController if ($this->view !== 'pages' && in_array($settings->destination, ['@self', 'self@', '@self@'])) { $this->admin->json_response = [ 'status' => 'error', - 'message' => sprintf($this->admin->translate('PLUGIN_ADMIN.FILEUPLOAD_PREVENT_SELF', null), + 'message' => sprintf($this->admin::translate('PLUGIN_ADMIN.FILEUPLOAD_PREVENT_SELF', null), $settings->destination) ]; @@ -288,8 +287,8 @@ class AdminBaseController if ($upload->file->error !== UPLOAD_ERR_OK) { $this->admin->json_response = [ 'status' => 'error', - 'message' => sprintf($this->admin->translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_UPLOAD', null), - $upload->file->name, $this->upload_errors[$upload->file->error]) + 'message' => sprintf($this->admin::translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_UPLOAD', null), + $filename, $this->upload_errors[$upload->file->error]) ]; return false; @@ -300,7 +299,7 @@ class AdminBaseController if ($settings->filesize > 0 && $upload->file->size > $settings->filesize) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.EXCEEDED_GRAV_FILESIZE_LIMIT') + 'message' => $this->admin::translate('PLUGIN_ADMIN.EXCEEDED_GRAV_FILESIZE_LIMIT') ]; return false; @@ -312,7 +311,7 @@ class AdminBaseController $errors = []; // Do not trust mimetype sent by the browser - $mime = Utils::getMimeByFilename($upload->file->name); + $mime = Utils::getMimeByFilename($filename); foreach ((array)$settings->accept as $type) { // Force acceptance of any file when star notation @@ -327,15 +326,15 @@ class AdminBaseController if ($isMime) { $match = preg_match('#' . $find . '$#', $mime); if (!$match) { - $errors[] = 'The MIME type "' . $mime . '" for the file "' . $upload->file->name . '" is not an accepted.'; + $errors[] = 'The MIME type "' . $mime . '" for the file "' . $filename . '" is not an accepted.'; } else { $accepted = true; break; } } else { - $match = preg_match('#' . $find . '$#', $upload->file->name); + $match = preg_match('#' . $find . '$#', $filename); if (!$match) { - $errors[] = 'The File Extension for the file "' . $upload->file->name . '" is not an accepted.'; + $errors[] = 'The File Extension for the file "' . $filename . '" is not an accepted.'; } else { $accepted = true; break; @@ -366,7 +365,7 @@ class AdminBaseController if (!move_uploaded_file($tmp_file, $tmp)) { $this->admin->json_response = [ 'status' => 'error', - 'message' => sprintf($this->admin->translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_MOVE', null), '', + 'message' => sprintf($this->admin::translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_MOVE', null), '', $tmp) ]; @@ -451,10 +450,10 @@ class AdminBaseController if ($this->grav['uri']->extension() === 'json') { $this->admin->json_response = [ 'status' => 'unauthorized', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' ' . $task . '.' + 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' ' . $task . '.' ]; } else { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' ' . $task . '.', + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' ' . $task . '.', 'error'); } @@ -551,7 +550,7 @@ class AdminBaseController */ public function taskFilesSessionRemove() { - if (!$this->authorizeTask('save', $this->dataPermissions()) || !isset($_FILES)) { + if (!$this->authorizeTask('save', $this->dataPermissions())) { return false; } @@ -731,7 +730,6 @@ class AdminBaseController */ protected function storeFiles($obj) { - // FIXME: Add support for latest form plugin // Process previously uploaded files for the current URI // and finally store them. Everything else will get discarded $queue = $this->admin->session()->getFlashObject('files-upload'); @@ -751,7 +749,7 @@ class AdminBaseController $keys = explode('.', preg_replace('/^header./', '', $key)); $init_key = array_shift($keys); if (count($keys) > 0) { - $new_data = isset($obj->header()->{$init_key}) ? $obj->header()->{$init_key} : []; + $new_data = $obj->header()->{$init_key} ?? []; Utils::setDotNotation($new_data, implode('.', $keys), $files, true); } else { $new_data = $files; @@ -805,7 +803,7 @@ class AdminBaseController if (!$data instanceof MediaInterface) { $this->admin->json_response = [ 'status' => 'error', - 'message' => sprintf($this->admin->translate('PLUGIN_ADMIN.FILEUPLOAD_PREVENT_SELF', null), $folder) + 'message' => sprintf($this->admin::translate('PLUGIN_ADMIN.FILEUPLOAD_PREVENT_SELF', null), $folder) ]; return false; @@ -905,22 +903,51 @@ class AdminBaseController */ protected function taskRemoveFileFromBlueprint() { + /** @var Uri $uri */ $uri = $this->grav['uri']; $blueprint = base64_decode($uri->param('blueprint')); $path = base64_decode($uri->param('path')); + $filename = basename($this->post['filename'] ?? ''); $proute = base64_decode($uri->param('proute')); $type = $uri->param('type'); $field = $uri->param('field'); + if ($filename === '') { + $this->admin->json_response = [ + 'status' => 'error', + 'message' => 'Filename is empty' + ]; + + return false; + } + // Get Blueprint - $settings = (object) $this->admin->blueprints($blueprint)->schema()->getProperty($field); + if ($type === 'pages' || strpos($blueprint, 'pages/') === 0) { + $page = $this->admin->page(true, $proute); + if (!$page) { + $this->admin->json_response = [ + 'status' => 'error', + 'message' => 'Page not found' + ]; + + return false; + } + $blueprints = $page->blueprints(); + $path = Folder::getRelativePath($page->path()); + $settings = (object)$blueprints->schema()->getProperty($field); + } else { + $page = null; + $obj = $this->grav[$type]->get(Utils::substrToString($blueprint, '/')); + $settings = (object)$obj->blueprints()->schema()->getProperty($field); + } // Get destination if ($this->grav['locator']->isStream($settings->destination)) { $destination = $this->grav['locator']->findResource($settings->destination, false, true); + } else { $destination = Folder::getRelativePath(rtrim($settings->destination, '/')); - $destination = $this->admin->getPagePathFromToken($destination); + $destination = $this->admin->getPagePathFromToken($destination, $page); } // Not in path @@ -934,10 +961,9 @@ class AdminBaseController } // Only remove files from correct destination... - $this->taskRemoveMedia($destination . '/' . basename($path)); + $this->taskRemoveMedia($destination . '/' . $filename); - if ($type === 'pages') { - $page = $this->admin->page(true, $proute); + if ($page) { $keys = explode('.', preg_replace('/^header./', '', $field)); $header = (array)$page->header(); $data_path = implode('.', $keys); @@ -985,7 +1011,7 @@ class AdminBaseController $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.REMOVE_SUCCESSFUL') + 'message' => $this->admin::translate('PLUGIN_ADMIN.REMOVE_SUCCESSFUL') ]; return true; @@ -1002,7 +1028,7 @@ class AdminBaseController return false; } - if (is_null($filename)) { + if (null === $filename) { $filename = base64_decode($this->grav['uri']->param('route')); if (!$filename) { $filename = base64_decode($this->route); @@ -1031,10 +1057,10 @@ class AdminBaseController if ($this->grav['uri']->extension() === 'json') { $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.REMOVE_SUCCESSFUL') + 'message' => $this->admin::translate('PLUGIN_ADMIN.REMOVE_SUCCESSFUL') ]; } else { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.REMOVE_SUCCESSFUL'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.REMOVE_SUCCESSFUL'), 'info'); $this->clearMediaCache(); $this->setRedirect('/media-manager'); } @@ -1045,10 +1071,10 @@ class AdminBaseController if ($this->grav['uri']->extension() === 'json') { $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.REMOVE_FAILED') + 'message' => $this->admin::translate('PLUGIN_ADMIN.REMOVE_FAILED') ]; } else { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.REMOVE_FAILED'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.REMOVE_FAILED'), 'error'); } return false; diff --git a/classes/admincontroller.php b/classes/admincontroller.php index 69b161de..78a4d666 100644 --- a/classes/admincontroller.php +++ b/classes/admincontroller.php @@ -34,67 +34,6 @@ use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator; */ class AdminController extends AdminBaseController { - /** - * @var Grav - */ - public $grav; - - /** - * @var string - */ - public $view; - - /** - * @var string - */ - public $task; - - /** - * @var string - */ - public $route; - - /** - * @var array - */ - public $post; - - /** - * @var array|null - */ - public $data; - - /** - * @var Admin - */ - protected $admin; - - /** - * @var string - */ - protected $redirect; - - /** - * @var \Grav\Common\Uri $uri - */ - protected $uri; - - /** - * @var int - */ - protected $redirectCode; - - protected $upload_errors = [ - 0 => "There is no error, the file uploaded with success", - 1 => "The uploaded file exceeds the max upload size", - 2 => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML", - 3 => "The uploaded file was only partially uploaded", - 4 => "No file was uploaded", - 6 => "Missing a temporary folder", - 7 => "Failed to write file to disk", - 8 => "A PHP extension stopped the file upload" - ]; - /** * @param Grav $grav * @param string $view @@ -106,7 +45,7 @@ class AdminController extends AdminBaseController { $this->grav = $grav; $this->view = $view; - $this->task = $task ? $task : 'display'; + $this->task = $task ?: 'display'; if (isset($post['data'])) { $this->data = $this->getPost($post['data']); unset($post['data']); @@ -207,15 +146,15 @@ class AdminController extends AdminBaseController if (isset($data['password'])) { $username = isset($data['username']) ? strip_tags(strtolower($data['username'])) : null; $user = $username ? User::load($username) : null; - $password = isset($data['password']) ? $data['password'] : null; - $token = isset($data['token']) ? $data['token'] : null; + $password = $data['password'] ?? null; + $token = $data['token'] ?? null; if ($user && $user->exists() && !empty($user->reset)) { list($good_token, $expire) = explode('::', $user->reset); if ($good_token === $token) { if (time() > $expire) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_LINK_EXPIRED'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.RESET_LINK_EXPIRED'), 'error'); $this->setRedirect('/forgot'); return true; @@ -228,14 +167,14 @@ class AdminController extends AdminBaseController $user->filter(); $user->save(); - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_PASSWORD_RESET'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.RESET_PASSWORD_RESET'), 'info'); $this->setRedirect('/'); return true; } } - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_INVALID_LINK'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.RESET_INVALID_LINK'), 'error'); $this->setRedirect('/forgot'); return true; @@ -246,13 +185,13 @@ class AdminController extends AdminBaseController $token = $this->grav['uri']->param('token'); if (empty($user) || empty($token)) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_INVALID_LINK'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.RESET_INVALID_LINK'), 'error'); $this->setRedirect('/forgot'); return true; } - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_NEW_PASSWORD'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.RESET_NEW_PASSWORD'), 'info'); $this->admin->forgot = ['username' => $user, 'token' => $token]; @@ -263,7 +202,6 @@ class AdminController extends AdminBaseController * Handle the email password recovery procedure. * * @return bool True if the action was performed. - * @todo LOGIN */ protected function taskForgot() { @@ -276,14 +214,14 @@ class AdminController extends AdminBaseController $user = !empty($username) ? User::load($username) : null; if (!isset($this->grav['Email'])) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_EMAIL_NOT_CONFIGURED'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.FORGOT_EMAIL_NOT_CONFIGURED'), 'error'); $this->setRedirect($post['redirect']); return true; } if (!$user || !$user->exists()) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL'), + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL'), 'info'); $this->setRedirect($post['redirect']); @@ -291,7 +229,7 @@ class AdminController extends AdminBaseController } if (empty($user->email)) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL'), + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL'), 'info'); $this->setRedirect($post['redirect']); @@ -302,7 +240,7 @@ class AdminController extends AdminBaseController $interval =$this->grav['config']->get('plugins.login.max_pw_resets_interval', 2); if ($login->isUserRateLimited($user, 'pw_resets', $count, $interval)) { - $this->admin->setMessage($this->admin->translate(['PLUGIN_LOGIN.FORGOT_CANNOT_RESET_IT_IS_BLOCKED', $user->email, $interval]), 'error'); + $this->admin->setMessage($this->admin::translate(['PLUGIN_LOGIN.FORGOT_CANNOT_RESET_IT_IS_BLOCKED', $user->email, $interval]), 'error'); $this->setRedirect($post['redirect']); return true; @@ -323,7 +261,7 @@ class AdminController extends AdminBaseController $from = $this->grav['config']->get('plugins.email.from'); if (empty($from)) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_EMAIL_NOT_CONFIGURED'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.FORGOT_EMAIL_NOT_CONFIGURED'), 'error'); $this->setRedirect($post['redirect']); return true; @@ -331,8 +269,8 @@ class AdminController extends AdminBaseController $to = $user->email; - $subject = $this->admin->translate(['PLUGIN_ADMIN.FORGOT_EMAIL_SUBJECT', $sitename]); - $content = $this->admin->translate([ + $subject = $this->admin::translate(['PLUGIN_ADMIN.FORGOT_EMAIL_SUBJECT', $sitename]); + $content = $this->admin::translate([ 'PLUGIN_ADMIN.FORGOT_EMAIL_BODY', $fullname, $reset_link, @@ -347,9 +285,9 @@ class AdminController extends AdminBaseController $sent = $this->grav['Email']->send($message); if ($sent < 1) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_FAILED_TO_EMAIL'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.FORGOT_FAILED_TO_EMAIL'), 'error'); } else { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL'), + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL'), 'info'); } @@ -379,7 +317,7 @@ class AdminController extends AdminBaseController $obj->save(); $this->post = ['_redirect' => 'plugins']; - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_ENABLED_PLUGIN'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.SUCCESSFULLY_ENABLED_PLUGIN'), 'info'); return true; } @@ -420,7 +358,7 @@ class AdminController extends AdminBaseController $obj->save(); $this->post = ['_redirect' => 'plugins']; - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_DISABLED_PLUGIN'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.SUCCESSFULLY_DISABLED_PLUGIN'), 'info'); return true; } @@ -458,7 +396,7 @@ class AdminController extends AdminBaseController $config->set('system.pages.theme', $name); - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_CHANGED_THEME'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.SUCCESSFULLY_CHANGED_THEME'), 'info'); return true; } @@ -483,14 +421,14 @@ class AdminController extends AdminBaseController 'status' => 'success', 'type' => 'updategrav', 'version' => $version, - 'message' => $this->admin->translate('PLUGIN_ADMIN.GRAV_WAS_SUCCESSFULLY_UPDATED_TO') . ' ' . $version + 'message' => $this->admin::translate('PLUGIN_ADMIN.GRAV_WAS_SUCCESSFULLY_UPDATED_TO') . ' ' . $version ]; } else { $json_response = [ 'status' => 'error', 'type' => 'updategrav', 'version' => GRAV_VERSION, - 'message' => $this->admin->translate('PLUGIN_ADMIN.GRAV_UPDATE_FAILED') . '
' . Installer::lastErrorMsg() + 'message' => $this->admin::translate('PLUGIN_ADMIN.GRAV_UPDATE_FAILED') . '
' . Installer::lastErrorMsg() ]; } @@ -516,9 +454,9 @@ class AdminController extends AdminBaseController $result = Gpm::uninstall($package, []); if ($result) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.UNINSTALL_SUCCESSFUL'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.UNINSTALL_SUCCESSFUL'), 'info'); } else { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.UNINSTALL_FAILED'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.UNINSTALL_FAILED'), 'error'); } $this->post = ['_redirect' => $this->view]; @@ -545,7 +483,7 @@ class AdminController extends AdminBaseController $path = $this->grav['page']->find($data['route'])->path(); } - $orderOfNewFolder = $this->getNextOrderInFolder($path); + $orderOfNewFolder = static::getNextOrderInFolder($path); $new_path = $path . '/' . $orderOfNewFolder . '.' . $data['folder']; Folder::create($new_path); @@ -553,7 +491,7 @@ class AdminController extends AdminBaseController $this->grav->fireEvent('onAdminAfterSaveAs', new Event(['path' => $new_path])); - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_SAVED'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.SUCCESSFULLY_SAVED'), 'info'); $multilang = $this->isMultilang(); $admin_route = $this->admin->base; @@ -617,13 +555,13 @@ class AdminController extends AdminBaseController // Special handler for user data. if ($this->view === 'user') { if (!$this->grav['user']->exists()) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.NO_USER_EXISTS'),'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.NO_USER_EXISTS'),'error'); return false; } if (!$this->admin->authorize(['admin.super', 'admin.users'])) { // no user file or not admin.super or admin.users if ($this->prepareData($data)->username !== $this->grav['user']->username) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' save.','error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' save.','error'); return false; } } @@ -650,7 +588,7 @@ class AdminController extends AdminBaseController // Check for valid frontmatter if (isset($data['frontmatter']) && !$this->checkValidFrontmatter($data['frontmatter'])) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INVALID_FRONTMATTER_COULD_NOT_SAVE'), + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.INVALID_FRONTMATTER_COULD_NOT_SAVE'), 'error'); return false; } @@ -658,10 +596,10 @@ class AdminController extends AdminBaseController // XSS Checks for page content $xss_whitelist = $this->grav['config']->get('security.xss_whitelist', 'admin.super'); if (!$this->admin->authorize($xss_whitelist)) { - $check_what = ['header' => isset($data['header']) ? $data['header'] : '', 'frontmatter' => isset($data['frontmatter']) ? $data['frontmatter'] : '', 'content' => isset($data['content']) ? $data['content'] : '']; + $check_what = ['header' => $data['header'] ?? '', 'frontmatter' => $data['frontmatter'] ?? '', 'content' => $data['content'] ?? '']; $results = Security::detectXssFromArray($check_what); if (!empty($results)) { - $this->admin->setMessage(' ' . $this->admin->translate('PLUGIN_ADMIN.XSS_ONSAVE_ISSUE'), + $this->admin->setMessage(' ' . $this->admin::translate('PLUGIN_ADMIN.XSS_ONSAVE_ISSUE'), 'error'); return false; } @@ -697,7 +635,7 @@ class AdminController extends AdminBaseController // add or remove numeric prefix based on ordering value if (isset($data['ordering'])) { if ($data['ordering'] && !$obj->order()) { - $obj->order($this->getNextOrderInFolder($obj->parent()->path())); + $obj->order(static::getNextOrderInFolder($obj->parent()->path())); $reorder = false; } elseif (!$data['ordering'] && $obj->order()) { $obj->folder($obj->slug()); @@ -725,7 +663,7 @@ class AdminController extends AdminBaseController // Event to manipulate data before saving the object $this->grav->fireEvent('onAdminSave', new Event(['object' => &$obj])); $obj->save($reorder); - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_SAVED'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.SUCCESSFULLY_SAVED'), 'info'); $this->grav->fireEvent('onAdminAfterSave', new Event(['object' => $obj])); } @@ -942,7 +880,7 @@ class AdminController extends AdminBaseController } $data = $this->post; - $flush = (isset($data['flush']) && $data['flush'] == true) ? true : false; + $flush = !empty($data['flush']); if (isset($this->grav['session'])) { $this->grav['session']->close(); @@ -952,7 +890,7 @@ class AdminController extends AdminBaseController $gpm = new GravGPM($flush); $resources_updates = $gpm->getUpdatable(); - if ($gpm->grav != null) { + if ($gpm->grav !== null) { $grav_updates = [ 'isUpdatable' => $gpm->grav->isUpdatable(), 'assets' => $gpm->grav->getAssets(), @@ -1102,12 +1040,12 @@ class AdminController extends AdminBaseController $packages = isset($data['packages']) ? explode(',', $data['packages']) : ''; $packages = (array)$packages; - $type = isset($data['type']) ? $data['type'] : ''; + $type = $data['type'] ?? ''; if (!$this->authorizeTask('install ' . $type, ['admin.' . $type, 'admin.super'])) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') + 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') ]; return false; @@ -1128,7 +1066,7 @@ class AdminController extends AdminBaseController } else { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INSTALLATION_FAILED') + 'message' => $this->admin::translate('PLUGIN_ADMIN.INSTALLATION_FAILED') ]; } @@ -1138,13 +1076,13 @@ class AdminController extends AdminBaseController protected function taskInstallPackage($reinstall = false) { $data = $this->post; - $package = isset($data['package']) ? $data['package'] : ''; - $type = isset($data['type']) ? $data['type'] : ''; + $package = $data['package'] ?? ''; + $type = $data['type'] ?? ''; if (!$this->authorizeTask('install ' . $type, ['admin.' . $type, 'admin.super'])) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') + 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') ]; return false; @@ -1161,13 +1099,13 @@ class AdminController extends AdminBaseController if ($result) { $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate(is_string($result) ? $result : sprintf($this->admin->translate($reinstall ?: 'PLUGIN_ADMIN.PACKAGE_X_REINSTALLED_SUCCESSFULLY', + 'message' => $this->admin::translate(is_string($result) ? $result : sprintf($this->admin::translate($reinstall ?: 'PLUGIN_ADMIN.PACKAGE_X_REINSTALLED_SUCCESSFULLY', null), $package)) ]; } else { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate($reinstall ?: 'PLUGIN_ADMIN.INSTALLATION_FAILED') + 'message' => $this->admin::translate($reinstall ?: 'PLUGIN_ADMIN.INSTALLATION_FAILED') ]; } @@ -1182,13 +1120,13 @@ class AdminController extends AdminBaseController protected function taskRemovePackage() { $data = $this->post; - $package = isset($data['package']) ? $data['package'] : ''; - $type = isset($data['type']) ? $data['type'] : ''; + $package = $data['package'] ?? ''; + $type = $data['type'] ?? ''; if (!$this->authorizeTask('uninstall ' . $type, ['admin.' . $type, 'admin.super'])) { $json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') + 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') ]; return $this->sendJsonResponse($json_response, 403); @@ -1223,7 +1161,7 @@ class AdminController extends AdminBaseController $json_response = [ 'status' => 'success', 'dependencies' => $dependencies, - 'message' => $this->admin->translate(is_string($result) ? $result : 'PLUGIN_ADMIN.UNINSTALL_SUCCESSFUL') + 'message' => $this->admin::translate(is_string($result) ? $result : 'PLUGIN_ADMIN.UNINSTALL_SUCCESSFUL') ]; return $this->sendJsonResponse($json_response, 200); @@ -1231,7 +1169,7 @@ class AdminController extends AdminBaseController $json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.UNINSTALL_FAILED') + 'message' => $this->admin::translate('PLUGIN_ADMIN.UNINSTALL_FAILED') ]; return $this->sendJsonResponse($json_response, 200); @@ -1244,15 +1182,15 @@ class AdminController extends AdminBaseController { $data = $this->post; - $slug = isset($data['slug']) ? $data['slug'] : ''; - $type = isset($data['type']) ? $data['type'] : ''; - $package_name = isset($data['package_name']) ? $data['package_name'] : ''; - $current_version = isset($data['current_version']) ? $data['current_version'] : ''; + $slug = $data['slug'] ?? ''; + $type = $data['type'] ?? ''; + $package_name = $data['package_name'] ?? ''; + $current_version = $data['current_version'] ?? ''; if (!$this->authorizeTask('install ' . $type, ['admin.' . $type, 'admin.super'])) { $json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') + 'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') ]; $this->sendJsonResponse($json_response, 403); @@ -1265,13 +1203,13 @@ class AdminController extends AdminBaseController if ($result === true) { $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate(sprintf($this->admin->translate('PLUGIN_ADMIN.PACKAGE_X_REINSTALLED_SUCCESSFULLY', + 'message' => $this->admin::translate(sprintf($this->admin::translate('PLUGIN_ADMIN.PACKAGE_X_REINSTALLED_SUCCESSFULLY', null), $package_name)) ]; } else { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.REINSTALLATION_FAILED') + 'message' => $this->admin::translate('PLUGIN_ADMIN.REINSTALLATION_FAILED') ]; } } @@ -1307,12 +1245,12 @@ class AdminController extends AdminBaseController if (count($results) > 0) { $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.CACHE_CLEARED') . '
' . $this->admin->translate('PLUGIN_ADMIN.METHOD') . ': ' . $clear . '' + 'message' => $this->admin::translate('PLUGIN_ADMIN.CACHE_CLEARED') . '
' . $this->admin::translate('PLUGIN_ADMIN.METHOD') . ': ' . $clear . '' ]; } else { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.ERROR_CLEARING_CACHE') + 'message' => $this->admin::translate('PLUGIN_ADMIN.ERROR_CLEARING_CACHE') ]; } } @@ -1346,7 +1284,7 @@ class AdminController extends AdminBaseController $filename = $this->grav['locator']->findResource('user://data/notifications/' . $this->grav['user']->username . YAML_EXT, true, true); $file = CompiledYamlFile::instance($filename); - $data = $file->content(); + $data = (array)$file->content(); $data[] = $notification_id; $file->save($data); @@ -1390,7 +1328,7 @@ class AdminController extends AdminBaseController } catch (\Exception $e) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.AN_ERROR_OCCURRED') . '. ' . $e->getMessage() + 'message' => $this->admin::translate('PLUGIN_ADMIN.AN_ERROR_OCCURRED') . '. ' . $e->getMessage() ]; return true; @@ -1408,7 +1346,7 @@ class AdminController extends AdminBaseController $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.YOUR_BACKUP_IS_READY_FOR_DOWNLOAD') . '. ' . $this->admin->translate('PLUGIN_ADMIN.DOWNLOAD_BACKUP') . '', + 'message' => $this->admin::translate('PLUGIN_ADMIN.YOUR_BACKUP_IS_READY_FOR_DOWNLOAD') . '. ' . $this->admin::translate('PLUGIN_ADMIN.DOWNLOAD_BACKUP') . '', 'toastr' => [ 'timeOut' => 0, 'extendedTimeOut' => 0, @@ -1433,7 +1371,7 @@ class AdminController extends AdminBaseController $backup = $this->grav['uri']->param('backup', null); - if (!is_null($backup)) { + if (null !== $backup) { $file = base64_decode(urldecode($backup)); $backups_root_dir = $this->grav['locator']->findResource('backup://', true); @@ -1444,7 +1382,7 @@ class AdminController extends AdminBaseController $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.BACKUP_DELETED'), + 'message' => $this->admin::translate('PLUGIN_ADMIN.BACKUP_DELETED'), 'toastr' => [ 'closeButton' => true ] @@ -1452,7 +1390,7 @@ class AdminController extends AdminBaseController } else { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.BACKUP_NOT_FOUND'), + 'message' => $this->admin::translate('PLUGIN_ADMIN.BACKUP_NOT_FOUND'), ]; } } @@ -1467,7 +1405,7 @@ class AdminController extends AdminBaseController $data = $this->post; - $rawroute = !empty($data['rawroute']) ? $data['rawroute'] : null; + $rawroute = $data['rawroute'] ?? null; if ($rawroute) { /** @var Page $page */ @@ -1489,7 +1427,7 @@ class AdminController extends AdminBaseController $this->admin->json_response = [ 'status' => 'success', 'child_type' => '', - 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_CHILD_TYPE') + 'message' => $this->admin::translate('PLUGIN_ADMIN.NO_CHILD_TYPE') ]; return true; @@ -1570,7 +1508,7 @@ class AdminController extends AdminBaseController $pageTypes = array_keys(Pages::pageTypes()); foreach ($pageTypes as $pageType) { - if (($pageKey = array_search($pageType, $flags)) !== false) { + if (($pageKey = array_search($pageType, $flags, true)) !== false) { $types[] = $pageType; unset($flags[$pageKey]); } @@ -1592,9 +1530,10 @@ class AdminController extends AdminBaseController foreach ($collection as $page) { foreach ($queries as $query) { $query = trim($query); - if (stripos($page->getRawContent(), $query) === false && stripos($page->title(), - $query) === false && stripos($page->slug(), \Grav\Plugin\Admin\Utils::slug($query)) === false && stripos($page->folder(), - $query) === false + if (stripos($page->getRawContent(), $query) === false + && stripos($page->title(), $query) === false + && stripos($page->folder(), $query) === false + && stripos($page->slug(), \Grav\Plugin\Admin\Utils::slug($query)) === false ) { $collection->remove($page); } @@ -1609,7 +1548,7 @@ class AdminController extends AdminBaseController $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.PAGES_FILTERED'), + 'message' => $this->admin::translate('PLUGIN_ADMIN.PAGES_FILTERED'), 'results' => $results ]; $this->admin->collection = $collection; @@ -1630,7 +1569,7 @@ class AdminController extends AdminBaseController if (!$media) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND') + 'message' => $this->admin::translate('PLUGIN_ADMIN.NO_PAGE_FOUND') ]; return false; @@ -1652,7 +1591,12 @@ class AdminController extends AdminBaseController // Get original name $source = $medium->higherQualityAlternative(); - $media_list[$name] = ['url' => $medium->display($medium->get('extension') === 'svg' ? 'source' : 'thumbnail')->cropZoom(400, 300)->url(), 'size' => $medium->get('size'), 'metadata' => $metadata, 'original' => $source->get('filename')]; + $media_list[$name] = [ + 'url' => $medium->display($medium->get('extension') === 'svg' ? 'source' : 'thumbnail')->cropZoom(400, 300)->url(), + 'size' => $medium->get('size'), + 'metadata' => $metadata, + 'original' => $source->get('filename') + ]; } $this->admin->json_response = ['status' => 'success', 'results' => $media_list]; @@ -1665,7 +1609,7 @@ class AdminController extends AdminBaseController */ protected function getMedia() { - $this->uri = $this->uri ?: $this->grav['uri']; + $this->uri = $this->uri ?? $this->grav['uri']; $uri = $this->uri->post('uri'); $order = $this->uri->post('order') ?: null; @@ -1703,7 +1647,7 @@ class AdminController extends AdminBaseController if (!isset($_FILES['file']['error']) || is_array($_FILES['file']['error'])) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.INVALID_PARAMETERS') + 'message' => $this->admin::translate('PLUGIN_ADMIN.INVALID_PARAMETERS') ]; return false; @@ -1716,7 +1660,7 @@ class AdminController extends AdminBaseController case UPLOAD_ERR_NO_FILE: $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_FILES_SENT') + 'message' => $this->admin::translate('PLUGIN_ADMIN.NO_FILES_SENT') ]; return false; @@ -1724,21 +1668,21 @@ class AdminController extends AdminBaseController case UPLOAD_ERR_FORM_SIZE: $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.EXCEEDED_FILESIZE_LIMIT') + 'message' => $this->admin::translate('PLUGIN_ADMIN.EXCEEDED_FILESIZE_LIMIT') ]; return false; case UPLOAD_ERR_NO_TMP_DIR: $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.UPLOAD_ERR_NO_TMP_DIR') + 'message' => $this->admin::translate('PLUGIN_ADMIN.UPLOAD_ERR_NO_TMP_DIR') ]; return false; default: $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.UNKNOWN_ERRORS') + 'message' => $this->admin::translate('PLUGIN_ADMIN.UNKNOWN_ERRORS') ]; return false; @@ -1750,7 +1694,7 @@ class AdminController extends AdminBaseController if (!Utils::checkFilename($filename)) { $this->admin->json_response = [ 'status' => 'error', - 'message' => sprintf($this->admin->translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_UPLOAD'), + 'message' => sprintf($this->admin::translate('PLUGIN_ADMIN.FILEUPLOAD_UNABLE_TO_UPLOAD'), $filename, 'Bad filename') ]; @@ -1762,7 +1706,7 @@ class AdminController extends AdminBaseController if ($grav_limit > 0 && $_FILES['file']['size'] > $grav_limit) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.EXCEEDED_GRAV_FILESIZE_LIMIT') + 'message' => $this->admin::translate('PLUGIN_ADMIN.EXCEEDED_GRAV_FILESIZE_LIMIT') ]; return false; @@ -1776,7 +1720,7 @@ class AdminController extends AdminBaseController if (!$extension || !$config->get("media.types.{$extension}")) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.UNSUPPORTED_FILE_TYPE') . ': ' . $extension + 'message' => $this->admin::translate('PLUGIN_ADMIN.UNSUPPORTED_FILE_TYPE') . ': ' . $extension ]; return false; @@ -1787,7 +1731,7 @@ class AdminController extends AdminBaseController if (!$media) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND') + 'message' => $this->admin::translate('PLUGIN_ADMIN.NO_PAGE_FOUND') ]; return false; @@ -1801,12 +1745,10 @@ class AdminController extends AdminBaseController } // Upload it - if (!move_uploaded_file($_FILES['file']['tmp_name'], - sprintf('%s/%s', $path, $filename)) - ) { + if (!move_uploaded_file($_FILES['file']['tmp_name'], sprintf('%s/%s', $path, $filename))) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.FAILED_TO_MOVE_UPLOADED_FILE') + 'message' => $this->admin::translate('PLUGIN_ADMIN.FAILED_TO_MOVE_UPLOADED_FILE') ]; return false; @@ -1832,7 +1774,7 @@ class AdminController extends AdminBaseController $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_UPLOADED_SUCCESSFULLY'), + 'message' => $this->admin::translate('PLUGIN_ADMIN.FILE_UPLOADED_SUCCESSFULLY'), 'metadata' => $metadata, ]; @@ -1854,7 +1796,7 @@ class AdminController extends AdminBaseController if (!$media) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND') + 'message' => $this->admin::translate('PLUGIN_ADMIN.NO_PAGE_FOUND') ]; return false; @@ -1870,7 +1812,7 @@ class AdminController extends AdminBaseController if (!$filename) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_FILE_FOUND') + 'message' => $this->admin::translate('PLUGIN_ADMIN.NO_FILE_FOUND') ]; return false; @@ -1894,7 +1836,7 @@ class AdminController extends AdminBaseController if (!$result) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_COULD_NOT_BE_DELETED') . ': ' . $filename + 'message' => $this->admin::translate('PLUGIN_ADMIN.FILE_COULD_NOT_BE_DELETED') . ': ' . $filename ]; return false; @@ -1915,7 +1857,7 @@ class AdminController extends AdminBaseController if (!$result) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_COULD_NOT_BE_DELETED') . ': ' . $filename + 'message' => $this->admin::translate('PLUGIN_ADMIN.FILE_COULD_NOT_BE_DELETED') . ': ' . $filename ]; return false; @@ -1928,7 +1870,7 @@ class AdminController extends AdminBaseController if (!$found) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_NOT_FOUND') . ': ' . $filename + 'message' => $this->admin::translate('PLUGIN_ADMIN.FILE_NOT_FOUND') . ': ' . $filename ]; return false; @@ -1941,7 +1883,7 @@ class AdminController extends AdminBaseController $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_DELETED') . ': ' . $filename + 'message' => $this->admin::translate('PLUGIN_ADMIN.FILE_DELETED') . ': ' . $filename ]; return true; @@ -1964,7 +1906,7 @@ class AdminController extends AdminBaseController if (!$page) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND') + 'message' => $this->admin::translate('PLUGIN_ADMIN.NO_PAGE_FOUND') ]; return false; @@ -2040,7 +1982,7 @@ class AdminController extends AdminBaseController } } elseif ($key === 'taxonomy' && is_array($header[$key])) { foreach ($header[$key] as $taxkey => $taxonomy) { - if (is_array($taxonomy) && count($taxonomy) == 1 && trim($taxonomy[0]) == '') { + if (is_array($taxonomy) && \count($taxonomy) === 1 && trim($taxonomy[0]) === '') { unset($header[$key][$taxkey]); } } @@ -2139,7 +2081,7 @@ class AdminController extends AdminBaseController $this->grav->fireEvent('onAdminAfterSave', new Event(['page' => $page])); // Enqueue message and redirect to new location. - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_COPIED'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.SUCCESSFULLY_COPIED'), 'info'); $this->setRedirect($redirect); } catch (\Exception $e) { @@ -2161,13 +2103,13 @@ class AdminController extends AdminBaseController protected function findFirstAvailable($item, $page) { if (!$page->parent()->children()) { - return $page->$item(); + return $page->{$item}(); } $withoutPrefix = function ($string) { $match = preg_split('/^[0-9]+\./u', $string, 2, PREG_SPLIT_DELIM_CAPTURE); - return isset($match[1]) ? $match[1] : $match[0]; + return $match[1] ?? $match[0]; }; $withoutPostfix = function ($string) { @@ -2191,7 +2133,7 @@ class AdminController extends AdminBaseController &$withoutPrefix ) { foreach ($siblings as $sibling) { - if ($withoutPrefix($sibling->$item()) == ($highest === 1 ? $page_item : $page_item . '-' . $highest)) { + if ($withoutPrefix($sibling->{$item}()) == ($highest === 1 ? $page_item : $page_item . '-' . $highest)) { $highest = $findCorrectAppendedNumber($item, $page_item, $highest + 1); return $highest; @@ -2229,7 +2171,7 @@ class AdminController extends AdminBaseController return false; } - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.REORDERING_WAS_SUCCESSFUL'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.REORDERING_WAS_SUCCESSFUL'), 'info'); return true; } @@ -2264,10 +2206,10 @@ class AdminController extends AdminBaseController Cache::clearCache('standard'); - // Set redirect to either referrer or pages list. + // Set redirect to pages list. $redirect = 'pages'; - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_DELETED'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.SUCCESSFULLY_DELETED'), 'info'); $this->setRedirect($redirect); } catch (\Exception $e) { @@ -2306,7 +2248,7 @@ class AdminController extends AdminBaseController $this->grav['session']->admin_lang = $language ?: 'en'; } - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_SWITCHED_LANGUAGE'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.SUCCESSFULLY_SWITCHED_LANGUAGE'), 'info'); $admin_route = $this->admin->base; $this->setRedirect('/' . $language . $admin_route . '/' . $redirect); @@ -2323,7 +2265,7 @@ class AdminController extends AdminBaseController return false; } - $file_path = isset($this->data['file_path']) ? $this->data['file_path'] : null ; + $file_path = $this->data['file_path'] ?? null; if (isset($_FILES['uploaded_file'])) { @@ -2332,17 +2274,17 @@ class AdminController extends AdminBaseController case UPLOAD_ERR_OK: break; case UPLOAD_ERR_NO_FILE: - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.NO_FILES_SENT'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.NO_FILES_SENT'), 'error'); return false; case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.EXCEEDED_FILESIZE_LIMIT'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.EXCEEDED_FILESIZE_LIMIT'), 'error'); return false; case UPLOAD_ERR_NO_TMP_DIR: - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.UPLOAD_ERR_NO_TMP_DIR'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.UPLOAD_ERR_NO_TMP_DIR'), 'error'); return false; default: - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.UNKNOWN_ERRORS'), 'error'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.UNKNOWN_ERRORS'), 'error'); return false; } @@ -2353,7 +2295,7 @@ class AdminController extends AdminBaseController if (!Utils::checkFilename($file_name)) { $this->admin->json_response = [ 'status' => 'error', - 'message' => $this->admin->translate('PLUGIN_ADMIN.UNKNOWN_ERRORS') + 'message' => $this->admin::translate('PLUGIN_ADMIN.UNKNOWN_ERRORS') ]; return false; @@ -2364,9 +2306,9 @@ class AdminController extends AdminBaseController $result = Gpm::directInstall($file_path); if ($result === true) { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_SUCCESSFUL'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.INSTALLATION_SUCCESSFUL'), 'info'); } else { - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_FAILED') . ': ' . $result, + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.INSTALLATION_FAILED') . ': ' . $result, 'error'); } @@ -2412,12 +2354,13 @@ class AdminController extends AdminBaseController $aPage->template($obj->template()); $aPage->validate(); $aPage->filter(); - $aPage->save(); - $this->grav->fireEvent('onAdminAfterSave', new Event(['page' => $obj])); + $this->grav->fireEvent('onAdminSave', new Event(['page' => &$aPage])); + $aPage->save(); + $this->grav->fireEvent('onAdminAfterSave', new Event(['page' => $aPage])); } - $this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_SWITCHED_LANGUAGE'), 'info'); + $this->admin->setMessage($this->admin::translate('PLUGIN_ADMIN.SUCCESSFULLY_SWITCHED_LANGUAGE'), 'info'); $this->setRedirect('/' . $language . $uri->route()); return true; diff --git a/classes/gpm.php b/classes/gpm.php index acddb088..8b9a425b 100644 --- a/classes/gpm.php +++ b/classes/gpm.php @@ -10,7 +10,6 @@ use Grav\Common\GPM\Response; use Grav\Common\GPM\Upgrader; use Grav\Common\Filesystem\Folder; use Grav\Common\GPM\Common\Package; -use Grav\Plugin\Admin\Admin; /** * Class Gpm @@ -90,11 +89,11 @@ class Gpm // Check destination Installer::isValidDestination($options['destination'] . DS . $package->install_path); - if (Installer::lastErrorCode() === Installer::EXISTS && !$options['overwrite']) { + if (!$options['overwrite'] && Installer::lastErrorCode() === Installer::EXISTS) { return false; } - if (Installer::lastErrorCode() === Installer::IS_LINK && !$options['ignore_symlinks']) { + if (!$options['ignore_symlinks'] && Installer::lastErrorCode() === Installer::IS_LINK) { return false; } @@ -147,7 +146,7 @@ class Gpm { $options = array_merge(self::$options, $options); - $packages = is_array($packages) ? $packages : [$packages]; + $packages = (array)$packages; $count = count($packages); $packages = array_filter(array_map(function ($p) { @@ -312,10 +311,10 @@ class Gpm $tmp_dir = Admin::getTempDir() . '/Grav-' . uniqid(); Folder::mkdir($tmp_dir); - $bad_chars = array_merge(array_map('chr', range(0, 31)), ["<", ">", ":", '"', "/", "\\", "|", "?", "*"]); + $bad_chars = array_merge(array_map('chr', range(0, 31)), ['<', '>', ':', '"', '/', '\\', '|', '?', '*']); - $filename = $package->slug . str_replace($bad_chars, "", basename($package->zipball_url)); - $filename = preg_replace('/[\\\\\/:"*?&<>|]+/mi', '-', $filename); + $filename = $package->slug . str_replace($bad_chars, '', basename($package->zipball_url)); + $filename = preg_replace('/[\\\\\/:"*?&<>|]+/m', '-', $filename); file_put_contents($tmp_dir . DS . $filename . '.zip', $contents); diff --git a/classes/popularity.php b/classes/popularity.php index ffa138be..a399c458 100644 --- a/classes/popularity.php +++ b/classes/popularity.php @@ -51,6 +51,11 @@ class Popularity return; } + // Respect visitors "do not track" setting + if (!Grav::instance()['browser']->isTrackable()) { + return; + } + /** @var Page $page */ $page = Grav::instance()['page']; $relative_url = str_replace(Grav::instance()['base_url_relative'], '', $page->url()); @@ -123,8 +128,10 @@ class Popularity $labels = []; $data = []; + /** @var Admin $admin */ + $admin = Grav::instance()['admin']; foreach ($chart_data as $date => $count) { - $labels[] = Grav::instance()['grav']['admin']->translate([ + $labels[] = $admin::translate([ 'PLUGIN_ADMIN.' . strtoupper(date('D', strtotime($date)))]) . '
' . date('M d', strtotime($date)); $data[] = $count; diff --git a/composer.json b/composer.json index cf755a6a..c20a56d2 100644 --- a/composer.json +++ b/composer.json @@ -9,14 +9,14 @@ { "name": "Team Grav", "email": "devs@getgrav.org", - "homepage": "http://getgrav.org", + "homepage": "https://getgrav.org", "role": "Developer" } ], "support": { "issues": "https://github.com/getgrav/grav-plugin-admin/issues", "irc": "https://chat.getgrav.org", - "forum": "http://getgrav.org/forum", + "forum": "https://getgrav.org/forum", "docs": "https://github.com/getgrav/grav-plugin-admin/blob/master/README.md" }, "require": { diff --git a/languages/ar.yaml b/languages/ar.yaml index dbed7f4a..62abc808 100644 --- a/languages/ar.yaml +++ b/languages/ar.yaml @@ -22,17 +22,22 @@ PLUGIN_ADMIN: FORGOT_USERNAME_DOES_NOT_EXIST: "لا يوجد المستخدم مع اسم المستخدم %s" FORGOT_EMAIL_NOT_CONFIGURED: "لا يمكن إعادة تعيين كلمة المرور. لم يتم تكوين هذا الموقع لإرسال رسائل البريد الإلكتروني" FORGOT_EMAIL_SUBJECT: "طلب إعادة تعيين كلمة المرور %s" + FORGOT_EMAIL_BODY: "

\"إعادة تعيين كلمة المرور\"

عزيزي %1$s،

طلبا قدم في %4$s لإعادة تعيين كلمة المرور الخاصة بك.


انقر فوق هذا الخيار لإعادة تعيين الخاص بك كلمة مرور

بدلاً من ذلك، نسخ عنوان URL التالي في شريط العناوين في المستعرض الخاص بك:

%2$s


أطيب التحيات،

%3$s

" MANAGE_PAGES: "إدارة الصفحات" + CONFIGURATION: "الإعدادات" PAGES: "الصفحات" - PLUGINS: "البرامج الإضافية" + PLUGINS: "الملحقات" PLUGIN: "البرنامج الإضافي" THEMES: "المواضيع" LOGOUT: "تسجيل الخروج" BACK: "الرجوع" + NEXT: "التالي" + PREVIOUS: "السابق" ADD_PAGE: "إضافة صفحة" ADD_MODULAR: "إضافة وحدة" MOVE: "انقل" DELETE: "حذف" + VIEW: "عرض" SAVE: "حفظ" NORMAL: "عادي" EXPERT: "خبير" @@ -54,6 +59,8 @@ PLUGIN_ADMIN: BY: "بواسطة" UPDATE_THEME: "تحديث الموضوع" UPDATE_PLUGIN: "تحديث البرنامج الإضافي" + OF_THIS_THEME_IS_NOW_AVAILABLE: "من هذه السمة الآن متوفرة" + OF_THIS_PLUGIN_IS_NOW_AVAILABLE: "من هذه الإضافة متوفرة الآن" AUTHOR: "المؤلّف" HOMEPAGE: "الصفحة الرئيسية" DEMO: "عرض تجريبي" @@ -70,16 +77,23 @@ PLUGIN_ADMIN: CHECK_FOR_UPDATES: "التحقق من وجود تحديثات" ADD: "أَضِف" CLEAR_CACHE: "مسح ذاكرة التخزين المؤقتة" + CLEAR_CACHE_ALL_CACHE: "كافة المحفوظات" + CLEAR_CACHE_ASSETS_ONLY: "الاصول فقط" CLEAR_CACHE_IMAGES_ONLY: "الصور فقط" + CLEAR_CACHE_CACHE_ONLY: "المحفوظات فقط" + CLEAR_CACHE_TMP_ONLY: "المؤقتة فقط" DASHBOARD: "لوحة المعلومات" UPDATES_AVAILABLE: "تحديثات متوفّرة" DAYS: "أيام" UPDATE: "تحديث" + BACKUP: "نسخة احتياطية" STATISTICS: "إحصائيات" TODAY: "اليوم" WEEK: "اسبوع" MONTH: "شهر" + LATEST_PAGE_UPDATES: "آخر التحديثات" MAINTENANCE: "الصيانه" + UPDATED: "تم تحديثه" MON: "الإثنين" TUE: "الثلاثاء" WED: "الإربعاء" @@ -90,3 +104,168 @@ PLUGIN_ADMIN: COPY: "نسخ" EDIT: "تحرير" CREATE: "انشاء" + GRAV_ADMIN: "مدير جريف" + GRAV_OFFICIAL_PLUGIN: "اضاف رسمية ل جريف" + GRAV_OFFICIAL_THEME: "سمة جريف رسمية" + PLUGIN_SYMBOLICALLY_LINKED: "هذه الاضافه مرتبطة بمرجع. لن يام اكتشاف التحديثات." + THEME_SYMBOLICALLY_LINKED: "هذه السمة مرتبطة بمرجع. لم يتم اكتشاف التحديثات" + REMOVE_PLUGIN: "حذف الإضافة" + INSTALL_PLUGIN: "تثبيت الإضافة" + AVAILABLE: "متوفر" + INSTALLED: "مثبت" + INSTALL: "تثبيت" + ACTIVE_THEME: "سمة نشطة" + SWITCHING_TO: "التبديل إلى" + SWITCHING_TO_DESCRIPTION: "بالتبديل إلى سمة مختلفة, لايوجد أي ضمانات بأن صفحات الواجهة مدعومة, من المحتمل أن تحدث أخطاء عند محاولة تحميل الصفحات المذكورة." + SWITCHING_TO_CONFIRMATION: "هل تريد التبديل الى السمة والمتابعة" + CREATE_NEW_USER: "إنشاء مستخدم جديد" + REMOVE_USER: "حذف المستخدم" + ACCESS_DENIED: "الدخول ممنوع" + ACCOUNT_NOT_ADMIN: "لا يملك حسابك أي صلاحيات للإدارة" + PHP_INFO: "معلومات بي إش بي" + INSTALLER: "المثبت" + AVAILABLE_THEMES: "سمات متوفرة" + AVAILABLE_PLUGINS: "إضافات متوفرة" + INSTALLED_THEMES: "السمات المثبتة" + INSTALLED_PLUGINS: "الإضافات المثبتة" + BROWSE_ERROR_LOGS: "سجل أخطاء التصفح" + SITE: "موقع" + INFO: "معلومات" + SYSTEM: "النظام" + USER: "المستخدم" + ADD_ACCOUNT: "إضافة حساب" + SWITCH_LANGUAGE: "تبديل اللغة" + SUCCESSFULLY_ENABLED_PLUGIN: "تم تفعيل الإضافة بنجاح" + SUCCESSFULLY_DISABLED_PLUGIN: "تم إيقاف الإضافة بنجاح" + SUCCESSFULLY_CHANGED_THEME: "تم تبديل السمة الإفتراضية بنجاح" + INSTALLATION_FAILED: "فشل التثبيت" + INSTALLATION_SUCCESSFUL: "تم التثبيت بنجاح" + UNINSTALL_FAILED: "فشل الغاء التثبيت" + UNINSTALL_SUCCESSFUL: "تم إلغاء التثبيت بنجاح" + SUCCESSFULLY_SAVED: "حفظ بنجاح" + SUCCESSFULLY_COPIED: "نسخ بنجاح" + REORDERING_WAS_SUCCESSFUL: "إعادة ترتيب تم بنجاح" + SUCCESSFULLY_DELETED: "تم الحذف بنجاح" + SUCCESSFULLY_SWITCHED_LANGUAGE: "تم تغيير اللغة بنجاح" + INSUFFICIENT_PERMISSIONS_FOR_TASK: "لديك أذونات غير كافية للقيام بالمهمة" + CACHE_CLEARED: "تم مسح الذاكرة المؤقتة" + METHOD: "الأسلوب" + ERROR_CLEARING_CACHE: "خطأ مسح ذاكرة التخزين المؤقت" + AN_ERROR_OCCURRED: "حدث خطأ ما" + YOUR_BACKUP_IS_READY_FOR_DOWNLOAD: "النسخة الاحتياطية جاهزة للتحميل" + DOWNLOAD_BACKUP: "تنزيل النسخة الاحتياطية" + PAGES_FILTERED: "الصفحات التي تمت تصفيتها" + NO_PAGE_FOUND: "لم يتم العثور على أي صفحة" + INVALID_PARAMETERS: "متغيرات غير صالحة" + NO_FILES_SENT: "لا توجد ملفات أرسلت حتى الآن" + EXCEEDED_FILESIZE_LIMIT: "تجاوز الحد الأقصى لحجم ملف التكوين بي إتش بي" + UNKNOWN_ERRORS: "خطأ غير معروف" + EXCEEDED_GRAV_FILESIZE_LIMIT: "تجاوز الحد الأقصى لحجم ملف التكوين بي إتش بي" + UNSUPPORTED_FILE_TYPE: "نوع ملف غير معتمد" + FAILED_TO_MOVE_UPLOADED_FILE: "فشل في تحميل الملف" + FILE_UPLOADED_SUCCESSFULLY: "تم رفع الملف بنجاح" + FILE_DELETED: "تم حذف الملف" + FILE_COULD_NOT_BE_DELETED: "لا يمكن حذف الملف" + FILE_NOT_FOUND: "لم يتم العثور على الملف" + NO_FILE_FOUND: "لا يوجد ملف" + GRAV_WAS_SUCCESSFULLY_UPDATED_TO: "تم تحديث النظام بنجاح الى" + GRAV_UPDATE_FAILED: "فشل تحديث نظام جراف" + EVERYTHING_UPDATED: "تم تحديث كل شيء" + UPDATES_FAILED: "فشل التحديث" + AVATAR_BY: "الصورة الرمزية التي" + AVATAR_UPLOAD_OWN: "أو قم بتحميل الخاصة بك..." + LAST_BACKUP: "آخر نسخ احتياطي" + FULL_NAME: "الإسم الكامل" + USERNAME: "إسم المستخدم" + EMAIL: "البريد الإلكتروني" + USERNAME_EMAIL: "إسم المستخدم أو البريد الإلكتروني" + PASSWORD: "كلمة السر" + PASSWORD_CONFIRM: "تأكيد كلمة السر" + TITLE: "العنوان" + LANGUAGE: "اللّغة" + ACCOUNT: "الحساب" + EMAIL_VALIDATION_MESSAGE: "يجب أن يكون البريد الإلكتروني صحيحاً" + PASSWORD_VALIDATION_MESSAGE: "يجب أن تحتوي كلمة المرور على الأقل على رقم وعلى حرف كبير وعلى حرف صغير، و أن تكون مكونة على الأقل من 8 أحرف أو أكثر" + LANGUAGE_HELP: "تعيين اللغة المفضلة" + MEDIA: "وسائط" + DEFAULTS: "الإعدادات الافتراضية" + SITE_TITLE: "عنوان الموقع" + SITE_TITLE_PLACEHOLDER: "عنوان الموقع العريض" + SITE_TITLE_HELP: "العنوان الإفتراضي لموقعك, غالبا يستخدم في السمات" + SITE_DEFAULT_LANG: "اللغة الإفتراضية" + SITE_DEFAULT_LANG_PLACEHOLDER: "اللغة الإفتراضية المستخدمة في السمات وسم " + SITE_DEFAULT_LANG_HELP: "اللغة الإفتراضية المستخدمة في السمات وسم " + DEFAULT_AUTHOR: "المؤلف الافتراضي" + DEFAULT_AUTHOR_HELP: "إسم المؤلف الإفتراضي, يستخدم عادة في السمات او محتوى الصفحة" + DEFAULT_EMAIL: "البريد الإلكتروني الإفتراضي" + DEFAULT_EMAIL_HELP: "البريد الإلكتروني للإشارة في المواضيع أو صفحات" + TAXONOMY_TYPES: "أنواع التصنيف" + TAXONOMY_TYPES_HELP: "يجب أن يتم تعريف أنواع التصنيف هنا إذا كنت ترغب في استخدامها في صفحات" + PAGE_SUMMARY: "ملخص الصفحة" + ENABLED: "فعال" + ENABLED_HELP: "تمكين صفحة الموجز (الملخص ترجع نفس محتوى الصفحة)" + 'YES': "نعم" + 'NO': "لا" + SUMMARY_SIZE: "حجم الملخص" + FORMAT: "الشكل" + SHORT: "قصير" + METADATA: "البيانات الوصفية" + NAME: "الإسم" + CONTENT: "المحتوى" + DEFAULT: "الإعدادات العامة" + PAGE_MEDIA: "صور و فيديوهات الصفحة" + OPTIONS: "الخيارات" + PUBLISHED: "نُشِرَ" + DATE: "التاريخ" + ROBOTS: "الروبوتات" + ADVANCED: "خيارات متقدمة" + SETTINGS: "الإعدادات" + FOLDER_NAME: "إسم المجلد" + MENU: "القائمة" + USE_GLOBAL: "الاستخدام العام" + ROUTABLE: "قابل للتوجيه" + ROUTABLE_HELP: "إذا أمكن ولوج هذه الصفحة عبر عنوان URL" + VISIBLE: "مرئي" + ASCENDING: "تصاعدي" + DESCENDING: "تنازلي" + PAGE_TITLE: "موضوع عنوان الصفحة" + PAGE_TITLE_HELP: "عنوان الصفحة" + PAGE: "صفحة" + MODULAR_TEMPLATE: "قالب متعدد الفقرات" + FILENAME: "اسم الملف" + PARENT_PAGE: "الصفحة الأصل" + HOME_PAGE: "الصفحة الرئيسية" + TIMEZONE: "المنطقة الزمنية" + LANGUAGES: "اللغات" + EXPIRES: "انتهاء الصلاحية" + LAST_MODIFIED: "آخر تعديل" + SESSION: "الجلسة" + CURRENT: "الحالي" + SAVE_AS: "حفظ كـ" + AND: "و" + FULLY_UPDATED: "تم تحديث النظام بالكامل" + GROUPS: "الفِرَق" + SESSION_SECURE: "آمن" + ADD_FOLDER: "إضافة مجلد" + ADD_ITEM: "إضافة عنصر" + LOADING: "جار التحميل …" + PACKAGES_SUCCESSFULLY_UPDATED: "تم تحديث حزمة أو حزمات بنجاح." + INSERT: "إدراج" + UNDO: "تراجع" + REDO: "إعادة" + HEADERS: "العناوين الرأسية" + ITALIC: "مائل" + LINK: "رابط" + IMAGE: "صورة" + PREVIEW: "معاينة" + PUBLISHING: "النشر" + IMAGE_OPTIONS: "خيارات الصورة" + ALL: "الكل" + FROM: "من" + TO: "إلى" + RELEASE_DATE: "تاريخ الإصدار" + DROPZONE_REMOVE_FILE: "إزالة الملف" + TOOLS: "الأدوات" + 2FA_CODE_INPUT: "000000" + 2FA_REGENERATE: "إعادة التوليد" + diff --git a/languages/bg.yaml b/languages/bg.yaml index a7430857..6a305c12 100644 --- a/languages/bg.yaml +++ b/languages/bg.yaml @@ -31,6 +31,8 @@ PLUGIN_ADMIN: THEMES: "Теми" LOGOUT: "Изход" BACK: "Назад" + NEXT: "Напред" + PREVIOUS: "Назад" ADD_PAGE: "Добавяне на страница" ADD_MODULAR: "Добавяне на модулна страница" MOVE: "Преместване" @@ -260,3 +262,4 @@ PLUGIN_ADMIN: TIMEZONE_HELP: "Презаписване на времевата зона на сървъра" EVENTS: "Събития" EVENTS_HELP: "Пускане или спиране на специфични събития. Спирането на някои събития може да счупи определени приставки" + diff --git a/languages/br.yaml b/languages/br.yaml index 497b447e..8bc2e6c1 100644 --- a/languages/br.yaml +++ b/languages/br.yaml @@ -31,10 +31,13 @@ PLUGIN_ADMIN: THEMES: "Neuzioù" LOGOUT: "Digennaskañ" BACK: "Distreiñ" + NEXT: "War-lerc'h" + PREVIOUS: "Diaraog" ADD_PAGE: "Ouzhpennañ ur bajenn" ADD_MODULAR: "Ouzhpennañ ur mollad" MOVE: "Dilec'hiañ" DELETE: "Dilemel" + VIEW: "Gwel" SAVE: "Enrollañ" NORMAL: "Reoliek" EXPERT: "Kemplezhoc'h" @@ -185,6 +188,7 @@ PLUGIN_ADMIN: SITE_TITLE: "Titl al lec'hienn" SITE_TITLE_PLACEHOLDER: "Titl ledan al lec'hienn" SITE_TITLE_HELP: "Titl dre ziouer ho lec'hienn, arveret en neuzioù" + SITE_DEFAULT_LANG: "Yezh defot" DEFAULT_AUTHOR: "Aozer dre ziouer" DEFAULT_AUTHOR_HELP: "Un anv aozer dre ziouer, arveret en neuzioù pe er pajennoù" DEFAULT_EMAIL: "Chomlec'h postel dre ziouer" @@ -222,7 +226,7 @@ PLUGIN_ADMIN: PAGE_MEDIA: "Media ar bajenn" OPTIONS: "Dibarzhioù" PUBLISHED: "Embannet" - PUBLISHED_HELP: 'Dre ziouer eo embannet ur bajenn war-bouez m''eo lakaet da "Embannet: ket" pe dre un deiziad embann en dazont, pe un deiziad diembannañ tremenet' + PUBLISHED_HELP: "Dre ziouer eo embannet ur bajenn war-bouez m'eo lakaet da \"Embannet: ket\" pe dre un deiziad embann en dazont, pe un deiziad diembannañ tremenet" DATE: "Deiziad" DATE_HELP: "Ar vaezienn deiziad a laosk ac'hanoc'h da arventennañ un deiziad liammet gant ar bajenn." PUBLISHED_DATE: "Deiziad embann" @@ -319,7 +323,7 @@ PLUGIN_ADMIN: ETAG: "ETag" ETAG_HELP: "Arventennañ an talbenn etag evit skoazell da c'houzout peur eo bet kemmet ur bajenn" VARY_ACCEPT_ENCODING: "Vary accept encoding" - VARY_ACCEPT_ENCODING_HELP: 'Arventennañ a ra an talbenn `Vary: Accept Encoding` evit skoazell gant ar proksi hag ar c''hrubuilh CDN' + VARY_ACCEPT_ENCODING_HELP: "Arventennañ a ra an talbenn `Vary: Accept Encoding` evit skoazell gant ar proksi hag ar c'hrubuilh CDN" MARKDOWN_EXTRA_HELP: "Gweredekaat ar skor dre ziouer evit Markdown Ectra - https://michelf.ca/projects/php-markdown/extra/" AUTO_LINE_BREAKS: "Tremen d'al linenn ent emgefreek" AUTO_LINE_BREAKS_HELP: "Gweredekaat skor tremen al linenn ent emgefreek e Markdown" @@ -429,7 +433,7 @@ PLUGIN_ADMIN: REDIRECT_TRAILING_SLASH: "Adheñchañ ar veskell dibenn" REDIRECT_TRAILING_SLASH_HELP: "Ober un adheñchañ 301 e-lerc'h merañ an beskell dibenn an URI en un doare treuzwelus." DEFAULT_DATE_FORMAT: "Mentrezh deiziad ar bajenn" - DEFAULT_DATE_FORMAT_HELP: 'Mentrezh deiziad ar bajenn arveret gant Grav. Dre ziouer, Grav a glask divinout mentrezh an deiziad met gallout a rit erspizañ unan gant kevreadur deiziad PHP (sk.: Y-m-d H:i)' + DEFAULT_DATE_FORMAT_HELP: "Mentrezh deiziad ar bajenn arveret gant Grav. Dre ziouer, Grav a glask divinout mentrezh an deiziad met gallout a rit erspizañ unan gant kevreadur deiziad PHP (sk.: Y-m-d H:i)" DEFAULT_DATE_FORMAT_PLACEHOLDER: "Divinout en emgefreek" IGNORE_FILES: "Leuskel restroù a-gostez" IGNORE_FILES_HELP: "Restroù da leuskel a-gostez e-pad keweriañ ar pajennoù" @@ -478,7 +482,7 @@ PLUGIN_ADMIN: TWIG_FIRST: "Keweriañ an Twig da gentañ" TWIG_FIRST_HELP: "M'ho peus gweredekaat keweriañ ar bajenn Twig e c'hallit kefluniañ Twig evit e geweriañ a-raok pe goude ar Markdown" SESSION_SECURE: "Diogel" - SESSION_SECURE_HELP: 'M''eo gwir, diskouez a ra eo ret d''ar c''hehentiñ evit an toupin-mañ bezañ graet war un treuzkas diogel. DIWALLIT: Gweredekait an dra-se war lec''hiennoù e HTTPS nemetken' + SESSION_SECURE_HELP: "M'eo gwir, diskouez a ra eo ret d'ar c'hehentiñ evit an toupin-mañ bezañ graet war un treuzkas diogel. DIWALLIT: Gweredekait an dra-se war lec'hiennoù e HTTPS nemetken" SESSION_HTTPONLY: "HTTP nemetken" SESSION_HTTPONLY_HELP: "M'eo gwir, diskouez a ra eo ret d'ar c'hehentiñ evit an toupin-mañ bezañ graet war un treuzkas HTTP ha n'eo ket aotreet kemmañ ar Javascript" REVERSE_PROXY: "Proksi en tu-gin" @@ -516,6 +520,9 @@ PLUGIN_ADMIN: UPDATING: "Hizivaet" GPM_RELEASES: "Ermaeziadennoù GPM" GPM_RELEASES_HELP: "Dibabit 'Amprouiñ' evit staliañ an handelv beta pe amprouiñ" + AUTO: "Oto" + FOPEN: "fopen" + CURL: "cURL" STABLE: "Stabil" TESTING: "Amprouiñ" FRONTMATTER_PROCESS_TWIG: "Keweriañ frontmatter Twig" @@ -523,12 +530,11 @@ PLUGIN_ADMIN: FRONTMATTER_IGNORE_FIELDS: "Leuskel maeziennoù Frontmatter a-gostez" FRONTMATTER_IGNORE_FIELDS_HELP: "Maeziennoù Frontmatter a c'hall enderc'hel Twig met ne rankont ket bezañ keweriet, evel 'forms'" PACKAGE_X_INSTALLED_SUCCESSFULLY: "Pakad %s staliet gant berzh" - NEEDS_GRAV_1_1: " Emaoc'h oc'h erounit Grav v%s. Ret eo deoc'h hizivaat d'an handelv diwezhañ: Grav v1.1.x evit bezañ sur e vo keverlec'h. Gallout a ra talvezout vo ret tremen da ermaeziadennoù amprouiñ GPM e kefluniadur ar reizhiad." ORDERING_DISABLED_BECAUSE_PARENT_SETTING_ORDER: "Urzh ar c'har, diweredekaet eo an urzhiañ" ORDERING_DISABLED_BECAUSE_PAGE_NOT_VISIBLE: "Diwelus eo ar bajenn, diweredekaet eo an urzhiañ" ORDERING_DISABLED_BECAUSE_TOO_MANY_SIBLINGS: "N'eo ket skoret an urzhiañ dre an ardeiñ dre ma zo ouzhpenn 200 c'hoar" - CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: 'EVEZHIADENN: n''hallit ket ouzhpennañ restroù media evit enrollañ ar bajenn. Klikit war ''Enrollañ'' a-us' - CANNOT_ADD_FILES_PAGE_NOT_SAVED: 'EVEZHIADENN: ret eo enrollañ ar bajenn a-raok pellgas restroù dezhi.' + CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: "EVEZHIADENN: n'hallit ket ouzhpennañ restroù media evit enrollañ ar bajenn. Klikit war 'Enrollañ' a-us" + CANNOT_ADD_FILES_PAGE_NOT_SAVED: "EVEZHIADENN: ret eo enrollañ ar bajenn a-raok pellgas restroù dezhi." DROP_FILES_HERE_TO_UPLOAD: "Lakait ho restroù amañ pe klikit amañ" INSERT: "Enlakaat" UNDO: "Dizober" @@ -537,8 +543,8 @@ PLUGIN_ADMIN: BOLD: "Tev" ITALIC: "Stouet" STRIKETHROUGH: "Barrennet" - SUMMARY_DELIMITER: "Bevenner berradenn" - LINK: "Ere" + SUMMARY_DELIMITER: "Bonner diverrad" + LINK: "Liamm" IMAGE: "Skeudenn" BLOCKQUOTE: "Meneg" UNORDERED_LIST: "Roll dizurzh" @@ -546,32 +552,50 @@ PLUGIN_ADMIN: EDITOR: "Embanner" PREVIEW: "Alberz" FULLSCREEN: "Skramm a-bezh" - MODULAR: "Molladel" - NON_ROUTABLE: "Nann-hentus" - NON_MODULAR: "Nann-molladel" + MODULAR: "Modulel" + NON_ROUTABLE: "Dihentus" + NON_MODULAR: "Divodulel" NON_VISIBLE: "Diwelus" NON_PUBLISHED: "Diembannet" - CHARACTERS: "arouezenn" - PUBLISHING: "Oc'h embann" + CHARACTERS: "arouezioù" + PUBLISHING: "Embann" + NOTIFICATIONS: "Notifiadenn" MEDIA_TYPES: "Doareoù media" - IMAGE_OPTIONS: "Dibarzhioù skeudenn" + IMAGE_OPTIONS: "Opsionoù skeudenn" MIME_TYPE: "Doare Mime" - THUMB: "Melvenn" + THUMB: "Miniaturenn" TYPE: "Doare" - FILE_EXTENSION: "Astenn restr" + FILE_EXTENSION: "Astenn ar fichenn" LEGEND: "Alc'hwez ar bajenn" - MEMCACHE_SERVER: "Dafariad memcache" - MEMCACHE_SERVER_HELP: "Chomlec'h an dafariad memcache" - MEMCACHE_PORT: "Porzh memcache" - MEMCACHE_PORT_HELP: "Porzh an dafariad memcache" - MEMCACHED_SERVER: "Dafariad memcache" - MEMCACHED_SERVER_HELP: "Chomlec'h an dafariad memcache" - MEMCACHED_PORT: "Porzh memcache" - MEMCACHED_PORT_HELP: "Porzh an dafariad memcache" - REDIS_SERVER: "Dafariad redis" - REDIS_SERVER_HELP: "Chomlec'h an dafariad memcache" - REDIS_PORT: "Porzh redis" - REDIS_PORT_HELP: "Porzh an dafariad redis" - ALL: "Pep tra" + MEMCACHE_SERVER: "Servijer Memcached" + MEMCACHE_SERVER_HELP: "Chomlec'h ar servijer Memcached" + MEMCACHE_PORT: "Porzh Memcached" + MEMCACHE_PORT_HELP: "Porzh ar servijer Memcached" + MEMCACHED_SERVER: "Servijer Memcached" + MEMCACHED_SERVER_HELP: "Chomlec'h ar servijer Memcached" + MEMCACHED_PORT: "Porzh Memcached" + MEMCACHED_PORT_HELP: "Porzh ar servijer Memcached" + REDIS_SERVER: "Servijer Redis" + REDIS_SERVER_HELP: "Chomlec'h ar servijer Redis" + REDIS_PORT: "Porzh Redis" + REDIS_PORT_HELP: "Porzh ar servijer Redis" + ALL: "Tout" FROM: "eus" TO: "da" + RESOURCE_FILTER: "Sil..." + FORCE_SSL: "Forsañ SSL" + DROPZONE_CANCEL_UPLOAD: 'Nullañ ar gargamant' + DROPZONE_REMOVE_FILE: "Dilemel ar fichenn" + PREMIUM_PRODUCT: "Premium" + ERROR_SIMPLE: "Fazi simpl" + ERROR_SYSTEM: "Fazi Sistem" + NOT_SET: "Pas termenet" + PERMISSIONS: "Permisionoù" + REINSTALL_PLUGIN: "Adstaliañ ar Plugin" + REINSTALL_THEME: "Adstaliañ an Tem" + REINSTALL_THE: "Adstaliañ ar %s" + REINSTALLATION_FAILED: "Adstaliañ c'hwitet" + TOOLS: "Ostilhoù" + DIRECT_INSTALL: "Staliañ war-eeun" + 2FA_CODE_INPUT: "000000" + diff --git a/languages/ca.yaml b/languages/ca.yaml index 5a42b31e..f162cd8b 100644 --- a/languages/ca.yaml +++ b/languages/ca.yaml @@ -7,8 +7,8 @@ PLUGIN_ADMIN: LOGIN_BTN_FORGOT: "Ho he oblidat" LOGIN_BTN_RESET: "Restablir contrasenya" LOGIN_BTN_SEND_INSTRUCTIONS: "Envia instruccions pel reset" - LOGIN_BTN_CLEAR: "Neteja el formulari" - LOGIN_BTN_CREATE_USER: "Crea usuari" + LOGIN_BTN_CLEAR: "Netejar formulari" + LOGIN_BTN_CREATE_USER: "Crear usuari" LOGIN_LOGGED_IN: "S'ha iniciat sessió correctament" LOGIN_FAILED: "No s'ha pogut iniciar sessió" LOGGED_OUT: "S'ha tancat la sessió" @@ -228,7 +228,7 @@ PLUGIN_ADMIN: PAGE_MEDIA: "Contingut multimèdia de la pàgina" OPTIONS: "Opcions" PUBLISHED: "Publicat" - PUBLISHED_HELP: 'Per defect, una pàgina es publica excepte que estableixis explícitament ''published'': false o posant una publish_date al futur o una unpublish_date al passat' + PUBLISHED_HELP: "Per defect, una pàgina es publica excepte que estableixis explícitament 'published': false o posant una publish_date al futur o una unpublish_date al passat" DATE: "Data" DATE_HELP: "La variable data permet definir específicament una data associada a aquesta pàgina." PUBLISHED_DATE: "Data de publicació" @@ -325,7 +325,7 @@ PLUGIN_ADMIN: ETAG: "ETag" ETAG_HELP: "Estableix la capçalera d'etag per ajudar a identificar quan una pàgina ha estat modificada" VARY_ACCEPT_ENCODING: "Variar accept encoding" - VARY_ACCEPT_ENCODING_HELP: 'Estableix la capçalera ''Vary: Accept Encoding'' per ajudar amb el proxy i la cache CDN' + VARY_ACCEPT_ENCODING_HELP: "Estableix la capçalera 'Vary: Accept Encoding' per ajudar amb el proxy i la cache CDN" MARKDOWN_EXTRA_HELP: "Habilita suport per defecte per a Markdown Extra - https://michelf.ca/projects/php-markdown/extra/" AUTO_LINE_BREAKS: "Salts de línia automàtics" AUTO_LINE_BREAKS_HELP: "Habilita el suport per a salts de línia automàtics a Markdown" @@ -435,7 +435,7 @@ PLUGIN_ADMIN: REDIRECT_TRAILING_SLASH: "Redirigeix barra final" REDIRECT_TRAILING_SLASH_HELP: "Realitza una redirecció 301 en lloc de manteniment transparent de barra final." DEFAULT_DATE_FORMAT: "Format de data de pàgina" - DEFAULT_DATE_FORMAT_HELP: Format de data de pàgina utilitzat per Grav. Per defecte, Grav intenta endivinar el format de data, tot i això pots especificar un format utilitzant la sintaxi de data de PHP (p.e., Y-m-d H:i) + DEFAULT_DATE_FORMAT_HELP: "Format de data de pàgina utilitzat per Grav. Per defecte, Grav intenta endivinar el format de data, tot i això pots especificar un format utilitzant la sintaxi de data de PHP (p.e., Y-m-d H:i)" DEFAULT_DATE_FORMAT_PLACEHOLDER: "Endevina automàticament" IGNORE_FILES: "Ignora fitxers" IGNORE_FILES_HELP: "Arxius específics a ignorar al processar pàgines" @@ -484,7 +484,7 @@ PLUGIN_ADMIN: TWIG_FIRST: "Processa Twig primer" TWIG_FIRST_HELP: "Si el processament de pàgina de Twig està habilitat, es pot configurar que Twig faci el processament després de markdown" SESSION_SECURE: "Segur" - SESSION_SECURE_HELP: 'Si és cert, indica que la comunicació per aquesta cookie ha de ser sobre una connexió encriptada. ALERTA: Habilita aquesta opicó en llocs que funcionen exclusivament en HTTPS' + SESSION_SECURE_HELP: "Si és cert, indica que la comunicació per aquesta cookie ha de ser sobre una connexió encriptada. ALERTA: Habilita aquesta opicó en llocs que funcionen exclusivament en HTTPS" SESSION_HTTPONLY: "Només HTTP" SESSION_HTTPONLY_HELP: "Si és cert, indica que les cookies hauran de ser utilitzades només sobre HTTP, i les modificacions de JavaScript no estan permeses" REVERSE_PROXY: "Proxy invers" @@ -536,12 +536,11 @@ PLUGIN_ADMIN: FRONTMATTER_IGNORE_FIELDS: "Ignora camps frontmatter" FRONTMATTER_IGNORE_FIELDS_HELP: "Certs camps de frontmatter poden contenir Twig però no han de ser processats, com ara els formularis" PACKAGE_X_INSTALLED_SUCCESSFULLY: "Paquet %s instal·lat correctament" - NEEDS_GRAV_1_1: " Estàs utilitzant Grav v%s. Has d'actualitzar a l'última versió Grav v1.1.x disponible per tal d'assegurar la compatibilitat. Això pot requerir canviar a Versions GPM de prova en la configuració del sistema." ORDERING_DISABLED_BECAUSE_PARENT_SETTING_ORDER: "L'ordre està definit pel pare, l'ordenament està deshabilitat" ORDERING_DISABLED_BECAUSE_PAGE_NOT_VISIBLE: "La pàgina no és visible, l'ordenament està deshabilitat" ORDERING_DISABLED_BECAUSE_TOO_MANY_SIBLINGS: "L'ordre a través de l'administrador no està suportat degut a que hi ha més de 200 elements" - CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: 'NOTA: No es poden afegir fitxers multimèdia fins que no s''hagi desat la pàgina. Fes clic a ''Desa'' a la part superior' - CANNOT_ADD_FILES_PAGE_NOT_SAVED: 'NOTA: Cal desar la pàgina haver de pujar-hi fitxers.' + CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: "NOTA: No es poden afegir fitxers multimèdia fins que no s'hagi desat la pàgina. Fes clic a 'Desa' a la part superior" + CANNOT_ADD_FILES_PAGE_NOT_SAVED: "NOTA: Cal desar la pàgina haver de pujar-hi fitxers." DROP_FILES_HERE_TO_UPLOAD: "Deixa anar els teus arxius aquí o fes clic en aquesta àrea" INSERT: "Inserta" UNDO: "Desfés" @@ -599,7 +598,7 @@ PLUGIN_ADMIN: SESSION_PATH: "El camí de la sessió" SESSION_PATH_HELP: "Utilitza només si has escollit una URL base personalitzada (has reescrit el domini del lloc web/subcarpeta)" CUSTOM_BASE_URL: "URL base personalitzada" - CUSTOM_BASE_URL_HELP: 'Utilitza si vols reescriure el domini del lloc web o utilitzar una subcarpeta diferent que la que utilitza Grav. Per exemple: http://localhost' + CUSTOM_BASE_URL_HELP: "Utilitza si vols reescriure el domini del lloc web o utilitzar una subcarpeta diferent que la que utilitza Grav. Per exemple: http://localhost" FILEUPLOAD_PREVENT_SELF: 'No es pot utilitzar "%s" fora de les pàgines.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'No es pot pujar el fitxer %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'No es pot moure el fitxer %s to "%s"' @@ -631,3 +630,13 @@ PLUGIN_ADMIN: PERMISSIONS: "Permisos" ALLOW_WEBSERVER_GZIP: "Permetre WebServer Gzip" OFFLINE_WARNING: "La connexió a la GPM no es pot establir" + CONFIRM_REINSTALL: "Segur que vols re-instal·lar %s?" + REINSTALLED_SUCCESSFULLY: "%s re-instal·lat correctament" + TOOLS: "Eines" + GPM_OFFICIAL_ONLY: "Només GPM oficial" + SORTABLE_PAGES: "Pàgines ordenables:" + ADMIN_CHILDREN_DISPLAY_ORDER: "Ordre de visualització de descendents" + PWD_PLACEHOLDER: "cadena complexa de al menys 8 caràcters" + PWD_REGEX: "Regex clau" + USERNAME_REGEX: "RegEx nom d'usuari" + diff --git a/languages/cs.yaml b/languages/cs.yaml index 441a632e..a5cfa161 100644 --- a/languages/cs.yaml +++ b/languages/cs.yaml @@ -26,8 +26,8 @@ PLUGIN_ADMIN: MANAGE_PAGES: "Spravovat stránky" CONFIGURATION: "Nastavení" PAGES: "Stránky" - PLUGINS: "Zásuvné moduly" - PLUGIN: "Zásuvný modul" + PLUGINS: "Doplňky" + PLUGIN: "Doplněk" THEMES: "Šablony" LOGOUT: "Odhlásit" BACK: "Zpět" @@ -58,8 +58,8 @@ PLUGIN_ADMIN: WAS_MADE_WITH: "Byl vytvořen s" BY: "Od" UPDATE_THEME: "Aktualizovat šablonu" - UPDATE_PLUGIN: "Aktualizovat zásuvný modul" - OF_THIS_THEME_IS_NOW_AVAILABLE: "tohoto motivu je nyní dostupná" + UPDATE_PLUGIN: "Aktualizovat doplněk" + OF_THIS_THEME_IS_NOW_AVAILABLE: "této šablony je nyní dostupná" OF_THIS_PLUGIN_IS_NOW_AVAILABLE: "tohoto zásuvného modulu je nyní dostupná" AUTHOR: "Autor" HOMEPAGE: "Domovská stránka" @@ -69,11 +69,11 @@ PLUGIN_ADMIN: LICENSE: "Licence" DESCRIPTION: "Popis" README: "Soubor README" - REMOVE_THEME: "Odstranit motiv" - INSTALL_THEME: "Nainstalovat motiv" - THEME: "Motiv" - BACK_TO_THEMES: "Zpět na motivy" - BACK_TO_PLUGINS: "Zpět na zásuvné moduly" + REMOVE_THEME: "Odstranit šablonu" + INSTALL_THEME: "Nainstalovat šablonu" + THEME: "Šablona" + BACK_TO_THEMES: "Zpět na šablony" + BACK_TO_PLUGINS: "Zpět na doplňky" CHECK_FOR_UPDATES: "Zkontrolovat aktualizace" ADD: "Přidat" CLEAR_CACHE: "Vyprázdnit mezipaměť" @@ -106,27 +106,27 @@ PLUGIN_ADMIN: CREATE: "Vytvořit" GRAV_ADMIN: "Správa Grav" GRAV_OFFICIAL_PLUGIN: "Oficiální zásuvný modul Gravu" - GRAV_OFFICIAL_THEME: "Oficiální motiv Gravu" + GRAV_OFFICIAL_THEME: "Oficiální šablona Grav" PLUGIN_SYMBOLICALLY_LINKED: "Tento zásuvný modul je nainstalován pomocí symbolického linku. Změny v něm nebudou zjištěny." - THEME_SYMBOLICALLY_LINKED: "Tento motiv je nainstalován pomocí symbolického linku. Změny v něm nebudou zjištěny" - REMOVE_PLUGIN: "Odstranit zásuvný modul" - INSTALL_PLUGIN: "Nainstalovat plugin" + THEME_SYMBOLICALLY_LINKED: "Tato šablona je nainstalována pomocí symbolického linku. Změny v ní nebudou zjištěny" + REMOVE_PLUGIN: "Odstranit doplněk" + INSTALL_PLUGIN: "Nainstalovat doplněk" AVAILABLE: "K dispozici" INSTALLED: "Instalováno" INSTALL: "Nainstalovat" - ACTIVE_THEME: "Aktivní motiv" + ACTIVE_THEME: "Aktivní šablona" SWITCHING_TO: "Přepnout na" - SWITCHING_TO_DESCRIPTION: "Přepnutím na jiný motiv nelze garantovat, že všechny vzhledy stránek budou podporované, což může způsobit problémy při jejich nahrávání." - SWITCHING_TO_CONFIRMATION: "Chcete pokračovat a přepnout na jiný motiv" + SWITCHING_TO_DESCRIPTION: "Přepnutím na jinou šablonu nelze garantovat, že všechny vzhledy stránek budou podporované, což může způsobit jejich nedostupnost." + SWITCHING_TO_CONFIRMATION: "Chcete pokračovat a přepnout na jinou šablonu" CREATE_NEW_USER: "Vytvořit nového uživatele" REMOVE_USER: "Odstranit uživatele" ACCESS_DENIED: "Přístup byl odepřen" ACCOUNT_NOT_ADMIN: "váš účet nemá administrátorská oprávnění" PHP_INFO: "PHP Info" INSTALLER: "Instalátor" - AVAILABLE_THEMES: "Dostupné motivy" - AVAILABLE_PLUGINS: "Dostupné zásuvné moduly" - INSTALLED_THEMES: "Nainstalované motivy" + AVAILABLE_THEMES: "Dostupné šablony" + AVAILABLE_PLUGINS: "Dostupné doplňky" + INSTALLED_THEMES: "Nainstalované šablony" INSTALLED_PLUGINS: "Nainstalované doplňky" BROWSE_ERROR_LOGS: "Prohlédnout systémové záznamy" SITE: "Web" @@ -137,7 +137,7 @@ PLUGIN_ADMIN: SWITCH_LANGUAGE: "Přepnout jazyk" SUCCESSFULLY_ENABLED_PLUGIN: "Zásuvný modul byl úspěšně povolen" SUCCESSFULLY_DISABLED_PLUGIN: "Zásuvný modul byl úspěšně zakázán" - SUCCESSFULLY_CHANGED_THEME: "Úspěšně změněn výchozí motiv" + SUCCESSFULLY_CHANGED_THEME: "Úspěšně změněna výchozí šablona" INSTALLATION_FAILED: "Instalace se nezdařila" INSTALLATION_SUCCESSFUL: "Instalace byla úspěšná" UNINSTALL_FAILED: "Odinstalace se nezdařila" @@ -191,14 +191,14 @@ PLUGIN_ADMIN: DEFAULTS: "Výchozí hodnoty" SITE_TITLE: "Název webu" SITE_TITLE_PLACEHOLDER: "Titulek napříč celým webem" - SITE_TITLE_HELP: "Výchozí titulek webu, často použit v motivech" + SITE_TITLE_HELP: "Výchozí titulek webu, většinou použit v šablonách" SITE_DEFAULT_LANG: "Výchozí jazyk" - SITE_DEFAULT_LANG_PLACEHOLDER: "Výchozí jazyk použitý ve značce daného motivu" - SITE_DEFAULT_LANG_HELP: "Výchozí jazyk použitý ve značce daného motivu" + SITE_DEFAULT_LANG_PLACEHOLDER: "Výchozí jazyk použitý ve značce šablony" + SITE_DEFAULT_LANG_HELP: "Výchozí jazyk použitý ve značce šablony" DEFAULT_AUTHOR: "Výchozí autor" - DEFAULT_AUTHOR_HELP: "Výchozí jméno autora, často použito v motivech či obsazích stránek" + DEFAULT_AUTHOR_HELP: "Výchozí jméno autora, často použito v šablonách či obsazích stránek" DEFAULT_EMAIL: "Výchozí e-mailová adresa" - DEFAULT_EMAIL_HELP: "Výchozí e-mailová adresa, na kterou je odkazováno v motivech či stránkách" + DEFAULT_EMAIL_HELP: "Výchozí e-mailová adresa, na kterou je odkazováno v šablonách či stránkách" TAXONOMY_TYPES: "Typy taxonomií" TAXONOMY_TYPES_HELP: "Typy taxonomií musí být vytvořeny zde, aby bylo možné je použít v nastavení stránek" PAGE_SUMMARY: "Souhrn stránky" @@ -220,19 +220,19 @@ PLUGIN_ADMIN: CONTENT: "Obsah" REDIRECTS_AND_ROUTES: "Přesměrování a cesty" CUSTOM_REDIRECTS: "Vlastní přesměrování" - CUSTOM_REDIRECTS_HELP: "Routy, které přesměrují uživatele na jinou stránku. Můžete použít i regulární výrazy." + CUSTOM_REDIRECTS_HELP: "Cesty jsou přesměrovány na jiné stránky. Použití regulárních výrazů je možné" CUSTOM_REDIRECTS_PLACEHOLDER_KEY: "/váš/alias" CUSTOM_REDIRECTS_PLACEHOLDER_VALUE: "/vaše/přesměrování" CUSTOM_ROUTES: "Vlastní cesty" - CUSTOM_ROUTES_HELP: "Routy jako aliasy stránek. Můžete použít i regulární výrazy." + CUSTOM_ROUTES_HELP: "Cesty jsou aliasy pro jiné stránky. Použití regulárních výrazů je možné" CUSTOM_ROUTES_PLACEHOLDER_KEY: "/váš/alias" CUSTOM_ROUTES_PLACEHOLDER_VALUE: "/vaše/cesta" FILE_STREAMS: "Soubory" DEFAULT: "Výchozí" PAGE_MEDIA: "Stránky média" OPTIONS: "Možnosti" - PUBLISHED: "Zveřejněno" - PUBLISHED_HELP: 'Ve výchozím nastavení je stránka publikovaná, pokud nenastavíte ''published: false'', ''publish_date'' do budoucnosti nebo ''unpublish_date'' do minulosti' + PUBLISHED: "Zveřejněná" + PUBLISHED_HELP: "Ve výchozím nastavení je stránka publikovaná, pokud nenastavíte 'published: false', 'publish_date' do budoucnosti nebo 'unpublish_date' do minulosti" DATE: "Datum" DATE_HELP: "Můžete nastavit konkrétní datum, které bude přiřazené k této stránce." PUBLISHED_DATE: "Datum zveřejnění" @@ -244,10 +244,10 @@ PLUGIN_ADMIN: TAXONOMY: "Taxonomie" ADVANCED: "Pokročilé" SETTINGS: "Nastavení" - FOLDER_NUMERIC_PREFIX: "Číselná předpona u adresáře" - FOLDER_NUMERIC_PREFIX_HELP: "Číselná předpona umožňuje manuální řazení" + FOLDER_NUMERIC_PREFIX: "Číselná předpona složky" + FOLDER_NUMERIC_PREFIX_HELP: "Číselná předpona, která umožňuje manuální řazení a zajišťuje viditelnost" FOLDER_NAME: "Název složky" - FOLDER_NAME_HELP: "Název, který bude použitý jako název adresáře na disku" + FOLDER_NAME_HELP: "Název složky, která bude vytvořena v souborovém systému pro tuto stránku" PARENT: "Nadřazená stránka" DEFAULT_OPTION_ROOT: "- Root -" DEFAULT_OPTION_SELECT: "- Vyberte -" @@ -266,11 +266,11 @@ PLUGIN_ADMIN: PROCESS_HELP: "Nastavte jaký renderovací engine se má použít pro zpracování stránky" DEFAULT_CHILD_TYPE: "Výchozí typ nové stránky" USE_GLOBAL: "Použít globálně" - ROUTABLE: "Navštívitelný" + ROUTABLE: "Přístupná" ROUTABLE_HELP: "Určuje, zda má tato stránka navigovatelnou URL" CACHING: "Použít cache" - VISIBLE: "Viditelné" - VISIBLE_HELP: "Stránka je viditelná v navigaci" + VISIBLE: "Viditelná" + VISIBLE_HELP: "Určuje, zda je stránka viditelná v navigaci." DISABLED: "Vypnuto" ITEMS: "Položky" ORDER_BY: "Řadit podle" @@ -288,14 +288,14 @@ PLUGIN_ADMIN: PARENT_PAGE: "Nadřazená stránka" HOME_PAGE: "Domovská stránka" HOME_PAGE_HELP: "Stránka, kterou Grav použije jako výchozí při příchodu na web" - DEFAULT_THEME: "Výchozí motiv" - DEFAULT_THEME_HELP: "Nastaví výchozí motiv, který bude Grav používat (výchozí je Antimatter)" + DEFAULT_THEME: "Výchozí šablona" + DEFAULT_THEME_HELP: "Nastaví výchozí šablonu kterou bude Grav používat (výchozí je Antimatter)" TIMEZONE: "Časové pásmo" TIMEZONE_HELP: "Přepíše výchozí časovou zónu serveru" SHORT_DATE_FORMAT: "Krátký formát datumů" - SHORT_DATE_FORMAT_HELP: "Nastaví krátký formát data, který bude použit v motivech" + SHORT_DATE_FORMAT_HELP: "Nastaví krátký formát data, který bude použit v šablonách" LONG_DATE_FORMAT: "Dlouhý formát datumů" - LONG_DATE_FORMAT_HELP: "Nastaví dlouhý formát data, který bude požit v motivech" + LONG_DATE_FORMAT_HELP: "Nastaví dlouhý formát data, který bude použit v šablonách" DEFAULT_ORDERING: "Výchozí řazení" DEFAULT_ORDERING_HELP: "Stránky budou v seznamu zobrazeny v tomto pořadí, pokud nemá konkrétní stránka jiné nastavení" DEFAULT_ORDERING_DEFAULT: "Výchozí - podle celého názvu adresáře" @@ -310,13 +310,13 @@ PLUGIN_ADMIN: DATE_BASED_PUBLISHING_HELP: "Automaticky publikovat/skrýt stránky podle jejich datumu" EVENTS: "Události" EVENTS_HELP: "Povolit nebo zakázat konkrétní události. Zakázání některých událostí může mít za následek nefunkčnost některých doplňků" - REDIRECT_DEFAULT_ROUTE: "Přesměrovat výchozí routy" - REDIRECT_DEFAULT_ROUTE_HELP: "Automaticky přesměrovat na výchozí routu webu." + REDIRECT_DEFAULT_ROUTE: "Přesměrovat výchozí cestu" + REDIRECT_DEFAULT_ROUTE_HELP: "Automatické přesměrování na výchozí cestu stránky" LANGUAGES: "Jazyky" SUPPORTED: "Podporováno" SUPPORTED_HELP: "Dvouznakové jazykové kódy oddělené čárkou (například 'en,fr,de')" TRANSLATIONS_ENABLED: "Překlady povoleny" - TRANSLATIONS_ENABLED_HELP: "Podpora překladů v Gravu, pluginů a rozšíření" + TRANSLATIONS_ENABLED_HELP: "Podpora překladů v Gravu, doplňcích a rozšířeních" TRANSLATIONS_FALLBACK: "Hledat i v ostatních jazycích" TRANSLATIONS_FALLBACK_HELP: "Pokud překlad neexistuje v aktivním jazyce, prohledat i ostatní jazyky" ACTIVE_LANGUAGE_IN_SESSION: "Aktivní jazyk v session" @@ -326,13 +326,16 @@ PLUGIN_ADMIN: EXPIRES_HELP: "Nastaví 'expires' záznam v hlavičce. Hodnota je v sekundách." CACHE_CONTROL: "HTTP kontrola mezipaměti" CACHE_CONTROL_HELP: "Nastavte platnou hodnotu kontroly mezipaměti, jako např. `no-cache, no-store, must-revalidate`" - LAST_MODIFIED: "Last modified" + LAST_MODIFIED: "Naposledy změněno" LAST_MODIFIED_HELP: "Nastaví datum 'Last Modified' v HTTP hlavičce, které může pomoci při optimalizaci cachování na straně proxy serveru a prohlížeče" ETAG: "ETag" ETAG_HELP: "Nastaví 'ETag' záznam v HTTP hlavičce, který pomáhá rozeznat kdy byla stránka naposledy upravena" VARY_ACCEPT_ENCODING: "Vary: Accept Encoding" - VARY_ACCEPT_ENCODING_HELP: 'Nastaví ''Vary: Accept Encoding'' záznam v HTTP hlavičce, který pomáhá s cachováním na straně proxy a CDN' + VARY_ACCEPT_ENCODING_HELP: "Nastaví 'Vary: Accept Encoding' záznam v HTTP hlavičce, který pomáhá s cachováním na straně proxy a CDN" + MARKDOWN_EXTRA: "Markdown extra" MARKDOWN_EXTRA_HELP: "Povolit ve výchozím nastavení syntaxi Markdown Extra - https://michelf.ca/projects/php-markdown/extra/" + MARKDOWN_EXTRA_ESCAPE_FENCES: "Escapovat prvky HTML v markdown zvláštním značením" + MARKDOWN_EXTRA_ESCAPE_FENCES_HELP: "Escapování prvků HTML v markdown zvláštním značením" AUTO_LINE_BREAKS: "Automatické zalamování řádků" AUTO_LINE_BREAKS_HELP: "Povolit ve výchozím nastavení automatické zalamování řádků v Markdownu" AUTO_URL_LINKS: "Převádět URL na odkazy" @@ -441,7 +444,7 @@ PLUGIN_ADMIN: REDIRECT_TRAILING_SLASH: "Přesměrovat URL končící na '/'" REDIRECT_TRAILING_SLASH_HELP: "Provést přesměrování pomocí kódu 301 namísto ignorování pokud URL končí lomítkem." DEFAULT_DATE_FORMAT: "Formát data stránky" - DEFAULT_DATE_FORMAT_HELP: 'Formát datumu použitý Gravem. Ve výchozím nastavení se Grav pokusí uhodnout Váš formát datumů. Můžete jej ale nastavit i sami pomocí stejné syntaxe jako se využívá v PHP (např.: Y-m-d H:i)' + DEFAULT_DATE_FORMAT_HELP: "Formát datumu použitý Gravem. Ve výchozím nastavení se Grav pokusí uhodnout Váš formát datumů. Můžete jej ale nastavit i sami pomocí stejné syntaxe jako se využívá v PHP (např.: Y-m-d H:i)" DEFAULT_DATE_FORMAT_PLACEHOLDER: "Automaticky odhadnout" IGNORE_FILES: "Ignorovat soubory" IGNORE_FILES_HELP: "Ignorovat tyto soubory při zpracování stránky" @@ -451,21 +454,21 @@ PLUGIN_ADMIN: HTTP_ACCEPT_LANGUAGE_HELP: "Zkusí nastavit jazyk podle `http_accept_language` hlavičky v prohlížeči" OVERRIDE_LOCALE: "Přepsat lokalitu" OVERRIDE_LOCALE_HELP: "Přepíše lokalitu nastavenou v PHP podle aktuálního jazyku" - REDIRECT: "Stránka přesměrování" - REDIRECT_HELP: "Zadejte routu stránky nebo externí URL aby byla tato stránka přesměrována z např. `/nejaka/routa` na `http://jinyweb.com`" + REDIRECT: "Přesměrování stránky" + REDIRECT_HELP: "Zadejte cestu stránky nebo externí URL, kam bude tato stránka přesměrována. Např. `/nějaká/cesta` nebo `http://nějakýweb.com`" PLUGIN_STATUS: "Stav doplňku" - INCLUDE_DEFAULT_LANG: "Přidat do adresy jazyk" - INCLUDE_DEFAULT_LANG_HELP: "Toto nastavení přidá na začátek každé URL jazyk (např.: `/en/blog/my-post`)." + INCLUDE_DEFAULT_LANG: "Zahrnout výchozí jazyk" + INCLUDE_DEFAULT_LANG_HELP: "Předřadí všem adresám URL ve výchozím jazyce výchozí jazyk. Např.: `/en/blog/my-post`" ALLOW_URL_TAXONOMY_FILTERS: "Filtry taxonomie v URL" ALLOW_URL_TAXONOMY_FILTERS_HELP: "Umožňuje filtrovat stránky pomocí taxonomií jako `/taxonomie:hodnota`." - REDIRECT_DEFAULT_CODE: "Výchozí kód při přesměrování" + REDIRECT_DEFAULT_CODE: "Výchozí kód přesměrování" REDIRECT_DEFAULT_CODE_HELP: "Nastaví HTTP status kód použitý pro všechna přesměrování" IGNORE_HIDDEN: "Ignorovat skryté" IGNORE_HIDDEN_HELP: "Ignorovat všechny soubory, které začínají tečkou" WRAPPED_SITE: "Součást jiného webu" - WRAPPED_SITE_HELP: "Informace pro motivy/zásuvné moduly aby věděly, zda je Grav zapouzdřen další platformou" + WRAPPED_SITE_HELP: "Pro šablony/doplňky, aby věděly, zda je Grav zapouzdřen další platformou" FALLBACK_TYPES: "Povolené typy souborů" - FALLBACK_TYPES_HELP: "Povolené typy souborů, přístupných přes routu odpovídající stránce. Ve výchozím nastavení jsou všechny povoleny." + FALLBACK_TYPES_HELP: "Povolené typy souborů, které jsou přístupné prostřednictvím cesty stránky. Ve výchozím nastavení jsou podporovány všechny typy médií." INLINE_TYPES: "Typy souborů vložené přímo do stránky" INLINE_TYPES_HELP: "Typy souborů, které mají být zobrazeny přímo ve stránce namísto stahování" APPEND_URL_EXT: "Přidat za URL příponu" @@ -485,12 +488,12 @@ PLUGIN_ADMIN: CACHE_PERMS_HELP: "Výchozí nastavení oprávnění adresářů. Většinou 0755 nebo 0775 podle konfigurace serveru" REMOVE_SUCCESSFUL: "Úspěšně odstraněno" REMOVE_FAILED: "Odstranění se nezdařilo" - HIDE_HOME_IN_URLS: "Skrýt homepage routu v URL" - HIDE_HOME_IN_URLS_HELP: "Ujistí se, že routy pro všechny stránky neobsahují routu homepage" + HIDE_HOME_IN_URLS: "Skrýt cestu domovské stránky v URL" + HIDE_HOME_IN_URLS_HELP: "Zajistí, že výchozí cesty pro všechny stránky umístěné pod domovskou stránkou neobsahují cestu domovské stránky" TWIG_FIRST: "Zpracovat nejdříve Twigem" TWIG_FIRST_HELP: "Pokud povolíte zpracovávání stránek Twigem, můžete upravit stránku ještě před zpracování markdownem" SESSION_SECURE: "Bezpečnost" - SESSION_SECURE_HELP: 'Pokud zapnete, musí být veškerá komunikace identifikovaná touto cookie prováděna přes HTTPS. POZOR: Zapněte pouze pro weby, které běží pouze na HTTPS' + SESSION_SECURE_HELP: "Pokud zapnete, musí být veškerá komunikace identifikovaná touto cookie prováděna přes HTTPS. POZOR: Zapněte pouze pro weby, které běží pouze na HTTPS" SESSION_HTTPONLY: "Pouze HTTP" SESSION_HTTPONLY_HELP: "Pokud zapnete, cookie mohou být použity pouze přes HTTP a nemohou být upraveny pomocí JavaScriptu" REVERSE_PROXY: "Reverzní proxy" @@ -542,13 +545,12 @@ PLUGIN_ADMIN: FRONTMATTER_IGNORE_FIELDS: "Ignorovat pole ve frontmatteru" FRONTMATTER_IGNORE_FIELDS_HELP: "Určitá pole ve frontmatteru můžou obsahovat Twig, ale neměla by být zpracována. Například formuláře" PACKAGE_X_INSTALLED_SUCCESSFULLY: "Balíček %s byl úspěšně nainstalován" - NEEDS_GRAV_1_1: " Využíváte Grav v%s. Pro zajištění kompatibility je třeba aktualizovat na nejnovější verzi Grav v1.1.x. To může vyžadovat přechod na testovací GPM verzi v konfiguraci systému." ORDERING_DISABLED_BECAUSE_PARENT_SETTING_ORDER: "Pořadí nadřazeného nastavení, řazení zakázáno" ORDERING_DISABLED_BECAUSE_PAGE_NOT_VISIBLE: "Stránka není viditelná, řazení zakázáno" ORDERING_DISABLED_BECAUSE_TOO_MANY_SIBLINGS: "Řazení přes admin není podporováno, protože existuje více než 200 sourozenců" - ORDERING_DISABLED_BECAUSE_PAGE_NO_PREFIX: "Řazení stránek je zakázané pro tuto stánku, jelikož je není poskytnuta číselná předpona u adresáře" - CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: 'Poznámka: Nelze přidat mediální soubory, dokud neuložíte na stránku. Stačí kliknout na ''Uložit'' na horní části stránky' - CANNOT_ADD_FILES_PAGE_NOT_SAVED: 'POZNÁMKA: Musíte stránku uložit před nahráním souborů.' + ORDERING_DISABLED_BECAUSE_PAGE_NO_PREFIX: "Řazení stránek je zakázáno pro tuto stánku, protože Číselná předpona složky není povolena" + CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: "Poznámka: Nelze přidat mediální soubory, dokud neuložíte na stránku. Stačí kliknout na 'Uložit' na horní části stránky" + CANNOT_ADD_FILES_PAGE_NOT_SAVED: "POZNÁMKA: Musíte stránku uložit před nahráním souborů." DROP_FILES_HERE_TO_UPLOAD: "Přetáhněte sem své soubory nebo klikněte na tuto plochu" INSERT: "Vložit" UNDO: "Odvolat" @@ -567,9 +569,9 @@ PLUGIN_ADMIN: PREVIEW: "Náhled" FULLSCREEN: "Na celou obrazovku" MODULAR: "Modulární" - NON_ROUTABLE: "Nenavštívitelné" + NON_ROUTABLE: "Nepřístupná" NON_MODULAR: "Nemodulární" - NON_VISIBLE: "Neviditelné" + NON_VISIBLE: "Neviditelná" NON_PUBLISHED: "Nepublikované" CHARACTERS: "znaků" PUBLISHING: "Publikování" @@ -580,7 +582,7 @@ PLUGIN_ADMIN: THUMB: "Náhled" TYPE: "Typ" FILE_EXTENSION: "Přípona souboru" - LEGEND: "Legenda stánky" + LEGEND: "Legenda stránky" MEMCACHE_SERVER: "Server memcache" MEMCACHE_SERVER_HELP: "Adresa Memcache serveru" MEMCACHE_PORT: "Memcached port" @@ -607,7 +609,7 @@ PLUGIN_ADMIN: SESSION_PATH: "Adresa k session" SESSION_PATH_HELP: "Užívejte, jen když zvolíte vlastní základní adresu URL (přepíšete doménu stránky / podsložky)" CUSTOM_BASE_URL: "Vlastní základní adresa URL" - CUSTOM_BASE_URL_HELP: Užívejte, chcete-li přepsat doménu stránky nebo užít jinou podsložku, než která je v Grav užívaná. Například http://localhost + CUSTOM_BASE_URL_HELP: "Užívejte, chcete-li přepsat doménu stránky nebo užít jinou podsložku, než která je v Grav užívaná. Například http://localhost" FILEUPLOAD_PREVENT_SELF: 'Nelze použít "%s" mimo stránky.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Nepodařilo se nahrát soubor %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Nepodařilo přesunout soubor %s do "%s"' @@ -626,8 +628,8 @@ PLUGIN_ADMIN: ADMIN_CACHING_HELP: "Ukládání do mezipaměti v administraci lze ovládat nezávisle z front-end webu" DESTINATION_NOT_SPECIFIED: "Cíl není zadán" UPLOAD_ERR_NO_TMP_DIR: "Chybí dočasná složka" - SESSION_SPLIT: "Rozdělení session" - SESSION_SPLIT_HELP: "Nezávislé rozdělit relací mezi webem a dalšími pluginy (jako admin)" + SESSION_SPLIT: "Rozdělit relaci" + SESSION_SPLIT_HELP: "Nezávisle rozdělené relace mezi webem a dalšími doplňky (jako admin)" ERROR_FULL_BACKTRACE: "Úplná chybová hlášení" ERROR_SIMPLE: "Jednoduchá chyba" ERROR_SYSTEM: "Systémová chyba" @@ -667,27 +669,43 @@ PLUGIN_ADMIN: GPM_OFFICIAL_ONLY_HELP: "Povolit pouze přímé instalace z oficiálního repozitáře GPM." NO_CHILD_TYPE: "Žádný odvozený typ pro zdrojové směrování" SORTABLE_PAGES: "Tříditelné stánky:" - UNSORTABLE_PAGES: "Netříditelné stránky:" + UNSORTABLE_PAGES: "Netříditelné stránky" ADMIN_SPECIFIC_OVERRIDES: "Specifická přepsání admina" ADMIN_CHILDREN_DISPLAY_ORDER: "Pořadí zobrazení dětí" ADMIN_CHILDREN_DISPLAY_ORDER_HELP: "Pořadí v jakém bude odvozená stránka zobrazena v pohledu 'Strany' správcovského zásuvného modulu" PWD_PLACEHOLDER: "komplexní řetězec nejméně 8 znaků dlouhý" PWD_REGEX: "Regex hesla" - PWD_REGEX_HELP: 'Výchozí: Hesla musí obsahovat minimálně jedno číslo, jedno velké a malé písmeno a jejich délka musí být nejméně 8 znaků' + PWD_REGEX_HELP: "Výchozí: Hesla musí obsahovat minimálně jedno číslo, jedno velké a malé písmeno a jejich délka musí být nejméně 8 znaků" USERNAME_PLACEHOLDER: "jen malá písmena, např. 'admin'" USERNAME_REGEX: "Regex uživatelského jména" - USERNAME_REGEX_HELP: 'Výchozí: jen malá písmena, znaky, číslice, pomlčky a podtržítka. 3 - 16 znaků' + USERNAME_REGEX_HELP: "Výchozí: jen malá písmena, znaky, číslice, pomlčky a podtržítka. 3 - 16 znaků" CONTENT_PADDING: "Odsazení obsahu" CONTENT_PADDING_HELP: "Povolit/zakázat obsah odsazení kolem oblasti obsahu pro poskytnutí více místa" ENABLE_AUTO_METADATA: "Automatická metadata z Exif" ENABLE_AUTO_METADATA_HELP: "Automaticky generovat soubory matadat pro obrázky s Exif informacemi" 2FA_TITLE: "Dvoufaktorové ověření" 2FA_INSTRUCTIONS: "##### Dvoufaktorové ověřování\nMáte na svém účtu aktivováno **dvoufaktorové ověřování**. Pro dokončení přihlášení použijte svou aplikaci pro **dvoufaktorové ověřování ** a zadejte **šestimístný kód**." - 2FA_REGEN_HINT: "znovuvytvoření tajného kódu bude vyžadovat přeinstalaci ověřovací aplikace" + 2FA_REGEN_HINT: "Obnovení tajného kódu bude vyžadovat aktualizaci vaší autentifikační aplikace" 2FA_LABEL: "Přístup správce" 2FA_FAILED: "Špatně zadaný kód dvoufaktorového ověření, zkuste to znovu." 2FA_ENABLED: "Dvoufaktorové ověření povoleno" 2FA_CODE_INPUT: "000000" 2FA_SECRET: "Tajný kód dvoufaktorového ověření" - 2FA_SECRET_HELP: "Naskenujte tento QR kód do vaší [Ověřovací aplikace](https://learn.getgrav.org/admin-panel/2fa#apps). Dobrý nápad je také zazálohovat tajný kód na bezpečné místo, pokud bude zapotřebí aplikaci přeinstalovat. Pro více informací se podívejte do [Grav dokumentace](https://learn.getgrav.org/admin-panel/2fa) " + 2FA_SECRET_HELP: "Naskenujte tento QR kód do vaší [Autentifikační aplikace](https://learn.getgrav.org/admin-panel/2fa#apps). Důležité je také uložit tajný kód na bezpečném místě, pokud bude zapotřebí aplikaci přeinstalovat. Pro více informací se podívejte do [dokumentace Grav](https://learn.getgrav.org/admin-panel/2fa)" 2FA_REGENERATE: "Přegenerovat" + FORCE_LOWERCASE_URLS: "Vynutit malá písmena v URL" + FORCE_LOWERCASE_URLS_HELP: "Ve výchozím nastavení Grav nastaví všechny slugy a cesty na malá písmena. Změnou nastavení na hodnotu false, mohou slugy a cesty obsahovat Velká Písmena" + INTL_ENABLED: "Integrace modulu Intl" + INTL_ENABLED_HELP: "Použijte modul Intl PHP a porovnávejte třídění s kolekcemi založenými na UTF8" + VIEW_SITE_TIP: "Zobrazit web" + TOOLS_DIRECT_INSTALL_TITLE: "Přímá instalace balíčků Grav" + TOOLS_DIRECT_INSTALL_UPLOAD_TITLE: "Instalovat balíček prostřednictvím staženého ZIP souboru" + TOOLS_DIRECT_INSTALL_UPLOAD_DESC: "Můžete snadno nainstalovat platnou Grav šablonu, platný doplněk nebo dokonce Grav aktualizační balíček Zip prostřednictvím této metody. Tento balíček nemusí být registrován prostřednictvím GPM a umožňuje vám snadno vrátit se k předchozí verzi nebo vytvořit instalaci pro testování." + TOOLS_DIRECT_INSTALL_URL_TITLE: "Instalovat balíček prostřednictvím odkazu vzdálené adresy URL" + TOOLS_DIRECT_INSTALL_URL_DESC: "Případně můžete také odkázat na úplnou adresu URL k balíčku ZIP souboru a nainstalovat jej prostřednictvím této vzdálené adresy URL." + TOOLS_DIRECT_INSTALL_UPLOAD_BUTTON: "Nahrát a instalovat" + ROUTE_OVERRIDES: "Přepsání cesty" + ROUTE_DEFAULT: "Výchozí cesta" + ROUTE_CANONICAL: "Kanonická cesta" + ROUTE_ALIASES: "Aliasy cesty" + diff --git a/languages/cy.yaml b/languages/cy.yaml index 9d5d9650..f110be8e 100644 --- a/languages/cy.yaml +++ b/languages/cy.yaml @@ -88,3 +88,4 @@ PLUGIN_ADMIN: EDIT: "Golygu" CREATE: "Creu" AVAILABLE: "Ar gael" + diff --git a/languages/da.yaml b/languages/da.yaml index 43af84ca..e915056a 100644 --- a/languages/da.yaml +++ b/languages/da.yaml @@ -232,7 +232,7 @@ PLUGIN_ADMIN: PAGE_MEDIA: "Sidemedier" OPTIONS: "Indstillinger" PUBLISHED: "Udgivet" - PUBLISHED_HELP: 'Som standard offentliggøres en side medmindre du udtrykkeligt sætter published: false eller via en fremtidig publish_date eller fortidig unpublish_date' + PUBLISHED_HELP: "Som standard offentliggøres en side medmindre du udtrykkeligt sætter published: false eller via en fremtidig publish_date eller fortidig unpublish_date" DATE: "Dato" DATE_HELP: "Dato-variablen tillader dig at sætte en specifik dato associeret med denne side." PUBLISHED_DATE: "Udgivelsesdato" @@ -331,7 +331,7 @@ PLUGIN_ADMIN: ETAG: "ETag" ETAG_HELP: "Indstiller etag-header for at hjælpe med at identificere, hvornår en side er blevet ændret" VARY_ACCEPT_ENCODING: "Vary accept encoding" - VARY_ACCEPT_ENCODING_HELP: 'Angiver "Vary: Accept Encoding"-headeren, der hjælper med proxy og CDN-cachelagring' + VARY_ACCEPT_ENCODING_HELP: "Angiver \"Vary: Accept Encoding\"-headeren, der hjælper med proxy og CDN-cachelagring" MARKDOWN_EXTRA_HELP: "Aktiver standardunderstøttelse for Markdown Extra - https://michelf.ca/projects/php-markdown/extra/" AUTO_LINE_BREAKS: "Automatiske linjeskift" AUTO_LINE_BREAKS_HELP: "Aktiver understøttelse af automatiske linjeskift i markdown" @@ -441,7 +441,7 @@ PLUGIN_ADMIN: REDIRECT_TRAILING_SLASH: "Omdiriger efterstillet skråstreg" REDIRECT_TRAILING_SLASH_HELP: "Udfør en 301-omdirigering i stedet for gennemsigtigt at håndtere URI'er med efterstillet skråstreg." DEFAULT_DATE_FORMAT: "Sidedatoformat" - DEFAULT_DATE_FORMAT_HELP: Det side-datoformat, som Grav skal bruge. Som standard forsøger Grav at gætte dit datoformat, men du kan specificeret et format med PHP's dato-syntaks (f.eks. Y-m-d H:i) + DEFAULT_DATE_FORMAT_HELP: "Det side-datoformat, som Grav skal bruge. Som standard forsøger Grav at gætte dit datoformat, men du kan specificeret et format med PHP's dato-syntaks (f.eks. Y-m-d H:i)" DEFAULT_DATE_FORMAT_PLACEHOLDER: "Gæt automatisk" IGNORE_FILES: "Ignorer filer" IGNORE_FILES_HELP: "Specifikke filer, som skal ignoreres ved behandlingen af sider" @@ -490,7 +490,7 @@ PLUGIN_ADMIN: TWIG_FIRST: "Processér Twig først" TWIG_FIRST_HELP: "Hvis du har aktiveret Twig-behandling af sider kan du konfigurere Twig til at gøre det før eller efter markdown" SESSION_SECURE: "Sikker" - SESSION_SECURE_HELP: 'Angiver, om kommunikation med denne cookie skal ske krypteret. ADVARSEL: Brug kun dette på sites, der kører udelukkende på HTTPS' + SESSION_SECURE_HELP: "Angiver, om kommunikation med denne cookie skal ske krypteret. ADVARSEL: Brug kun dette på sites, der kører udelukkende på HTTPS" SESSION_HTTPONLY: "Kun HTTP" SESSION_HTTPONLY_HELP: "Hvis denne indstilling er aktiveret bruges cookes kun over HTTP og Javascript-ændringer tillades ikke" REVERSE_PROXY: "Omvendt proxy" @@ -542,13 +542,12 @@ PLUGIN_ADMIN: FRONTMATTER_IGNORE_FIELDS: "Ignorer frontmatter felter" FRONTMATTER_IGNORE_FIELDS_HELP: "Visse frontmatter felter kan indeholde Twig, men skal ikke behandles. Så som \"formularer\"" PACKAGE_X_INSTALLED_SUCCESSFULLY: "Pakke %s installeret" - NEEDS_GRAV_1_1: " du kører Grav v%s. Du skal opdatere til den nyeste Grav v1.1.x version for at sikre kompatibilitet. Dette kan kræve at du skifter til eksperimentelle GPM udgivelser i systemkonfigurationen." ORDERING_DISABLED_BECAUSE_PARENT_SETTING_ORDER: "Overordnet rækkefølge-indstilling, orden de-aktiveret" ORDERING_DISABLED_BECAUSE_PAGE_NOT_VISIBLE: "Siden er ikke synlig, orden de-aktiveret" ORDERING_DISABLED_BECAUSE_TOO_MANY_SIBLINGS: "Sortering af rækkefølge via administrationen er ikke tilgængelig, fordi der er mere end 200 under-elementer" ORDERING_DISABLED_BECAUSE_PAGE_NO_PREFIX: "Sidebestilling er deaktiveret for denne side, da Numerisk Mappenpræfiks ikke er aktiveret" - CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: 'OBS: Du kan ikke tilføje medie-filer før du har gemt siden. Klik på "Gem" øverst' - CANNOT_ADD_FILES_PAGE_NOT_SAVED: 'OBS: Siden skal gemmes før du kan tilføje filer til den.' + CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: "OBS: Du kan ikke tilføje medie-filer før du har gemt siden. Klik på \"Gem\" øverst" + CANNOT_ADD_FILES_PAGE_NOT_SAVED: "OBS: Siden skal gemmes før du kan tilføje filer til den." DROP_FILES_HERE_TO_UPLOAD: "Smid dine filer her eller, Klik i dette område" INSERT: "Indsæt" UNDO: "Fortryd" @@ -606,7 +605,7 @@ PLUGIN_ADMIN: SESSION_PATH: "Sessionssti" SESSION_PATH_HELP: "Benyt kun, hvis du vælger en tilpasset basis-URL (du omskrive webstedsdomæne/undermappe)" CUSTOM_BASE_URL: "Tilpasset basis-URL" - CUSTOM_BASE_URL_HELP: 'Benyt, hvis du ønsker at omskrive webstedsdomæne eller benytte en anden undermappe end den, Grav benytter. Eksempel: http://localhost' + CUSTOM_BASE_URL_HELP: "Benyt, hvis du ønsker at omskrive webstedsdomæne eller benytte en anden undermappe end den, Grav benytter. Eksempel: http://localhost" FILEUPLOAD_PREVENT_SELF: 'Kan ikke benytte "%s" uden for sider.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Kan ikke uploade fil %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Kan ikke flytte fil %s til "%s"' @@ -665,27 +664,26 @@ PLUGIN_ADMIN: GPM_OFFICIAL_ONLY_HELP: "Tillade kun direkte installationer fra det officielle GPM-repositorie." NO_CHILD_TYPE: "Ingen underordnet type for denne rawroute" SORTABLE_PAGES: "Sorterbare sider:" - UNSORTABLE_PAGES: "Ikke-sorterbare sider:" ADMIN_SPECIFIC_OVERRIDES: "Admin-specifikke tilsidesætter" ADMIN_CHILDREN_DISPLAY_ORDER: "Underordnedes visningsrækkefølge" ADMIN_CHILDREN_DISPLAY_ORDER_HELP: "Rækkefølgen, hvori undersider til denne side skal vises i visningen 'Sider' i Admin-plugin" PWD_PLACEHOLDER: "kompleks streng minimum 8 tegn lang" PWD_REGEX: "Adgangskode Regex" - PWD_REGEX_HELP: Adgangskode skal som standard indeholde mindst ét ciffer, én versal og én minuskel samt udgøres af minimum otte tegn + PWD_REGEX_HELP: "Adgangskode skal som standard indeholde mindst ét ciffer, én versal og én minuskel samt udgøres af minimum otte tegn" USERNAME_PLACEHOLDER: "kun minuskler, f.eks. 'admin'" USERNAME_REGEX: "Brugernavn Regex" - USERNAME_REGEX_HELP: Som standard kun minuskler, cifre, bindestreger og understregninger på 3-16 tegn + USERNAME_REGEX_HELP: "Som standard kun minuskler, cifre, bindestreger og understregninger på 3-16 tegn" CONTENT_PADDING: "Indholdsrammer" CONTENT_PADDING_HELP: "Aktivér/Deaktivér indholdsrammer omkring indholdsområde for at give mere plads" ENABLE_AUTO_METADATA: "Auto-metadata fra Exif" ENABLE_AUTO_METADATA_HELP: "Automatisk generere metadatafiler til billeder med exif-oplysninger" 2FA_TITLE: "Totrinsautentificering" 2FA_INSTRUCTIONS: "### 2-faktor Autentificering \nDu har **2FA** aktiveret for denne konto. Benyt venligst din **2FA**-app til at angive den aktuelle **6-cifrede kode** for at fuldføre loginprocessen." - 2FA_REGEN_HINT: "regenerering af hemmeligheden vil kræver opdatering af din autentificerings-app" 2FA_LABEL: "Admin-adgang" 2FA_FAILED: "Ugyldig 2-faktor autentificeringskode, forsøg venligst igen..." 2FA_ENABLED: "2FA aktiveret" 2FA_CODE_INPUT: "000000" 2FA_SECRET: "2FA hemmelighed" - 2FA_SECRET_HELP: "Skan denne QR-kode ind i din [Autentificering-app] (https://learn.getgrav.org/admin-panel/2fa#apps). Det er også en god idé at sikkerhedskopiere hemmelighed til en sikkert placering, i tilfælde af at du skal geninstallere din app. Tjek [Grav docs] (https://learn.getgrav.org/admin-panel/2fa) for yderligere oplysninger " 2FA_REGENERATE: "Regenerér" + FORCE_LOWERCASE_URLS: "Brug små bogstaver i URL'er" + diff --git a/languages/de.yaml b/languages/de.yaml index 2301575c..cf403edf 100644 --- a/languages/de.yaml +++ b/languages/de.yaml @@ -31,6 +31,8 @@ PLUGIN_ADMIN: THEMES: "Themes" LOGOUT: "Abmelden" BACK: "Zurück" + NEXT: "Nächste" + PREVIOUS: "Vorherige" ADD_PAGE: "Seite hinzufügen" ADD_MODULAR: "Modulare Seite hinzufügen" MOVE: "Verschieben" @@ -230,7 +232,7 @@ PLUGIN_ADMIN: PAGE_MEDIA: "Seitenmedien" OPTIONS: "Optionen" PUBLISHED: "Veröffentlicht" - PUBLISHED_HELP: Standardmäßig ist eine Seite veröffentlicht, es sei denn sie wird explizit auf nicht veröffentlicht gesetzt, das Veröffentlichungsdatum liegt in der Zukunft oder das Ablaufdatum wurde erreicht. + PUBLISHED_HELP: "Standardmäßig ist eine Seite veröffentlicht, es sei denn sie wird explizit auf nicht veröffentlicht gesetzt, das Veröffentlichungsdatum liegt in der Zukunft oder das Ablaufdatum wurde erreicht." DATE: "Datum" DATE_HELP: "Die Datumsangabe erlaubt es diese Seite mit einem Datum zu versehen." PUBLISHED_DATE: "Veröffentlichungsdatum" @@ -311,7 +313,7 @@ PLUGIN_ADMIN: REDIRECT_DEFAULT_ROUTE: "Weiterleiten auf Standardroute" REDIRECT_DEFAULT_ROUTE_HELP: "Automatisches Weiterleiten auf die Route einer Seite" LANGUAGES: "Sprachen" - SUPPORTED: "Untersützt" + SUPPORTED: "Unterstützt" SUPPORTED_HELP: "Durch Kommata getrennte Liste mit 2-stelligen Sprachcodes (zum Beispiel 'en,fr,de')" TRANSLATIONS_ENABLED: "Übersetzungen aktivieren" TRANSLATIONS_ENABLED_HELP: "Aktiviert Übersetzungen in Grav, Plugins und Erweiterungen" @@ -322,12 +324,15 @@ PLUGIN_ADMIN: HTTP_HEADERS: "HTTP-Header" EXPIRES: "Läuft ab" EXPIRES_HELP: "Ändert den Expires-Header (Cache-Ablaufdatum). Angabe in Sekunden" + CACHE_CONTROL: "HTTP-Cache-Control" + CACHE_CONTROL_HELP: "Muss auf einen validen Cache-Control-Wert gesetzt werden, wie zum Beispiel 'no-cache, no-store, must-revalidate\"" LAST_MODIFIED: "Zuletzt geändert" LAST_MODIFIED_HELP: "Setzt das Datum der letzten Änderung um Caching zu optimieren" ETAG: "ETag" ETAG_HELP: "Setzt den ETag-Header um Änderungen der Seite für Proxies erkenntlich zu machen" VARY_ACCEPT_ENCODING: "Vary Accept Encoding" - VARY_ACCEPT_ENCODING_HELP: 'Setzt den `Vary: Accept Encoding`-Header um Proxies und CDNs zu optimieren' + VARY_ACCEPT_ENCODING_HELP: "Setzt den `Vary: Accept Encoding`-Header um Proxies und CDNs zu optimieren" + MARKDOWN_EXTRA: "Markdown extra" MARKDOWN_EXTRA_HELP: "Aktiviert Markdown Extra Unterstützung - https://michelf.ca/projects/php-markdown/extra/" AUTO_LINE_BREAKS: "Automatische Zeilenumbrüche" AUTO_LINE_BREAKS_HELP: "Aktiviert Unterstützung für automatische Zeilenumbrüche in Markdown" @@ -437,7 +442,7 @@ PLUGIN_ADMIN: REDIRECT_TRAILING_SLASH: "Weiterleiten von nachgestellten '/'" REDIRECT_TRAILING_SLASH_HELP: "Eine 301 Weiterleitung durchführen anstatt nachgestellte '/' transparent zu verarbeiten." DEFAULT_DATE_FORMAT: "Seiten-Datumsformat" - DEFAULT_DATE_FORMAT_HELP: Das von Grav für die Seite verwendete Datumsformat. Standardmässig versucht Grav das Datum anhand Ihrer Herkunft festzulegen. Sie können das Datumsformat mithilfe der PHP Syntax festlegen (z.B. Y-m-d-H:i) + DEFAULT_DATE_FORMAT_HELP: "Das von Grav für die Seite verwendete Datumsformat. Standardmässig versucht Grav das Datum anhand Ihrer Herkunft festzulegen. Sie können das Datumsformat mithilfe der PHP Syntax festlegen (z.B. Y-m-d-H:i)" DEFAULT_DATE_FORMAT_PLACEHOLDER: "Automatisch vorschlagen" IGNORE_FILES: "Dateien ignorieren" IGNORE_FILES_HELP: "Dateien die beim Verarbeiten von Seiten ignoriert werden sollen" @@ -486,7 +491,7 @@ PLUGIN_ADMIN: TWIG_FIRST: "Twig-Verarbeitung zuerst ausführen" TWIG_FIRST_HELP: "Falls Sie die Seiten-Generierung mittels Twig aktiviert haben, können Sie einstellen, ob diese vor oder nach der Markdown-Verarbeitung geschehen soll" SESSION_SECURE: "Sicher" - SESSION_SECURE_HELP: 'Wenn aktiviert muss die Kommunikation für Cookies über eine verschlüsselte Verbindung stattfinden. Warnung: Aktivieren Sie diese Option nur auf Seiten, die ausschließlich auf HTTPS laufen' + SESSION_SECURE_HELP: "Wenn aktiviert muss die Kommunikation für Cookies über eine verschlüsselte Verbindung stattfinden. Warnung: Aktivieren Sie diese Option nur auf Seiten, die ausschließlich auf HTTPS laufen" SESSION_HTTPONLY: "Nur HTTP" SESSION_HTTPONLY_HELP: "Wenn aktiv, werden Cookies nur über HTTP genutzt. Eine Änderung per JavaScript ist nicht erlaubt" REVERSE_PROXY: "Reverse Proxy" @@ -538,13 +543,12 @@ PLUGIN_ADMIN: FRONTMATTER_IGNORE_FIELDS: "Ignoriere Frontmatter Felder" FRONTMATTER_IGNORE_FIELDS_HELP: "Bestimmte Frontmatter Felder können Twig enthalten sollten aber möglicherweise nicht verarbeitet werden, z. B. \"Formulare\"" PACKAGE_X_INSTALLED_SUCCESSFULLY: "Paket %s erfolgreich installiert" - NEEDS_GRAV_1_1: "\nSie nutzen Grav v%s. Bitte aktualisieren Sie auf die aktuellste Version Grav v1.1.x um die Kompatibilität zu gewährleisten. Eventuell müssen Sie in der System Konfiguration auf Test GPM Versionen umstellen." ORDERING_DISABLED_BECAUSE_PARENT_SETTING_ORDER: "Übergeordnete Sortiereinstellung, Sortierung deaktiviert" ORDERING_DISABLED_BECAUSE_PAGE_NOT_VISIBLE: "Seite ist nicht sichtbar, Sortierung deaktiviert" ORDERING_DISABLED_BECAUSE_TOO_MANY_SIBLINGS: "Sortierung via Admin wird nicht unterstützt, weil es mehr als 200 Elemente auf gleicher Ebene gibt" ORDERING_DISABLED_BECAUSE_PAGE_NO_PREFIX: "Die Sortierung ist für diese Seite deaktiviert, weil Numerisches Ordner Präfix nicht aktiviert ist" - CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: 'Hinweis: Sie können keine Medien-Dateien hochladen bis die Seite gespeichert ist. Klicken Sie dazu "Speichern" oben rechts.' - CANNOT_ADD_FILES_PAGE_NOT_SAVED: 'Hinweis: Seite muss gespeichert werden, bevor Sie Dateien hochladen können.' + CANNOT_ADD_MEDIA_FILES_PAGE_NOT_SAVED: "Hinweis: Sie können keine Medien-Dateien hochladen bis die Seite gespeichert ist. Klicken Sie dazu \"Speichern\" oben rechts." + CANNOT_ADD_FILES_PAGE_NOT_SAVED: "Hinweis: Seite muss gespeichert werden, bevor Sie Dateien hochladen können." DROP_FILES_HERE_TO_UPLOAD: "Ziehen Sie Dateien hierauf oder klicken Sie in diesem Bereich" INSERT: "Einfügen" UNDO: "Rückgängigmachen" @@ -589,6 +593,7 @@ PLUGIN_ADMIN: REDIS_SERVER_HELP: "Die Redis-Server-Adresse" REDIS_PORT: "Redis port" REDIS_PORT_HELP: "Der Redis-Server Port" + REDIS_PASSWORD: "Redis Passwort/Geheimnis" ALL: "Alle" FROM: "von" TO: "an" @@ -602,7 +607,7 @@ PLUGIN_ADMIN: SESSION_PATH: "Der Session-Pfad" SESSION_PATH_HELP: "Nur verwenden, wenn Sie eine benutzerdefinierte Base-URL nutzen (rewrite der Site-Domain / Unterordner)" CUSTOM_BASE_URL: "Benutzerdefinierte Base-URL" - CUSTOM_BASE_URL_HELP: 'Verwenden Sie diese Einstellung, wenn ein Rewrite der Site-Domain durchgeführt oder ein anderer Unterordner als der von Grav verwendete genutzt werden soll. Beispiel: http://localhost' + CUSTOM_BASE_URL_HELP: "Verwenden Sie diese Einstellung, wenn ein Rewrite der Site-Domain durchgeführt oder ein anderer Unterordner als der von Grav verwendete genutzt werden soll. Beispiel: http://localhost" FILEUPLOAD_PREVENT_SELF: 'Kann "%s" nicht außerhalb von Seiten verwenden.' FILEUPLOAD_UNABLE_TO_UPLOAD: 'Kann Datei nicht hochladen %s: %s' FILEUPLOAD_UNABLE_TO_MOVE: 'Kann Datei %s nicht nach "%s" verschieben' @@ -637,6 +642,8 @@ PLUGIN_ADMIN: ALLOW_WEBSERVER_GZIP: "Webserver Gzip erlauben" ALLOW_WEBSERVER_GZIP_HELP: "Ist standardmäßig deaktiviert. Wenn diese Option aktiviert ist, wird die WebServer konfigurierte Gzip/Deflate-Komprimierung verwendet, aber die HTTP-Verbindung wird nicht vor dem onShutDown() Ereignis geschlossen, was ein langsameres laden der Seite bedeutet" OFFLINE_WARNING: "Es kann keine Verbindung zu GPM hergestellt werden" + CLEAR_IMAGES_BY_DEFAULT: "Standardmässig wird der image cache gelöscht" + CLEAR_IMAGES_BY_DEFAULT_HELP: "Standardmäßig werden bearbeitete Bilder bei alle Cache-Löschungen gelöscht, dies kann deaktiviert werden" CLI_COMPATIBILITY: "CLI Kompatibilität" CLI_COMPATIBILITY_HELP: "Sorgt dafür, dass nur nicht-flüchtige Cache Treiber verwendet werden (Datei, Redis, Memcache, etc.)" REINSTALL_PLUGIN: "Plugin erneut installieren" @@ -660,15 +667,36 @@ PLUGIN_ADMIN: GPM_OFFICIAL_ONLY_HELP: "Erlauben Sie direkte Installationen nur aus dem offiziellen GPM-Repository." NO_CHILD_TYPE: "Kein Unterseitentyp für diese Rawroute" SORTABLE_PAGES: "Sortierbare Seiten:" - UNSORTABLE_PAGES: "Nicht sortierbare Seiten:" - ADMIN_SPECIFIC_OVERRIDES: "Administrative Anpassugen" + UNSORTABLE_PAGES: "Nicht sortierbare Seiten" + ADMIN_SPECIFIC_OVERRIDES: "Administrative Anpassungen" ADMIN_CHILDREN_DISPLAY_ORDER: "Sortierung der Unterseiten" ADMIN_CHILDREN_DISPLAY_ORDER_HELP: "Die Reihenfolge, die vom Admin Plugin verwendet werden soll um Unterseiten in der \"Seiten\" Ansicht anzuzeigen" PWD_PLACEHOLDER: "komplexe Zeichenfolge mindestens 8 Zeichen lang" PWD_REGEX: "Regulärer Ausdruck für Passwörter" - PWD_REGEX_HELP: 'Standard: Das Passwort muss mindestens eine Zahl, einen Groß- und einen Kleinbuchstaben enthalten sowie mindestens 8 Zeichen lang sein' + PWD_REGEX_HELP: "Standard: Das Passwort muss mindestens eine Zahl, einen Groß- und einen Kleinbuchstaben enthalten sowie mindestens 8 Zeichen lang sein" USERNAME_PLACEHOLDER: "nur Kleinbuchstaben, z.B. 'admin'" USERNAME_REGEX: "Regulärer Ausdruck für Benutzernamen" - USERNAME_REGEX_HELP: 'Standard: nur Kleinbuchstaben, Ziffern, Bindestriche und Unterstriche. 3 - 16 Zeichen' + USERNAME_REGEX_HELP: "Standard: nur Kleinbuchstaben, Ziffern, Bindestriche und Unterstriche. 3 - 16 Zeichen" CONTENT_PADDING: "Abstand um Inhalte" CONTENT_PADDING_HELP: "Abstand um Inhalte aktivieren/deaktivieren um mehr Platz anzubieten" + ENABLE_AUTO_METADATA: "Auto-Metadaten aus Exif" + ENABLE_AUTO_METADATA_HELP: "Automatische Generierung von Metadaten-Dateien für Bilder mit Exif-Informationen" + 2FA_TITLE: "2-Faktor-Authentifizierung" + 2FA_INSTRUCTIONS: "##### 2-Faktor-Authentifizierung\nSie haben **2FA** für dieses Konto aktiviert. Bitte benutzen Sie Ihre **2FA** App, um den aktuellen **6-stelligen Code** einzugeben, um den Anmeldevorgang abzuschließen." + 2FA_LABEL: "Admin Zugriff" + 2FA_FAILED: "Ungültiger 2-Faktor-Authentifizierungscode, bitte versuchen Sie es erneut..." + 2FA_ENABLED: "Zwei-Faktor-Authentifizierung aktiviert" + 2FA_CODE_INPUT: "000000" + 2FA_SECRET: "Zwei-Faktor-Authentifizierung Geheimnis" + 2FA_REGENERATE: "Erneuern" + FORCE_LOWERCASE_URLS: "Erzwingen von Kleinbuchstaben-URLs" + INTL_ENABLED: "Intl Modulintegration" + VIEW_SITE_TIP: "Seite anzeigen" + TOOLS_DIRECT_INSTALL_TITLE: "Direktinstallation von Grav-Paketen" + TOOLS_DIRECT_INSTALL_UPLOAD_TITLE: "Paket mittels \"Direct ZIP Upload\" installieren" + TOOLS_DIRECT_INSTALL_URL_TITLE: "Paket mittels \"Remote URL Reference\" installieren" + TOOLS_DIRECT_INSTALL_URL_DESC: "Alternativ können Sie auch eine vollständige URL zu der gezippten Paketdatei angeben um das Paket über eine Fremd-URL zu installieren." + TOOLS_DIRECT_INSTALL_UPLOAD_BUTTON: "Hochladen und installieren" + ROUTE_DEFAULT: "Standardroute" + ROUTE_ALIASES: "Routen-Aliase" + diff --git a/languages/el.yaml b/languages/el.yaml index 36e4f7af..d37ac902 100644 --- a/languages/el.yaml +++ b/languages/el.yaml @@ -1,29 +1,29 @@ --- PLUGIN_ADMIN: - ADMIN_BETA_MSG: "Αυτή είναι μία έκδοση Beta! Χρησιμοποιήστε την στην Παραγωγή με δικό σας ρίσκο..." + ADMIN_BETA_MSG: "Αυτή είναι δοκιμαστική έκδοση (beta)! Χρησιμοποιήστε την στην παραγωγή με δική σας ευθύνη..." ADMIN_REPORT_ISSUE: "Βρήκατε κάποιο πρόβλημα; Παρακαλείστε να το αναφέρετε στο GitHub." EMAIL_FOOTER: " με την ισχύ του Grav - Το μοντέρνο CMS χωρίς τη χρήση Βάσης Δεδομένων" LOGIN_BTN: "Σύνδεση" LOGIN_BTN_FORGOT: "Το ξέχασα" - LOGIN_BTN_RESET: "Επαναφορά Κωδικού Πρόσβασης" - LOGIN_BTN_SEND_INSTRUCTIONS: "Αποστολή Οδηγιών Επαναφοράς" + LOGIN_BTN_RESET: "Επαναφορά συνθηματικού" + LOGIN_BTN_SEND_INSTRUCTIONS: "Αποστολή οδηγιών επαναφοράς" LOGIN_BTN_CLEAR: "Καθαρισμός Φόρμας" - LOGIN_BTN_CREATE_USER: "Δημιουργία Χρήστη" + LOGIN_BTN_CREATE_USER: "Δημιουργία χρήστη" LOGIN_LOGGED_IN: "Έχετε συνδεθεί με επιτυχία" LOGIN_FAILED: "Αποτυχία Σύνδεσης" LOGGED_OUT: "Έχετε αποσυνδεθεί" - RESET_NEW_PASSWORD: "Παρακαλούμε εισάγετε έναν νέο κωδικό πρόσβασης …" + RESET_NEW_PASSWORD: "Παρακαλούμε εισαγάγετε νέο συνθηματικό …" RESET_LINK_EXPIRED: "Ο σύνδεσμος επαναφοράς έχει λήξει, παρακαλώ προσπαθήστε ξανά" - RESET_PASSWORD_RESET: "Έχει γίνει επαναφορά κωδικού πρόσβασης" + RESET_PASSWORD_RESET: "Έχει γίνει επαναφορά του συνθηματικού" RESET_INVALID_LINK: "Ο σύνδεσμος γιά την επαναφορά δεν είναι έγκυρος, παρακαλώ προσπαθήστε πάλι" - FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Οδηγίες για να επαναφέρετε τον κωδικό πρόσβασής σας έχουν σταλεί μέσω ηλεκτρονικού ταχυδρομείου σε %s" + FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Οι οδηγίες για να επαναφέρετε το συνθηματικό σας έχουν σταλεί στη διεύθυνση ηλεκτρονικού σας ταχυδρομείου" FORGOT_FAILED_TO_EMAIL: "Απέτυχε η αποστολή οδηγιών με email, παρακαλώ προσπαθήστε ξανά αργότερα" - FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Δεν είναι δυνατό να επαναφέρετε τον κωδικό πρόσβασης για το %s, δεν έχει οριστεί η διεύθυνση ηλεκτρονικού ταχυδρομείου" + FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Δεν είναι δυνατή η επαναφορά του συνθηματικού για %s, δεν έχει καθοριστεί διεύθυνση ηλεκτρονικού ταχυδρομείου" FORGOT_USERNAME_DOES_NOT_EXIST: "Χρήστης με όνομα χρήστη %s δεν υπάρχει" - FORGOT_EMAIL_NOT_CONFIGURED: "Δεν είναι δυνατό να επαναφέρετε τον κωδικό πρόσβασης. Αυτό το site δεν έχει ρυθμιστεί για να στέλνετε μηνύματα ηλεκτρονικού ταχυδρομείου" + FORGOT_EMAIL_NOT_CONFIGURED: "Δεν είναι δυνατή η επαναφορά του συνθηματικού σας. Αυτός ο ιστότοπος δεν έχει ρυθμιστεί για αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου" FORGOT_EMAIL_SUBJECT: "%s Αίτηση Επαναφοράς Κωδικού Πρόσβασης" - FORGOT_EMAIL_BODY: "

Επαναφορά Κωδικού Πρόσβασης

Αγαπητέ %1$s,

Έγινε μία αίτηση στις %4$s για να επαναφέρετε τον κωδικό πρόσβασής σας.

< br / > Κάντε κλικ εδώ για να επαναφέρετε τον κωδικό πρόσβασής σας < br / > < br / >

Εναλλακτικά, αντιγράψτε την ακόλουθη διεύθυνση URL στη γραμμή διευθύνσεων του προγράμματος περιήγησής σας:

%2$s

< br / > Με τιμή, < br / > < br / >%3$s

" - MANAGE_PAGES: "Διαχείριση Σελίδων" + FORGOT_EMAIL_BODY: "

Επαναφορά συνθηματικού

Αγαπητέ/ή %1$s,

Έγινε μία αίτηση στις %4$s για επαναφορά του συνθηματικού σας.

< br / > Κάντε κλικ εδώ για να επαναφέρετε το συνθηματικό σας < br / > < br / >

Εναλλακτικά, αντιγράψτε την ακόλουθη διεύθυνση URL στη γραμμή διευθύνσεων του προγράμματος περιήγησής σας:

%2$s

< br / > Με εκτίμηση, < br / > < br / >%3$s

" + MANAGE_PAGES: "Διαχείριση σελίδων" CONFIGURATION: "Διαμόρφωση" PAGES: "Σελίδες" PLUGINS: "Πρόσθετα" @@ -33,7 +33,7 @@ PLUGIN_ADMIN: BACK: "Επιστροφή" NEXT: "Επόμενο" PREVIOUS: "Προηγούμενο" - ADD_PAGE: "Προσθήκη Σελίδας" + ADD_PAGE: "Προσθήκη σελίδας" ADD_MODULAR: "Προσθέστε Modular" MOVE: "Μετακίνηση" DELETE: "Διαγραφή" @@ -42,7 +42,7 @@ PLUGIN_ADMIN: NORMAL: "Κανονικό" EXPERT: "Ειδικός" EXPAND_ALL: "Ανάπτυξη Όλων" - COLLAPSE_ALL: "Σύμπτυξη Όλων" + COLLAPSE_ALL: "Σύμπτυξη όλων" ERROR: "Σφάλμα" CLOSE: "Κλείσιμο" CANCEL: "Ακύρωση" @@ -52,10 +52,10 @@ PLUGIN_ADMIN: MODAL_CHANGED_DETECTED_DESC: "Έχετε μη αποθηκευμένες αλλαγές. Είστε βέβαιοι ότι θέλετε να φύγετε χωρίς να γίνει αποθήκευση;" MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: "Απαιτείται Επιβεβαίωση" MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το αρχείο; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί." - ADD_FILTERS: "Προσθήκη Φίλτρων" - SEARCH_PAGES: "Σελίδες Αναζήτησης" + ADD_FILTERS: "Προσθήκη φίλτρων" + SEARCH_PAGES: "Αναζήτηση στις σελίδες" VERSION: "Έκδοση" - WAS_MADE_WITH: "Δημιουργήθηκε με το" + WAS_MADE_WITH: "Δημιουργήθηκε με" BY: "Από" UPDATE_THEME: "Ενημέρωση Θέματος" UPDATE_PLUGIN: "Ενημέρωση Προσθέτου" @@ -95,17 +95,17 @@ PLUGIN_ADMIN: MAINTENANCE: "Συντήρηση" UPDATED: "Ενημερωμένο" MON: "Δευ" - TUE: "Τρι" + TUE: "Τρί" WED: "Τετ" - THU: "Πεμ" + THU: "Πέμ" FRI: "Παρ" - SAT: "Σαβ" + SAT: "Σάβ" SUN: "Κυρ" COPY: "Αντιγραφή" EDIT: "Επεξεργασία" CREATE: "Δημιουργία" GRAV_ADMIN: "Διαχειριστής του Grav" - GRAV_OFFICIAL_PLUGIN: "Επίσημο Πρόσθετο του Grav" + GRAV_OFFICIAL_PLUGIN: "Επίσημο πρόσθετο του Grav" GRAV_OFFICIAL_THEME: "Επίσημο Θέμα του Grav" PLUGIN_SYMBOLICALLY_LINKED: "Αυτό το πρόσθετο είναι συμβολικά συνδεδεμένο. Οποιεσδήποτε ενημερώσεις δεν θα εντοπιστούν." THEME_SYMBOLICALLY_LINKED: "Αυτό το θέμα είναι συμβολικά συνδεδεμένο. Οποιεσδήποτε ενημερώσεις δεν θα εντοπιστούν" @@ -118,23 +118,23 @@ PLUGIN_ADMIN: SWITCHING_TO: "Μετάβαση σε" SWITCHING_TO_DESCRIPTION: "Εάν αλλάξετε το θέμα, δεν υπάρχει καμία εγγύηση ότι θα υποστηρίζονται όλα τα layouts σελίδων, ενδεχομένως προκαλώντας σφάλματα όταν θα φορτώσουν οι σελίδες αυτές." SWITCHING_TO_CONFIRMATION: "Θέλετε να συνεχίσετε και να μεταβείτε στο θέμα" - CREATE_NEW_USER: "Δημιουργία Νέου Χρήστη" - REMOVE_USER: "Διαγραφή Χρήστη" + CREATE_NEW_USER: "Δημιουργία νέου χρήστη" + REMOVE_USER: "Διαγραφή χρήστη" ACCESS_DENIED: "Απαγορεύεται η Πρόσβαση" ACCOUNT_NOT_ADMIN: "ο λογαριασμός σας δεν έχει δικαιώματα διαχειριστή" PHP_INFO: "Πληροφορίες της PHP" INSTALLER: "Πρόγραμμα εγκατάστασης" AVAILABLE_THEMES: "Διαθέσιμα Θέματα" - AVAILABLE_PLUGINS: "Διαθέσιμα Πρόσθετα" + AVAILABLE_PLUGINS: "Διαθέσιμα πρόσθετα" INSTALLED_THEMES: "Εγκατεστημένα Θέματα" - INSTALLED_PLUGINS: "Εγκατεστημένα Πρόσθετα" + INSTALLED_PLUGINS: "Εγκατεστημένα πρόσθετα" BROWSE_ERROR_LOGS: "Περιήγηση στα αρχεία σφαλμάτων" - SITE: "Ιστοσελίδα" + SITE: "Ιστότοπος" INFO: "Πληροφορίες" SYSTEM: "Σύστημα" USER: "Χρήστης" - ADD_ACCOUNT: "Προσθήκη Λογαριασμού" - SWITCH_LANGUAGE: "Αλλαγή γλώσσας" + ADD_ACCOUNT: "Προσθήκη λογαριασμού" + SWITCH_LANGUAGE: "Εναλλαγή γλώσσας" SUCCESSFULLY_ENABLED_PLUGIN: "Το πρόσθετο ενεργοποιήθηκε με επιτυχία" SUCCESSFULLY_DISABLED_PLUGIN: "Το πρόσθετο απενεργοποιήθηκε με επιτυχία" SUCCESSFULLY_CHANGED_THEME: "Έγινε επιτυχής αλλαγή του προεπιλεγμένου θέματος" @@ -176,30 +176,30 @@ PLUGIN_ADMIN: AVATAR_UPLOAD_OWN: "Ή ανέβασε το δικό σου avatar..." LAST_BACKUP: "Τελευταία δημιουργία αντιγράφων ασφαλείας" FULL_NAME: "Ονοματεπώνυμο" - USERNAME: "Όνομα Χρήστη" + USERNAME: "Όνομα χρήστη" EMAIL: "Διεύθυνση ηλεκτρονικού ταχυδρομείου" - USERNAME_EMAIL: "Όνομα χρήστη ή email" - PASSWORD: "Κωδικός Πρόσβασης" - PASSWORD_CONFIRM: "Επιβεβαίωση Κωδικού" + USERNAME_EMAIL: "Όνομα χρήστη ή διεύθυνση ηλεκτρονικού ταχυδρομείου" + PASSWORD: "Συνθηματικό" + PASSWORD_CONFIRM: "Επιβεβαίωση συνθηματικού" TITLE: "Τίτλος" LANGUAGE: "Γλώσσα" ACCOUNT: "Λογαριασμός" EMAIL_VALIDATION_MESSAGE: "Πρέπει να είναι μια έγκυρη διεύθυνση email" - PASSWORD_VALIDATION_MESSAGE: "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον έναν αριθμό και ένα κεφαλαίο και πεζό γράμμα, και τουλάχιστον 8 ή περισσότερους χαρακτήρες" + PASSWORD_VALIDATION_MESSAGE: "Το συνθηματικό πρέπει να περιέχει τουλάχιστον έναν αριθμό, ένα κεφαλαίο και ένα πεζό γράμμα και τουλάχιστον 8 ή περισσότερους χαρακτήρες" LANGUAGE_HELP: "Ορίστε την αγαπημένη γλώσσα" MEDIA: "Πολυμέσα" DEFAULTS: "Προεπιλογές" SITE_TITLE: "Τίτλος Ιστοχώρου" SITE_TITLE_PLACEHOLDER: "Τίτλος σε όλο τον ιστοχώρο" SITE_TITLE_HELP: "Προεπιλεγμένος τίτλος για το site σας, χρησιμοποιείται συχνά στα θέματα" - SITE_DEFAULT_LANG: "Προεπιλεγμένη Γλώσσα" + SITE_DEFAULT_LANG: "Προεπιλεγμένη γλώσσα" SITE_DEFAULT_LANG_PLACEHOLDER: "Προεπιλεγμένη γλώσσα που θα χρησιμοποιείται από tag του θέματος" SITE_DEFAULT_LANG_HELP: "Προεπιλεγμένη γλώσσα που θα χρησιμοποιείται από tag του θέματος" - DEFAULT_AUTHOR: "Προεπιλεγμένος Συντάκτης" + DEFAULT_AUTHOR: "Προεπιλεγμένος συντάκτης" DEFAULT_AUTHOR_HELP: "Ένα προεπιλεγμένο όνομα συντάκτη, που χρησιμοποιείται συχνά στα θέματα ή στο περιεχόμενο της σελίδας" - DEFAULT_EMAIL: "Προεπιλεγμένο Ηλεκτρονικό Ταχυδρομείο" + DEFAULT_EMAIL: "Προεπιλεγμένη διεύθυνση ηλεκτρονικού ταχυδρομείου" DEFAULT_EMAIL_HELP: "Μία ηλεκτρονική διεύθυνση email για να χρησιμοποιηθεί σε θέματα ή σελίδες" - TAXONOMY_TYPES: "Τύποι Ταξινομίας" + TAXONOMY_TYPES: "Τύποι ταξινομίας" TAXONOMY_TYPES_HELP: "Τύποι ταξινόμησης πρέπει να οριστούν εδώ εάν θέλετε να τους χρησιμοποιήσετε σε σελίδες" PAGE_SUMMARY: "Περίληψη Σελίδας" ENABLED: "Ενεργοποιημένη" @@ -232,15 +232,15 @@ PLUGIN_ADMIN: PAGE_MEDIA: "Σελίδα Media" OPTIONS: "Επιλογές" PUBLISHED: "Δημοσιευμένο" - PUBLISHED_HELP: 'Από προεπιλογή, μια σελίδα δημοσιεύεται κατευθείαν, εκτός αν ορίσετε την επιλογή published: false, εάν το publish_date αναφέρεται σε μελλοντική στιγμή, ή αν το unpublish_date αναφέρεται στο παρελθόν' + PUBLISHED_HELP: "Από προεπιλογή, μια σελίδα δημοσιεύεται κατευθείαν, εκτός αν ορίσετε την επιλογή published: false, εάν το publish_date αναφέρεται σε μελλοντική στιγμή, ή αν το unpublish_date αναφέρεται στο παρελθόν" DATE: "Ημερομηνία" DATE_HELP: "Η μεταβλητή date σας επιτρέπει να ορίσετε συγκεκριμένα μία ημερομηνία που να σχετίζεται με τη σελίδα αυτή." - PUBLISHED_DATE: "Ημερομηνία Δημοσίευσης" + PUBLISHED_DATE: "Ημερομηνία δημοσίευσης" PUBLISHED_DATE_HELP: "Μπορεί να δοθεί μία ημερομηνία για την αυτόματη δημοσίευση της ανάρτησης." UNPUBLISHED_DATE: "Ημερομηνία παύσης δημοσίευσης" UNPUBLISHED_DATE_HELP: "Μπορεί να δοθεί μία ημερομηνία για την αυτόματη ιδιωτικοποίηση της ανάρτησης." ROBOTS: "Ρομπότ" - TAXONOMIES: "Ταξινομήσεις" + TAXONOMIES: "Ταξινομίες" TAXONOMY: "Ταξινομία" ADVANCED: "Γιά Προχωρημένους" SETTINGS: "Ρυθμίσεις" @@ -278,19 +278,19 @@ PLUGIN_ADMIN: FOLDER: "Φάκελος" ASCENDING: "Αύξουσα" DESCENDING: "Φθίνουσα" - ADD_MODULAR_CONTENT: "Προσθέστε Αρθρωτό Περιεχόμενο" - PAGE_TITLE: "Τίτλος Σελίδας" + ADD_MODULAR_CONTENT: "Προσθήκη σπονδυλωτού περιεχομένου" + PAGE_TITLE: "Τίτλος σελίδας" PAGE_TITLE_HELP: "Ο τίτλος της σελίδας" PAGE: "Σελίδα" - MODULAR_TEMPLATE: "Σπονδυλωτό Πρότυπο" + MODULAR_TEMPLATE: "Σπονδυλωτό πρότυπο" FRONTMATTER: "Frontmatter" - FILENAME: "Όνομα Αρχείου" - PARENT_PAGE: "Γονική Σελίδα" - HOME_PAGE: "Αρχική Σελίδα" + FILENAME: "Όνομα αρχείου" + PARENT_PAGE: "Γονική σελίδα" + HOME_PAGE: "Αρχική σελίδα" HOME_PAGE_HELP: "Η σελίδα που το Grav θα χρησιμοποιήσει ως προεπιλεγμένη σελίδα προσγείωσης" DEFAULT_THEME: "Προεπιλεγμένο Θέμα" DEFAULT_THEME_HELP: "Ορίσετε το προεπιλεγμένο θέμα που θα χρησιμοποιεί το Grav (η προεπιλογή είναι το θέμα Antimatter)" - TIMEZONE: "Ζώνη Ώρας" + TIMEZONE: "Ζώνη ώρας" TIMEZONE_HELP: "Παράκαμψη της προεπιλεγμένης ζώνης ώρας του διακομιστή" SHORT_DATE_FORMAT: "Σύντομη μορφή ημερομηνίας" SHORT_DATE_FORMAT_HELP: "Ρύθμισε τη σύντομη μορφή ημερομηνίας που θα χρησιμοποιείται από τα θέματα" @@ -314,7 +314,7 @@ PLUGIN_ADMIN: REDIRECT_DEFAULT_ROUTE_HELP: "Αυτόματη ανακατεύθυνση στην προεπιλεγμένη διαδρομή μιας σελίδας" LANGUAGES: "Γλώσσες" SUPPORTED: "Υποστηρίζεται" - SUPPORTED_HELP: "Λίστα κωδικών γλωσσών με 2 γράμματα, χωρισμένες με κόμμα (π.χ. 'en,fr,de')" + SUPPORTED_HELP: "Λίστα χωρισμένη με κόμματα κωδικών γλωσσών 2 γραμμάτων (π.χ. 'en,fr,de')" TRANSLATIONS_ENABLED: "Οι μεταφράσεις είναι ενεργοποιημένες" TRANSLATIONS_ENABLED_HELP: "Υποστήριξη μεταφράσεων του Grav, πρόσθετων και επεκτάσεων" TRANSLATIONS_FALLBACK: "Εναλλακτική μετάφραση" @@ -331,8 +331,11 @@ PLUGIN_ADMIN: ETAG: "ETag" ETAG_HELP: "Καθορίζει την κεφαλίδα etag για να βοηθήσει στον εντοπισμό όταν μια σελίδα έχει τροποποιηθεί" VARY_ACCEPT_ENCODING: "Ποικίλλει η δεκτή κωδικοποίηση" - VARY_ACCEPT_ENCODING_HELP: 'Ορίζει την κεφαλίδα «Ποικίλλει: Δεκτή Κωδικοποίηση» για να βοηθήσει με το διακομιστή μεσολάβησης και την προσωρινή αποθήκευση CDN' + VARY_ACCEPT_ENCODING_HELP: "Ορίζει την κεφαλίδα «Ποικίλλει: Δεκτή Κωδικοποίηση» για να βοηθήσει με το διακομιστή μεσολάβησης και την προσωρινή αποθήκευση CDN" + MARKDOWN_EXTRA: "Markdown extra" MARKDOWN_EXTRA_HELP: "Ενεργοποιήσετε την προεπιλεγμένη υποστήριξη για Markdown Extra - https://michelf.ca/projects/php-markdown/extra/" + MARKDOWN_EXTRA_ESCAPE_FENCES: "Διάφυγε τα HTML στοιχεία σε markdown extra fences" + MARKDOWN_EXTRA_ESCAPE_FENCES_HELP: "Διαφεύγει τα HTML στοιχεία σε markdown extra fences" AUTO_LINE_BREAKS: "Αυτόματες αλλαγές γραμμών" AUTO_LINE_BREAKS_HELP: "Ενεργοποιήσετε την υποστήριξη για αυτόματη αλλαγή γραμμής στη markdown" AUTO_URL_LINKS: "Αυτόματες συνδέσεις URL" @@ -349,7 +352,7 @@ PLUGIN_ADMIN: CACHE_PREFIX_PLACEHOLDER: "Προέρχεται από τη βασική διεύθυνση URL (παράκαμψη εισάγοντας τυχαία συμβολοσειρά)" LIFETIME: "Διάρκεια ζωής" LIFETIME_HELP: "Ορίζει τη διάρκεια ζωής της cache σε δευτερόλεπτα. 0 = άπειρο" - GZIP_COMPRESSION: "GZIP συμπίεση" + GZIP_COMPRESSION: "Συμπίεση Gzip" GZIP_COMPRESSION_HELP: "Ενεργοποιήστε τη GZip συμπίεση της σελίδας του Grav για αυξημένη απόδοση." TWIG_TEMPLATING: "Πρότυπα Twig" TWIG_CACHING: "Προσωρινή αποθήκευση Twig" @@ -435,13 +438,13 @@ PLUGIN_ADMIN: USERNAME_HELP: "Το όνομα χρήστη πρέπει να είναι μεταξύ 3 και 16 χαρακτήρες, με πεζά, αριθμούς, κάτω παύλες και ενωτικά. Κεφαλαία γράμματα, διαστήματα και ειδικοί χαρακτήρες δεν επιτρέπονται" FULLY_UPDATED: "Πλήρως Ενημερωμένο" SAVE_LOCATION: "Τοποθεσία Αποθήκευσης" - PAGE_FILE: "Πρότυπο Σελίδας" + PAGE_FILE: "Πρότυπο σελίδας" PAGE_FILE_HELP: "Ονομασία αρχείου προτύπου σελίδας, και από προεπιλογή το πρότυπο εμφάνισης για αυτή τη σελίδα" NO_USER_ACCOUNTS: "Δεν βρέθηκε κανένας λογαριασμός χρήστη, παρακαλώ δημιουργήστε έναν πρώτα..." REDIRECT_TRAILING_SLASH: "Ανακατευθύνει την τελική κάθετο" REDIRECT_TRAILING_SLASH_HELP: "Εκτέλεσε μια ανακατεύθυνση 301 αντί για διαφανή χειρισμό των καταληκτικών καθέτων URIs." DEFAULT_DATE_FORMAT: "Μορφή ημερομηνίας σελίδας" - DEFAULT_DATE_FORMAT_HELP: Μορφή ημερομηνίας σελίδας που χρησιμοποιείται από το Grav. Από προεπιλογή, το Grav επιχειρεί να μαντέψει τη μορφή, εντούτοις μπορείτε να ορίσετε μορφή σύμφωνα με τη σύνταξη PHP + DEFAULT_DATE_FORMAT_HELP: "Μορφή ημερομηνίας σελίδας που χρησιμοποιείται από το Grav. Από προεπιλογή, το Grav επιχειρεί να μαντέψει τη μορφή, εντούτοις μπορείτε να ορίσετε μορφή σύμφωνα με τη σύνταξη PHP" DEFAULT_DATE_FORMAT_PLACEHOLDER: "Μάντεψε αυτόματα" IGNORE_FILES: "Αγνόηση αρχείων" IGNORE_FILES_HELP: "Συγκεκριμένα αρχεία που θα αγνοηθούν κατά την επεξεργασία σελίδων" @@ -472,7 +475,7 @@ PLUGIN_ADMIN: APPEND_URL_EXT_HELP: "Θα προσθέσει μια προσαρμοσμένη επέκταση στο URL της Σελίδας. Σημείωση, αυτό θα σημαίνει ότι το Grav θα αναζητήσει '