home page start
This commit is contained in:
parent
a127e80bd4
commit
9489f49958
2
artisan
2
artisan
|
|
@ -28,7 +28,7 @@ $app = require_once __DIR__.'/bootstrap/app.php';
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
|
$kernel = $app->make('Illuminate\Contracts\Console\Kernel');
|
||||||
|
|
||||||
$status = $kernel->handle(
|
$status = $kernel->handle(
|
||||||
$input = new Symfony\Component\Console\Input\ArgvInput,
|
$input = new Symfony\Component\Console\Input\ArgvInput,
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ $app = require_once __DIR__.'/bootstrap/app.php';
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
|
$kernel = $app->make('Illuminate\Contracts\Http\Kernel');
|
||||||
|
|
||||||
$response = $kernel->handle(
|
$response = $kernel->handle(
|
||||||
$request = Illuminate\Http\Request::capture()
|
$request = Illuminate\Http\Request::capture()
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,6 @@ class ServiceProvider extends ModuleServiceProvider
|
||||||
$combiner->registerBundle('~/modules/backend/formwidgets/colorpicker/assets/less/colorpicker.less');
|
$combiner->registerBundle('~/modules/backend/formwidgets/colorpicker/assets/less/colorpicker.less');
|
||||||
$combiner->registerBundle('~/modules/backend/formwidgets/permissioneditor/assets/less/permissioneditor.less');
|
$combiner->registerBundle('~/modules/backend/formwidgets/permissioneditor/assets/less/permissioneditor.less');
|
||||||
$combiner->registerBundle('~/modules/backend/formwidgets/markdowneditor/assets/less/markdowneditor.less');
|
$combiner->registerBundle('~/modules/backend/formwidgets/markdowneditor/assets/less/markdowneditor.less');
|
||||||
$combiner->registerBundle('~/modules/backend/formwidgets/sensitive/assets/less/sensitive.less');
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rich Editor is protected by DRM
|
* Rich Editor is protected by DRM
|
||||||
|
|
@ -165,16 +164,10 @@ class ServiceProvider extends ModuleServiceProvider
|
||||||
'backend.manage_editor' => [
|
'backend.manage_editor' => [
|
||||||
'label' => 'system::lang.permissions.manage_editor',
|
'label' => 'system::lang.permissions.manage_editor',
|
||||||
'tab' => 'system::lang.permissions.name',
|
'tab' => 'system::lang.permissions.name',
|
||||||
'roles' => UserRole::CODE_DEVELOPER,
|
|
||||||
],
|
|
||||||
'backend.manage_own_editor' => [
|
|
||||||
'label' => 'system::lang.permissions.manage_own_editor',
|
|
||||||
'tab' => 'system::lang.permissions.name',
|
|
||||||
],
|
],
|
||||||
'backend.manage_branding' => [
|
'backend.manage_branding' => [
|
||||||
'label' => 'system::lang.permissions.manage_branding',
|
'label' => 'system::lang.permissions.manage_branding',
|
||||||
'tab' => 'system::lang.permissions.name',
|
'tab' => 'system::lang.permissions.name',
|
||||||
'roles' => UserRole::CODE_DEVELOPER,
|
|
||||||
],
|
],
|
||||||
'media.manage_media' => [
|
'media.manage_media' => [
|
||||||
'label' => 'backend::lang.permissions.manage_media',
|
'label' => 'backend::lang.permissions.manage_media',
|
||||||
|
|
@ -209,7 +202,6 @@ class ServiceProvider extends ModuleServiceProvider
|
||||||
$manager->registerFormWidget('Backend\FormWidgets\TagList', 'taglist');
|
$manager->registerFormWidget('Backend\FormWidgets\TagList', 'taglist');
|
||||||
$manager->registerFormWidget('Backend\FormWidgets\MediaFinder', 'mediafinder');
|
$manager->registerFormWidget('Backend\FormWidgets\MediaFinder', 'mediafinder');
|
||||||
$manager->registerFormWidget('Backend\FormWidgets\NestedForm', 'nestedform');
|
$manager->registerFormWidget('Backend\FormWidgets\NestedForm', 'nestedform');
|
||||||
$manager->registerFormWidget('Backend\FormWidgets\Sensitive', 'sensitive');
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -679,10 +679,9 @@ nav#layout-mainmenu .toolbar-item:before {left:-12px}
|
||||||
nav#layout-mainmenu .toolbar-item:after {right:-12px}
|
nav#layout-mainmenu .toolbar-item:after {right:-12px}
|
||||||
nav#layout-mainmenu .toolbar-item.scroll-active-before:before {color:#fff}
|
nav#layout-mainmenu .toolbar-item.scroll-active-before:before {color:#fff}
|
||||||
nav#layout-mainmenu .toolbar-item.scroll-active-after:after {color:#fff}
|
nav#layout-mainmenu .toolbar-item.scroll-active-after:after {color:#fff}
|
||||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action {margin:0}
|
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview {margin:0 0 0 21px}
|
||||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action:first-child {margin-left:21px}
|
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview i {font-size:20px}
|
||||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action i {font-size:20px}
|
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-preview a {position:relative;padding:0 10px;top:-1px}
|
||||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-quick-action a {position:relative;padding:0 10px;top:-1px}
|
|
||||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account {margin-right:0}
|
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account {margin-right:0}
|
||||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account >a {padding:0 15px 0 10px;font-size:13px;position:relative}
|
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account >a {padding:0 15px 0 10px;font-size:13px;position:relative}
|
||||||
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account.highlight >a {z-index:600}
|
nav#layout-mainmenu ul.mainmenu-toolbar li.mainmenu-account.highlight >a {z-index:600}
|
||||||
|
|
@ -707,8 +706,8 @@ nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:active:after {c
|
||||||
nav#layout-mainmenu ul li .mainmenu-accountmenu li.divider {height:1px;width:100%;background-color:#e0e0e0}
|
nav#layout-mainmenu ul li .mainmenu-accountmenu li.divider {height:1px;width:100%;background-color:#e0e0e0}
|
||||||
nav#layout-mainmenu.navbar-mode-inline,
|
nav#layout-mainmenu.navbar-mode-inline,
|
||||||
nav#layout-mainmenu.navbar-mode-inline_no_icons {height:60px}
|
nav#layout-mainmenu.navbar-mode-inline_no_icons {height:60px}
|
||||||
nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-quick-action a,
|
nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-preview a,
|
||||||
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-quick-action a {height:60px;line-height:60px}
|
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-preview a {height:60px;line-height:60px}
|
||||||
nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-account >a,
|
nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-toolbar li.mainmenu-account >a,
|
||||||
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-account >a {height:60px;line-height:60px}
|
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-toolbar li.mainmenu-account >a {height:60px;line-height:60px}
|
||||||
nav#layout-mainmenu.navbar-mode-inline ul li .mainmenu-accountmenu,
|
nav#layout-mainmenu.navbar-mode-inline ul li .mainmenu-accountmenu,
|
||||||
|
|
@ -731,7 +730,7 @@ nav#layout-mainmenu.navbar-mode-inline ul.mainmenu-nav li:last-child,
|
||||||
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li:last-child {margin-right:0}
|
nav#layout-mainmenu.navbar-mode-inline_no_icons ul.mainmenu-nav li:last-child {margin-right:0}
|
||||||
nav#layout-mainmenu.navbar-mode-inline_no_icons .nav-icon {display:none !important}
|
nav#layout-mainmenu.navbar-mode-inline_no_icons .nav-icon {display:none !important}
|
||||||
nav#layout-mainmenu.navbar-mode-tile {height:78px}
|
nav#layout-mainmenu.navbar-mode-tile {height:78px}
|
||||||
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-quick-action a {height:78px;line-height:78px}
|
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-preview a {height:78px;line-height:78px}
|
||||||
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-account >a {height:78px;line-height:78px}
|
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-toolbar li.mainmenu-account >a {height:78px;line-height:78px}
|
||||||
nav#layout-mainmenu.navbar-mode-tile ul li .mainmenu-accountmenu {top:88px}
|
nav#layout-mainmenu.navbar-mode-tile ul li .mainmenu-accountmenu {top:88px}
|
||||||
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a {position:relative;width:65px;height:65px}
|
nav#layout-mainmenu.navbar-mode-tile ul.mainmenu-nav li a {position:relative;width:65px;height:65px}
|
||||||
|
|
@ -750,14 +749,14 @@ nav#layout-mainmenu .menu-toggle .menu-toggle-title {margin-left:10px}
|
||||||
nav#layout-mainmenu .menu-toggle:hover .menu-toggle-icon {opacity:1}
|
nav#layout-mainmenu .menu-toggle:hover .menu-toggle-icon {opacity:1}
|
||||||
body.mainmenu-open nav#layout-mainmenu .menu-toggle-icon {opacity:1}
|
body.mainmenu-open nav#layout-mainmenu .menu-toggle-icon {opacity:1}
|
||||||
nav#layout-mainmenu.navbar-mode-collapse {padding-left:0;height:45px}
|
nav#layout-mainmenu.navbar-mode-collapse {padding-left:0;height:45px}
|
||||||
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-quick-action a {height:45px;line-height:45px}
|
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-preview a {height:45px;line-height:45px}
|
||||||
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account >a {height:45px;line-height:45px}
|
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account >a {height:45px;line-height:45px}
|
||||||
nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu {top:55px}
|
nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu {top:55px}
|
||||||
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account >a {padding-right:0}
|
nav#layout-mainmenu.navbar-mode-collapse ul.mainmenu-toolbar li.mainmenu-account >a {padding-right:0}
|
||||||
nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu:after {right:13px}
|
nav#layout-mainmenu.navbar-mode-collapse ul li .mainmenu-accountmenu:after {right:13px}
|
||||||
nav#layout-mainmenu.navbar-mode-collapse ul.nav {display:none}
|
nav#layout-mainmenu.navbar-mode-collapse ul.nav {display:none}
|
||||||
nav#layout-mainmenu.navbar-mode-collapse .menu-toggle {display:inline-block;color:#fff !important}
|
nav#layout-mainmenu.navbar-mode-collapse .menu-toggle {display:inline-block;color:#fff !important}
|
||||||
@media (max-width:769px) {nav#layout-mainmenu.navbar {padding-left:0;height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-quick-action a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu {top:55px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {padding-right:0 }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu:after {right:13px }nav#layout-mainmenu.navbar ul.nav {display:none }nav#layout-mainmenu.navbar .menu-toggle {display:inline-block;color:#fff !important }}
|
@media (max-width:769px) {nav#layout-mainmenu.navbar {padding-left:0;height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-preview a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {height:45px;line-height:45px }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu {top:55px }nav#layout-mainmenu.navbar ul.mainmenu-toolbar li.mainmenu-account >a {padding-right:0 }nav#layout-mainmenu.navbar ul li .mainmenu-accountmenu:after {right:13px }nav#layout-mainmenu.navbar ul.nav {display:none }nav#layout-mainmenu.navbar .menu-toggle {display:inline-block;color:#fff !important }}
|
||||||
.mainmenu-collapsed {position:absolute;height:100%;top:0;left:0;margin:0;background:#000}
|
.mainmenu-collapsed {position:absolute;height:100%;top:0;left:0;margin:0;background:#000}
|
||||||
.mainmenu-collapsed >div {display:block;height:100%}
|
.mainmenu-collapsed >div {display:block;height:100%}
|
||||||
.mainmenu-collapsed >div ul.mainmenu-nav li a {position:relative;width:65px;height:65px}
|
.mainmenu-collapsed >div ul.mainmenu-nav li a {position:relative;width:65px;height:65px}
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ body.mainmenu-open {
|
||||||
height: @height;
|
height: @height;
|
||||||
|
|
||||||
ul.mainmenu-toolbar {
|
ul.mainmenu-toolbar {
|
||||||
li.mainmenu-quick-action {
|
li.mainmenu-preview {
|
||||||
a {
|
a {
|
||||||
height: @height;
|
height: @height;
|
||||||
line-height: @height;
|
line-height: @height;
|
||||||
|
|
@ -191,12 +191,8 @@ nav#layout-mainmenu {
|
||||||
//
|
//
|
||||||
|
|
||||||
ul.mainmenu-toolbar {
|
ul.mainmenu-toolbar {
|
||||||
li.mainmenu-quick-action {
|
li.mainmenu-preview {
|
||||||
margin: 0;
|
margin: 0 0 0 21px;
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
margin-left: 21px;
|
|
||||||
}
|
|
||||||
|
|
||||||
i {
|
i {
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ use Backend\Behaviors\ImportExportController\TranscodeFilter;
|
||||||
use Illuminate\Database\Eloquent\MassAssignmentException;
|
use Illuminate\Database\Eloquent\MassAssignmentException;
|
||||||
use League\Csv\Reader as CsvReader;
|
use League\Csv\Reader as CsvReader;
|
||||||
use League\Csv\Writer as CsvWriter;
|
use League\Csv\Writer as CsvWriter;
|
||||||
use League\Csv\EscapeFormula as CsvEscapeFormula;
|
use October\Rain\Parse\League\EscapeFormula as CsvEscapeFormula;
|
||||||
use ApplicationException;
|
use ApplicationException;
|
||||||
use SplTempFileObject;
|
use SplTempFileObject;
|
||||||
use Exception;
|
use Exception;
|
||||||
|
|
@ -624,7 +624,9 @@ class ImportExportController extends ControllerBehavior
|
||||||
$csv->setDelimiter($options['delimiter']);
|
$csv->setDelimiter($options['delimiter']);
|
||||||
$csv->setEnclosure($options['enclosure']);
|
$csv->setEnclosure($options['enclosure']);
|
||||||
$csv->setEscape($options['escape']);
|
$csv->setEscape($options['escape']);
|
||||||
$csv->addFormatter(new CsvEscapeFormula());
|
|
||||||
|
// Temporary until upgrading to league/csv >= 9.1.0 (will be $csv->addFormatter($formatter))
|
||||||
|
$formatter = new CsvEscapeFormula();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add headers
|
* Add headers
|
||||||
|
|
@ -660,6 +662,9 @@ class ImportExportController extends ControllerBehavior
|
||||||
$record[] = $value;
|
$record[] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Temporary until upgrading to league/csv >= 9.1.0
|
||||||
|
$record = $formatter($record);
|
||||||
|
|
||||||
$csv->insertOne($record);
|
$csv->insertOne($record);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -803,9 +808,9 @@ class ImportExportController extends ControllerBehavior
|
||||||
|
|
||||||
if (
|
if (
|
||||||
$options['encoding'] !== null &&
|
$options['encoding'] !== null &&
|
||||||
$reader->supportsStreamFilter()
|
$reader->isActiveStreamFilter()
|
||||||
) {
|
) {
|
||||||
$reader->addStreamFilter(sprintf(
|
$reader->appendStreamFilter(sprintf(
|
||||||
'%s%s:%s',
|
'%s%s:%s',
|
||||||
TranscodeFilter::FILTER_NAME,
|
TranscodeFilter::FILTER_NAME,
|
||||||
strtolower($options['encoding']),
|
strtolower($options['encoding']),
|
||||||
|
|
|
||||||
|
|
@ -297,6 +297,16 @@ class ListController extends ControllerBehavior
|
||||||
return call_user_func_array([$this->controller, 'onDelete'], func_get_args());
|
return call_user_func_array([$this->controller, 'onDelete'], func_get_args());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Validate checked identifiers
|
||||||
|
*/
|
||||||
|
$checkedIds = post('checked');
|
||||||
|
|
||||||
|
if (!$checkedIds || !is_array($checkedIds) || !count($checkedIds)) {
|
||||||
|
Flash::error(Lang::get('backend::lang.list.delete_selected_empty'));
|
||||||
|
return $this->controller->listRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Establish the list definition
|
* Establish the list definition
|
||||||
*/
|
*/
|
||||||
|
|
@ -308,20 +318,6 @@ class ListController extends ControllerBehavior
|
||||||
|
|
||||||
$listConfig = $this->controller->listGetConfig($definition);
|
$listConfig = $this->controller->listGetConfig($definition);
|
||||||
|
|
||||||
/*
|
|
||||||
* Validate checked identifiers
|
|
||||||
*/
|
|
||||||
$checkedIds = post('checked');
|
|
||||||
|
|
||||||
if (!$checkedIds || !is_array($checkedIds) || !count($checkedIds)) {
|
|
||||||
Flash::error(Lang::get(
|
|
||||||
(!empty($listConfig->noRecordsDeletedMessage))
|
|
||||||
? $listConfig->noRecordsDeletedMessage
|
|
||||||
: 'backend::lang.list.delete_selected_empty'
|
|
||||||
));
|
|
||||||
return $this->controller->listRefresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the model
|
* Create the model
|
||||||
*/
|
*/
|
||||||
|
|
@ -348,18 +344,10 @@ class ListController extends ControllerBehavior
|
||||||
$record->delete();
|
$record->delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
Flash::success(Lang::get(
|
Flash::success(Lang::get('backend::lang.list.delete_selected_success'));
|
||||||
(!empty($listConfig->deleteMessage))
|
|
||||||
? $listConfig->deleteMessage
|
|
||||||
: 'backend::lang.list.delete_selected_success'
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Flash::error(Lang::get(
|
Flash::error(Lang::get('backend::lang.list.delete_selected_empty'));
|
||||||
(!empty($listConfig->noRecordsDeletedMessage))
|
|
||||||
? $listConfig->noRecordsDeletedMessage
|
|
||||||
: 'backend::lang.list.delete_selected_empty'
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->controller->listRefresh($definition);
|
return $this->controller->listRefresh($definition);
|
||||||
|
|
|
||||||
|
|
@ -669,9 +669,8 @@ class RelationController extends ControllerBehavior
|
||||||
$config->defaultSort = $this->getConfig('view[defaultSort]');
|
$config->defaultSort = $this->getConfig('view[defaultSort]');
|
||||||
$config->recordsPerPage = $this->getConfig('view[recordsPerPage]');
|
$config->recordsPerPage = $this->getConfig('view[recordsPerPage]');
|
||||||
$config->showCheckboxes = $this->getConfig('view[showCheckboxes]', !$this->readOnly);
|
$config->showCheckboxes = $this->getConfig('view[showCheckboxes]', !$this->readOnly);
|
||||||
$config->recordUrl = $this->getConfig('view[recordUrl]');
|
$config->recordUrl = $this->getConfig('view[recordUrl]', null);
|
||||||
$config->customViewPath = $this->getConfig('view[customViewPath]');
|
$config->customViewPath = $this->getConfig('view[customViewPath]', null);
|
||||||
$config->noRecordsMessage = $this->getConfig('view[noRecordsMessage]');
|
|
||||||
|
|
||||||
$defaultOnClick = sprintf(
|
$defaultOnClick = sprintf(
|
||||||
"$.oc.relationBehavior.clickViewListRecord(':%s', '%s', '%s')",
|
"$.oc.relationBehavior.clickViewListRecord(':%s', '%s', '%s')",
|
||||||
|
|
@ -819,7 +818,6 @@ class RelationController extends ControllerBehavior
|
||||||
$config->showSorting = $this->getConfig('manage[showSorting]', !$isPivot);
|
$config->showSorting = $this->getConfig('manage[showSorting]', !$isPivot);
|
||||||
$config->defaultSort = $this->getConfig('manage[defaultSort]');
|
$config->defaultSort = $this->getConfig('manage[defaultSort]');
|
||||||
$config->recordsPerPage = $this->getConfig('manage[recordsPerPage]');
|
$config->recordsPerPage = $this->getConfig('manage[recordsPerPage]');
|
||||||
$config->noRecordsMessage = $this->getConfig('manage[noRecordsMessage]');
|
|
||||||
|
|
||||||
if ($this->viewMode == 'single') {
|
if ($this->viewMode == 'single') {
|
||||||
$config->showCheckboxes = false;
|
$config->showCheckboxes = false;
|
||||||
|
|
@ -1115,7 +1113,7 @@ class RelationController extends ControllerBehavior
|
||||||
$this->relationObject->add($newModel, $sessionKey);
|
$this->relationObject->add($newModel, $sessionKey);
|
||||||
}
|
}
|
||||||
elseif ($this->viewMode == 'single') {
|
elseif ($this->viewMode == 'single') {
|
||||||
$newModel = $this->viewModel = $this->viewWidget->model = $this->manageWidget->model;
|
$newModel = $this->manageWidget->model;
|
||||||
$this->viewWidget->setFormValues($saveData);
|
$this->viewWidget->setFormValues($saveData);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1125,15 +1123,6 @@ class RelationController extends ControllerBehavior
|
||||||
$newModel->save(null, $this->manageWidget->getSessionKey());
|
$newModel->save(null, $this->manageWidget->getSessionKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->relationType === 'hasOne') {
|
|
||||||
// Unassign previous relation if one is already assigned
|
|
||||||
$relation = $this->relationObject->getParent()->{$this->relationName} ?? null;
|
|
||||||
|
|
||||||
if ($relation) {
|
|
||||||
$this->relationObject->remove($relation, $sessionKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->relationObject->add($newModel, $sessionKey);
|
$this->relationObject->add($newModel, $sessionKey);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1168,11 +1157,7 @@ class RelationController extends ControllerBehavior
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elseif ($this->viewMode == 'single') {
|
elseif ($this->viewMode == 'single') {
|
||||||
// Ensure that the view widget model is the same instance as the manage widget model
|
$this->viewModel = $this->manageWidget->model;
|
||||||
// since they will technically be different object instances in this context as
|
|
||||||
// $viewWidet->model is populated by $this->relationObject->getResults() and
|
|
||||||
// $manageWidget->model is populated by $this->relationModel->find($manageId);
|
|
||||||
$this->viewModel = $this->viewWidget->model = $this->manageWidget->model;
|
|
||||||
|
|
||||||
$this->viewWidget->setFormValues($saveData);
|
$this->viewWidget->setFormValues($saveData);
|
||||||
$this->viewModel->save(null, $this->manageWidget->getSessionKey());
|
$this->viewModel->save(null, $this->manageWidget->getSessionKey());
|
||||||
|
|
@ -1256,15 +1241,6 @@ class RelationController extends ControllerBehavior
|
||||||
*/
|
*/
|
||||||
elseif ($this->viewMode == 'single') {
|
elseif ($this->viewMode == 'single') {
|
||||||
if ($recordId && ($model = $this->relationModel->find($recordId))) {
|
if ($recordId && ($model = $this->relationModel->find($recordId))) {
|
||||||
if ($this->relationType === 'hasOne') {
|
|
||||||
// Unassign previous relation if one is already assigned
|
|
||||||
$relation = $this->relationObject->getParent()->{$this->relationName} ?? null;
|
|
||||||
|
|
||||||
if ($relation) {
|
|
||||||
$this->relationObject->remove($relation, $sessionKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->relationObject->add($model, $sessionKey);
|
$this->relationObject->add($model, $sessionKey);
|
||||||
$this->viewWidget->setFormValues($model->attributes);
|
$this->viewWidget->setFormValues($model->attributes);
|
||||||
|
|
||||||
|
|
@ -1333,11 +1309,7 @@ class RelationController extends ControllerBehavior
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reinitialise the form with a blank model
|
|
||||||
$this->initRelation($this->model);
|
|
||||||
|
|
||||||
$this->viewWidget->setFormValues([]);
|
$this->viewWidget->setFormValues([]);
|
||||||
$this->viewModel = $this->relationModel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->relationRefresh();
|
return $this->relationRefresh();
|
||||||
|
|
|
||||||
|
|
@ -214,10 +214,7 @@ class ReorderController extends ControllerBehavior
|
||||||
$model = $this->controller->reorderGetModel();
|
$model = $this->controller->reorderGetModel();
|
||||||
$modelTraits = class_uses($model);
|
$modelTraits = class_uses($model);
|
||||||
|
|
||||||
if (
|
if (isset($modelTraits[\October\Rain\Database\Traits\Sortable::class])) {
|
||||||
isset($modelTraits[\October\Rain\Database\Traits\Sortable::class]) ||
|
|
||||||
$model->isClassExtendedWith(\October\Rain\Database\Behaviors\Sortable::class)
|
|
||||||
) {
|
|
||||||
$this->sortMode = 'simple';
|
$this->sortMode = 'simple';
|
||||||
}
|
}
|
||||||
elseif (isset($modelTraits[\October\Rain\Database\Traits\NestedTree::class])) {
|
elseif (isset($modelTraits[\October\Rain\Database\Traits\NestedTree::class])) {
|
||||||
|
|
@ -225,7 +222,7 @@ class ReorderController extends ControllerBehavior
|
||||||
$this->showTree = true;
|
$this->showTree = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new ApplicationException('The model must implement the Sortable trait/behavior or the NestedTree trait.');
|
throw new ApplicationException('The model must implement the NestedTree or Sortable traits.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $model;
|
return $model;
|
||||||
|
|
|
||||||
|
|
@ -124,7 +124,7 @@ class FormField
|
||||||
/**
|
/**
|
||||||
* @var string Specifies a comment to accompany the field
|
* @var string Specifies a comment to accompany the field
|
||||||
*/
|
*/
|
||||||
public $comment = '';
|
public $comment;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string Specifies the comment position.
|
* @var string Specifies the comment position.
|
||||||
|
|
@ -139,7 +139,7 @@ class FormField
|
||||||
/**
|
/**
|
||||||
* @var string Specifies a message to display when there is no value supplied (placeholder).
|
* @var string Specifies a message to display when there is no value supplied (placeholder).
|
||||||
*/
|
*/
|
||||||
public $placeholder = '';
|
public $placeholder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array Contains a list of attributes specified in the field configuration.
|
* @var array Contains a list of attributes specified in the field configuration.
|
||||||
|
|
|
||||||
|
|
@ -28,11 +28,6 @@ class NavigationManager
|
||||||
*/
|
*/
|
||||||
protected $items;
|
protected $items;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var QuickActionItem[] List of registered quick actions.
|
|
||||||
*/
|
|
||||||
protected $quickActions;
|
|
||||||
|
|
||||||
protected $contextSidenavPartials = [];
|
protected $contextSidenavPartials = [];
|
||||||
|
|
||||||
protected $contextOwner;
|
protected $contextOwner;
|
||||||
|
|
@ -59,9 +54,6 @@ class NavigationManager
|
||||||
*/
|
*/
|
||||||
protected function loadItems()
|
protected function loadItems()
|
||||||
{
|
{
|
||||||
$this->items = [];
|
|
||||||
$this->quickActions = [];
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load module items
|
* Load module items
|
||||||
*/
|
*/
|
||||||
|
|
@ -76,19 +68,12 @@ class NavigationManager
|
||||||
|
|
||||||
foreach ($plugins as $id => $plugin) {
|
foreach ($plugins as $id => $plugin) {
|
||||||
$items = $plugin->registerNavigation();
|
$items = $plugin->registerNavigation();
|
||||||
$quickActions = $plugin->registerQuickActions();
|
if (!is_array($items)) {
|
||||||
|
|
||||||
if (!is_array($items) && !is_array($quickActions)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_array($items)) {
|
|
||||||
$this->registerMenuItems($id, $items);
|
$this->registerMenuItems($id, $items);
|
||||||
}
|
}
|
||||||
if (is_array($quickActions)) {
|
|
||||||
$this->registerQuickActions($id, $quickActions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @event backend.menu.extendItems
|
* @event backend.menu.extendItems
|
||||||
|
|
@ -106,21 +91,17 @@ class NavigationManager
|
||||||
Event::fire('backend.menu.extendItems', [$this]);
|
Event::fire('backend.menu.extendItems', [$this]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sort menu items and quick actions
|
* Sort menu items
|
||||||
*/
|
*/
|
||||||
uasort($this->items, static function ($a, $b) {
|
uasort($this->items, static function ($a, $b) {
|
||||||
return $a->order - $b->order;
|
return $a->order - $b->order;
|
||||||
});
|
});
|
||||||
uasort($this->quickActions, static function ($a, $b) {
|
|
||||||
return $a->order - $b->order;
|
|
||||||
});
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Filter items and quick actions that the user lacks permission for
|
* Filter items user lacks permission for
|
||||||
*/
|
*/
|
||||||
$user = BackendAuth::getUser();
|
$user = BackendAuth::getUser();
|
||||||
$this->items = $this->filterItemPermissions($user, $this->items);
|
$this->items = $this->filterItemPermissions($user, $this->items);
|
||||||
$this->quickActions = $this->filterItemPermissions($user, $this->quickActions);
|
|
||||||
|
|
||||||
foreach ($this->items as $item) {
|
foreach ($this->items as $item) {
|
||||||
if (!$item->sideMenu || !count($item->sideMenu)) {
|
if (!$item->sideMenu || !count($item->sideMenu)) {
|
||||||
|
|
@ -202,6 +183,10 @@ class NavigationManager
|
||||||
*/
|
*/
|
||||||
public function registerMenuItems($owner, array $definitions)
|
public function registerMenuItems($owner, array $definitions)
|
||||||
{
|
{
|
||||||
|
if (!$this->items) {
|
||||||
|
$this->items = [];
|
||||||
|
}
|
||||||
|
|
||||||
$validator = Validator::make($definitions, [
|
$validator = Validator::make($definitions, [
|
||||||
'*.label' => 'required',
|
'*.label' => 'required',
|
||||||
'*.icon' => 'required_without:*.iconSvg',
|
'*.icon' => 'required_without:*.iconSvg',
|
||||||
|
|
@ -335,21 +320,6 @@ class NavigationManager
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove multiple side menu items
|
|
||||||
*
|
|
||||||
* @param string $owner
|
|
||||||
* @param string $code
|
|
||||||
* @param array $sideCodes
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function removeSideMenuItems($owner, $code, $sideCodes)
|
|
||||||
{
|
|
||||||
foreach ($sideCodes as $sideCode) {
|
|
||||||
$this->removeSideMenuItem($owner, $code, $sideCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a single main menu item
|
* Removes a single main menu item
|
||||||
* @param string $owner
|
* @param string $owner
|
||||||
|
|
@ -376,12 +346,8 @@ class NavigationManager
|
||||||
*/
|
*/
|
||||||
public function listMainMenuItems()
|
public function listMainMenuItems()
|
||||||
{
|
{
|
||||||
if ($this->items === null && $this->quickActions === null) {
|
|
||||||
$this->loadItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->items === null) {
|
if ($this->items === null) {
|
||||||
return [];
|
$this->loadItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($this->items as $item) {
|
foreach ($this->items as $item) {
|
||||||
|
|
@ -463,137 +429,6 @@ class NavigationManager
|
||||||
return $items;
|
return $items;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers quick actions in the main navigation.
|
|
||||||
*
|
|
||||||
* Quick actions are single purpose links displayed to the left of the user menu in the
|
|
||||||
* backend main navigation.
|
|
||||||
*
|
|
||||||
* The argument is an array of the quick action items. The array keys represent the
|
|
||||||
* quick action item codes, specific for the plugin/module. Each element in the
|
|
||||||
* array should be an associative array with the following keys:
|
|
||||||
* - label - specifies the action label localization string key, used as a tooltip, required.
|
|
||||||
* - icon - an icon name from the Font Awesome icon collection, required if iconSvg is unspecified.
|
|
||||||
* - iconSvg - a custom SVG icon to use for the icon, required if icon is unspecified.
|
|
||||||
* - url - the back-end relative URL the quick action item should point to, required.
|
|
||||||
* - permissions - an array of permissions the back-end user should have, optional.
|
|
||||||
* The item will be displayed if the user has any of the specified permissions.
|
|
||||||
* - order - a position of the item in the menu, optional.
|
|
||||||
*
|
|
||||||
* @param string $owner Specifies the quick action items owner plugin or module in the format Author.Plugin.
|
|
||||||
* @param array $definitions An array of the quick action item definitions.
|
|
||||||
* @return void
|
|
||||||
* @throws SystemException If the validation of the quick action configuration fails
|
|
||||||
*/
|
|
||||||
public function registerQuickActions($owner, array $definitions)
|
|
||||||
{
|
|
||||||
$validator = Validator::make($definitions, [
|
|
||||||
'*.label' => 'required',
|
|
||||||
'*.icon' => 'required_without:*.iconSvg',
|
|
||||||
'*.url' => 'required'
|
|
||||||
]);
|
|
||||||
|
|
||||||
if ($validator->fails()) {
|
|
||||||
$errorMessage = 'Invalid quick action item detected in ' . $owner . '. Contact the plugin author to fix (' . $validator->errors()->first() . ')';
|
|
||||||
if (Config::get('app.debug', false)) {
|
|
||||||
throw new SystemException($errorMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
Log::error($errorMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->addQuickActionItems($owner, $definitions);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dynamically add an array of quick action items
|
|
||||||
*
|
|
||||||
* @param string $owner
|
|
||||||
* @param array $definitions
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function addQuickActionItems($owner, array $definitions)
|
|
||||||
{
|
|
||||||
foreach ($definitions as $code => $definition) {
|
|
||||||
$this->addQuickActionItem($owner, $code, $definition);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dynamically add a single quick action item
|
|
||||||
*
|
|
||||||
* @param string $owner
|
|
||||||
* @param string $code
|
|
||||||
* @param array $definition
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function addQuickActionItem($owner, $code, array $definition)
|
|
||||||
{
|
|
||||||
$itemKey = $this->makeItemKey($owner, $code);
|
|
||||||
|
|
||||||
if (isset($this->quickActions[$itemKey])) {
|
|
||||||
$definition = array_merge((array) $this->quickActions[$itemKey], $definition);
|
|
||||||
}
|
|
||||||
|
|
||||||
$item = array_merge($definition, [
|
|
||||||
'code' => $code,
|
|
||||||
'owner' => $owner
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->quickActions[$itemKey] = QuickActionItem::createFromArray($item);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the instance of a specified quick action item.
|
|
||||||
*
|
|
||||||
* @param string $owner
|
|
||||||
* @param string $code
|
|
||||||
* @return QuickActionItem
|
|
||||||
* @throws SystemException
|
|
||||||
*/
|
|
||||||
public function getQuickActionItem(string $owner, string $code)
|
|
||||||
{
|
|
||||||
$itemKey = $this->makeItemKey($owner, $code);
|
|
||||||
|
|
||||||
if (!array_key_exists($itemKey, $this->quickActions)) {
|
|
||||||
throw new SystemException('No quick action item found with key ' . $itemKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->quickActions[$itemKey];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes a single quick action item
|
|
||||||
*
|
|
||||||
* @param $owner
|
|
||||||
* @param $code
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function removeQuickActionItem($owner, $code)
|
|
||||||
{
|
|
||||||
$itemKey = $this->makeItemKey($owner, $code);
|
|
||||||
unset($this->quickActions[$itemKey]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a list of quick action items.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
* @throws SystemException
|
|
||||||
*/
|
|
||||||
public function listQuickActionItems()
|
|
||||||
{
|
|
||||||
if ($this->items === null && $this->quickActions === null) {
|
|
||||||
$this->loadItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->quickActions === null) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->quickActions;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the navigation context.
|
* Sets the navigation context.
|
||||||
* The function sets the navigation owner, main menu item code and the side menu item code.
|
* The function sets the navigation owner, main menu item code and the side menu item code.
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,11 @@
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "Alexey Bobkov",
|
"name": "Alexey Bobkov",
|
||||||
"email": "aleksey.bobkov@gmail.com",
|
"email": "aleksey.bobkov@gmail.com"
|
||||||
"role": "Co-founder"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Samuel Georges",
|
"name": "Samuel Georges",
|
||||||
"email": "daftspunky@gmail.com",
|
"email": "daftspunky@gmail.com"
|
||||||
"role": "Co-founder"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Luke Towers",
|
"name": "Luke Towers",
|
||||||
|
|
@ -24,10 +22,9 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.2",
|
"php": ">=7.0",
|
||||||
"composer/installers": "~1.0",
|
"composer/installers": "~1.0",
|
||||||
"october/rain": "~1.1.0",
|
"october/rain": "~1.0.469"
|
||||||
"laravel/framework": "~6.0"
|
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ class Preferences extends Controller
|
||||||
*/
|
*/
|
||||||
public function formExtendFields($form)
|
public function formExtendFields($form)
|
||||||
{
|
{
|
||||||
if (!$this->user->hasAccess('backend.manage_own_editor')) {
|
if (!$this->user->hasAccess('backend.manage_editor')) {
|
||||||
$form->removeTab('backend::lang.backend_preferences.code_editor');
|
$form->removeTab('backend::lang.backend_preferences.code_editor');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ scopes:
|
||||||
label: backend::lang.user.superuser
|
label: backend::lang.user.superuser
|
||||||
type: switch
|
type: switch
|
||||||
conditions:
|
conditions:
|
||||||
- is_superuser = 0
|
- is_superuser = false
|
||||||
- is_superuser = 1
|
- is_superuser = true
|
||||||
|
|
||||||
login_date:
|
login_date:
|
||||||
label: backend::lang.user.last_login
|
label: backend::lang.user.last_login
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
<?php namespace Backend\Database\Seeds;
|
<?php namespace Backend\Database\Seeds;
|
||||||
|
|
||||||
use Str;
|
|
||||||
use Seeder;
|
use Seeder;
|
||||||
use Eloquent;
|
use Eloquent;
|
||||||
|
|
||||||
|
|
@ -9,22 +8,12 @@ class DatabaseSeeder extends Seeder
|
||||||
/**
|
/**
|
||||||
* Run the database seeds.
|
* Run the database seeds.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function run()
|
public function run()
|
||||||
{
|
{
|
||||||
$adminPassword = Str::random(22);
|
Eloquent::unguard();
|
||||||
|
|
||||||
Eloquent::unguarded(function () use ($adminPassword) {
|
$this->call('Backend\Database\Seeds\SeedSetupAdmin');
|
||||||
// Generate a random password for the seeded admin account
|
|
||||||
$adminSeeder = new \Backend\Database\Seeds\SeedSetupAdmin;
|
|
||||||
$adminSeeder->setDefaults([
|
|
||||||
'password' => $adminPassword
|
|
||||||
]);
|
|
||||||
$this->call($adminSeeder);
|
|
||||||
});
|
|
||||||
|
|
||||||
return 'The following password has been automatically generated for the "admin" account: '
|
|
||||||
. "<fg=yellow;options=bold>${adminPassword}</>";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,24 +2,12 @@
|
||||||
|
|
||||||
use October\Rain\Support\Facade;
|
use October\Rain\Support\Facade;
|
||||||
|
|
||||||
/**
|
|
||||||
* @method static string uri()
|
|
||||||
* @method static string url(string $path = null, array $parameters = [], bool $secure = null)
|
|
||||||
* @method static string baseUrl(string $path = null)
|
|
||||||
* @method static string skinAsset(string $path = null)
|
|
||||||
* @method static \Illuminate\Http\RedirectResponse redirect(string $path, int $status = 302, array $headers = [], bool $secure = null)
|
|
||||||
* @method static \Illuminate\Http\RedirectResponse redirectGuest(string $path, int $status = 302, array $headers = [], bool $secure = null)
|
|
||||||
* @method static \Illuminate\Http\RedirectResponse redirectIntended(string $path, int $status = 302, array $headers = [], bool $secure = null)
|
|
||||||
* @method static string date($dateTime, array $options = [])
|
|
||||||
* @method static string dateTime($dateTime, array $options = [])
|
|
||||||
*
|
|
||||||
* @see \Backend\Helpers\Backend
|
|
||||||
*/
|
|
||||||
class Backend extends Facade
|
class Backend extends Facade
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Get the registered name of the component.
|
* Get the registered name of the component.
|
||||||
*
|
*
|
||||||
|
* @see \Backend\Helpers\Backend
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected static function getFacadeAccessor()
|
protected static function getFacadeAccessor()
|
||||||
|
|
|
||||||
|
|
@ -2,22 +2,14 @@
|
||||||
|
|
||||||
use October\Rain\Support\Facade;
|
use October\Rain\Support\Facade;
|
||||||
|
|
||||||
/**
|
|
||||||
* @method static void registerCallback(callable $callback)
|
|
||||||
* @method static void registerPermissions(string $owner, array $definitions)
|
|
||||||
* @method static void removePermission(string $owner, string $code)
|
|
||||||
* @method static array listPermissions()
|
|
||||||
* @method static array listTabbedPermissions()
|
|
||||||
* @method static array listPermissionsForRole(string $role, bool $includeOrphans = true)
|
|
||||||
* @method static boolean hasPermissionsForRole(string $role)
|
|
||||||
*
|
|
||||||
* @see \Backend\Classes\AuthManager
|
|
||||||
*/
|
|
||||||
class BackendAuth extends Facade
|
class BackendAuth extends Facade
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Get the registered name of the component.
|
* Get the registered name of the component.
|
||||||
*
|
*
|
||||||
|
* Resolves to:
|
||||||
|
* - Backend\Classes\AuthManager
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected static function getFacadeAccessor()
|
protected static function getFacadeAccessor()
|
||||||
|
|
|
||||||
|
|
@ -2,36 +2,14 @@
|
||||||
|
|
||||||
use October\Rain\Support\Facade;
|
use October\Rain\Support\Facade;
|
||||||
|
|
||||||
/**
|
|
||||||
* @method static void registerCallback(callable $callback)
|
|
||||||
* @method static void registerMenuItems(string $owner, array $definitions)
|
|
||||||
* @method static void addMainMenuItems(string $owner, array $definitions)
|
|
||||||
* @method static void addMainMenuItem(string $owner, $code, array $definition)
|
|
||||||
* @method static \Backend\Classes\MainMenuItem getMainMenuItem(string $owner, string $code)
|
|
||||||
* @method static void removeMainMenuItem(string $owner, string $code)
|
|
||||||
* @method static void addSideMenuItems(string $owner, string $code, array $definitions)
|
|
||||||
* @method static bool addSideMenuItem(string $owner, string $code, string $sideCode, array $definition)
|
|
||||||
* @method static bool removeSideMenuItem(string $owner, string $code, string $sideCode)
|
|
||||||
* @method static \Backend\Classes\MainMenuItem[] listMainMenuItems()
|
|
||||||
* @method static \Backend\Classes\SideMenuItem[] listSideMenuItems(string|null $owner = null, string|null $code = null)
|
|
||||||
* @method static void setContext(string $owner, string $mainMenuItemCode, string|null $sideMenuItemCode = null)
|
|
||||||
* @method static void setContextOwner(string $owner)
|
|
||||||
* @method static void setContextMainMenu(string $mainMenuItemCode)
|
|
||||||
* @method static object getContext()
|
|
||||||
* @method static void setContextSideMenu(string $sideMenuItemCode)
|
|
||||||
* @method static bool isMainMenuItemActive(\Backend\Classes\MainMenuItem $item)
|
|
||||||
* @method static \Backend\Classes\MainMenuItem|null getActiveMainMenuItem()
|
|
||||||
* @method static bool isSideMenuItemActive(\Backend\Classes\SideMenuItem $item)
|
|
||||||
* @method static void registerContextSidenavPartial(string $owner, string $mainMenuItemCode, string $partial)
|
|
||||||
* @method static mixed getContextSidenavPartial(string $owner, string $mainMenuItemCode)
|
|
||||||
*
|
|
||||||
* @see \Backend\Classes\NavigationManager
|
|
||||||
*/
|
|
||||||
class BackendMenu extends Facade
|
class BackendMenu extends Facade
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Get the registered name of the component.
|
* Get the registered name of the component.
|
||||||
*
|
*
|
||||||
|
* Resolves to:
|
||||||
|
* - Backend\Classes\NavigationManager
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected static function getFacadeAccessor()
|
protected static function getFacadeAccessor()
|
||||||
|
|
|
||||||
|
|
@ -248,6 +248,16 @@ class Repeater extends FormWidgetBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!$this->childAddItemCalled && $currentValue === null) {
|
||||||
|
$this->formWidgets = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->childAddItemCalled && !isset($currentValue[$this->childIndexCalled])) {
|
||||||
|
// If no value is available but a child repeater has added an item, add a "stub" repeater item
|
||||||
|
$this->makeItemFormWidget($this->childIndexCalled);
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure that the minimum number of items are preinitialized
|
// Ensure that the minimum number of items are preinitialized
|
||||||
// ONLY DONE WHEN NOT IN GROUP MODE
|
// ONLY DONE WHEN NOT IN GROUP MODE
|
||||||
if (!$this->useGroups && $this->minItems > 0) {
|
if (!$this->useGroups && $this->minItems > 0) {
|
||||||
|
|
@ -263,16 +273,6 @@ class Repeater extends FormWidgetBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->childAddItemCalled && $currentValue === null) {
|
|
||||||
$this->formWidgets = [];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->childAddItemCalled && !isset($currentValue[$this->childIndexCalled])) {
|
|
||||||
// If no value is available but a child repeater has added an item, add a "stub" repeater item
|
|
||||||
$this->makeItemFormWidget($this->childIndexCalled);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_array($currentValue)) {
|
if (!is_array($currentValue)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -186,19 +186,6 @@ class RichEditor extends FormWidgetBase
|
||||||
{
|
{
|
||||||
$result = [];
|
$result = [];
|
||||||
|
|
||||||
/**
|
|
||||||
* @event backend.richeditor.listTypes
|
|
||||||
* Register additional "page link types" to the RichEditor FormWidget
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
*
|
|
||||||
* Event::listen('backend.richeditor.listTypes', function () {
|
|
||||||
* return [
|
|
||||||
* 'my-identifier' => 'author.plugin::lang.richeditor.link_types.my_identifier',
|
|
||||||
* ];
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
$apiResult = Event::fire('backend.richeditor.listTypes');
|
$apiResult = Event::fire('backend.richeditor.listTypes');
|
||||||
if (is_array($apiResult)) {
|
if (is_array($apiResult)) {
|
||||||
foreach ($apiResult as $typeList) {
|
foreach ($apiResult as $typeList) {
|
||||||
|
|
@ -218,28 +205,6 @@ class RichEditor extends FormWidgetBase
|
||||||
protected function getPageLinks($type)
|
protected function getPageLinks($type)
|
||||||
{
|
{
|
||||||
$result = [];
|
$result = [];
|
||||||
|
|
||||||
/**
|
|
||||||
* @event backend.richeditor.getTypeInfo
|
|
||||||
* Register additional "page link types" to the RichEditor FormWidget
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
*
|
|
||||||
* Event::listen('backend.richeditor.getTypeInfo', function ($type) {
|
|
||||||
* if ($type === 'my-identifier') {
|
|
||||||
* return [
|
|
||||||
* 'https://example.com/page1' => 'Page 1',
|
|
||||||
* 'https://example.com/parent-page' => [
|
|
||||||
* 'title' => 'Parent Page',
|
|
||||||
* 'links' => [
|
|
||||||
* 'https://example.com/child-page' => 'Child Page',
|
|
||||||
* ],
|
|
||||||
* ],
|
|
||||||
* ];
|
|
||||||
* }
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
$apiResult = Event::fire('backend.richeditor.getTypeInfo', [$type]);
|
$apiResult = Event::fire('backend.richeditor.getTypeInfo', [$type]);
|
||||||
if (is_array($apiResult)) {
|
if (is_array($apiResult)) {
|
||||||
foreach ($apiResult as $typeInfo) {
|
foreach ($apiResult as $typeInfo) {
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,7 @@
|
||||||
targetWidth,
|
targetWidth,
|
||||||
targetHeight
|
targetHeight
|
||||||
|
|
||||||
if (!this.options.thumbnailWidth && !this.options.thumbnailHeight) {
|
if (!this.options.thumbnailWidth && !this.options.thumbnailWidth) {
|
||||||
targetWidth = targetHeight = 100
|
targetWidth = targetHeight = 100
|
||||||
}
|
}
|
||||||
else if (this.options.thumbnailWidth) {
|
else if (this.options.thumbnailWidth) {
|
||||||
|
|
|
||||||
|
|
@ -214,14 +214,14 @@ class Backend
|
||||||
$contents = file_get_contents($assetFile);
|
$contents = file_get_contents($assetFile);
|
||||||
|
|
||||||
// Find all assets that are compiled in this file
|
// Find all assets that are compiled in this file
|
||||||
preg_match_all('/^=require\s+([A-z0-9-_+\.\/]+)[\n|\r\n|$]/m', $contents, $matches, PREG_SET_ORDER);
|
preg_match_all('/^=require\s+([A-z0-9-_+\.\/]+)$/m', $contents, $matches, PREG_SET_ORDER);
|
||||||
|
|
||||||
// Determine correct asset path
|
// Determine correct asset path
|
||||||
$directory = str_replace(basename($file), '', $file);
|
$directory = str_replace(basename($file), '', $file);
|
||||||
|
|
||||||
if (count($matches)) {
|
if (count($matches)) {
|
||||||
$results = array_map(function ($match) use ($directory) {
|
$results = array_map(function ($match) use ($directory) {
|
||||||
return str_replace('/', DIRECTORY_SEPARATOR, $directory . $match[1]);
|
return $directory . $match[1];
|
||||||
}, $matches);
|
}, $matches);
|
||||||
|
|
||||||
foreach ($results as $i => $result) {
|
foreach ($results as $i => $result) {
|
||||||
|
|
|
||||||
|
|
@ -2,15 +2,12 @@
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'auth' => [
|
'auth' => [
|
||||||
'title' => 'Admin-Bereich',
|
'title' => 'Admin-Bereich'
|
||||||
'invalid_login' => 'Die Angaben stimmen nicht mit unseren Aufzeichnungen überein. Überprüfen Sie diese und versuchen Sie es noch einmal.',
|
|
||||||
],
|
],
|
||||||
'field' => [
|
'field' => [
|
||||||
'invalid_type' => 'Ungültiger Feldtyp :type.',
|
'invalid_type' => 'Ungültiger Feldtyp :type.',
|
||||||
'options_method_invalid_model' => 'Das Attribut ":field" löst sich nicht zu einen gültigen Model auf. Probiere die options Methode der Model-Klasse :model explicit zu definieren.',
|
'options_method_invalid_model' => 'Das Attribut ":field" löst sich nicht zu einen gültigen Model auf. Probiere die options Methode der Model-Klasse :model explicit zu definieren.',
|
||||||
'options_method_not_exists' => 'Die Modell-Klasse :model muss eine Methode :method() mit Rückgabe der Werte von ":field" besitzen.',
|
'options_method_not_exists' => 'Die Model-Klasse :model muss eine Methode :method() mit Rückgabe der Werte von ":field" besitzen.',
|
||||||
'options_static_method_invalid_value' => "Die statische Methode ':method()' in der Klasse :class hat kein valides Optionsarray zurückgegeben.",
|
|
||||||
'colors_method_not_exists' => "Die Modellklasse :model muss eine Methode :method() definieren, welche html color (HEX) codes für das ':field' Formularfeld zurückgibt.",
|
|
||||||
],
|
],
|
||||||
'widget' => [
|
'widget' => [
|
||||||
'not_registered' => "Ein Widget namens ':name' wurde nicht registriert",
|
'not_registered' => "Ein Widget namens ':name' wurde nicht registriert",
|
||||||
|
|
@ -18,11 +15,6 @@ return [
|
||||||
],
|
],
|
||||||
'page' => [
|
'page' => [
|
||||||
'untitled' => "Unbenannt",
|
'untitled' => "Unbenannt",
|
||||||
'404' => [
|
|
||||||
'label' => 'Seite nicht gefunden',
|
|
||||||
'help' => "Die von Ihnen angeforderte Seite konnte nicht gefunden werden.",
|
|
||||||
'back_link' => 'Zurück zur vorigen Seite',
|
|
||||||
],
|
|
||||||
'access_denied' => [
|
'access_denied' => [
|
||||||
'label' => "Zugriff verweigert",
|
'label' => "Zugriff verweigert",
|
||||||
'help' => "Sie haben nicht die erforderlichen Berechtigungen, um diese Seite zu sehen.",
|
'help' => "Sie haben nicht die erforderlichen Berechtigungen, um diese Seite zu sehen.",
|
||||||
|
|
@ -36,23 +28,14 @@ return [
|
||||||
],
|
],
|
||||||
'partial' => [
|
'partial' => [
|
||||||
'not_found_name' => "Das Partial ':name' wurde nicht gefunden.",
|
'not_found_name' => "Das Partial ':name' wurde nicht gefunden.",
|
||||||
'invalid_name' => 'Ungültiger Partial: :name.',
|
|
||||||
],
|
|
||||||
'ajax_handler' => [
|
|
||||||
'invalid_name' => 'Ungültiger AJAX handler: :name.',
|
|
||||||
'not_found' => "AJAX handler ':name' wurde nicht gefunden.",
|
|
||||||
],
|
],
|
||||||
'account' => [
|
'account' => [
|
||||||
'impersonate_confirm' => 'Sind Sie sicher, dass Sie sich als dieser Benutzer anmelden wollen? Sie können zu Ihrem ursprünglichen Zustand zurückkehren, indem Sie sich abmelden.',
|
|
||||||
'impersonate_success' => 'Sie sind jetzt als dieser Benutzer angemeldet',
|
|
||||||
'signed_in_as' => 'Angemeldet als :full_name',
|
|
||||||
'sign_out' => 'Abmelden',
|
'sign_out' => 'Abmelden',
|
||||||
'login' => 'Anmelden',
|
'login' => 'Anmelden',
|
||||||
'reset' => 'Zurücksetzen',
|
'reset' => 'Zurücksetzen',
|
||||||
'restore' => 'Wiederherstellen',
|
'restore' => 'Wiederherstellen',
|
||||||
'login_placeholder' => 'Benutzername',
|
'login_placeholder' => 'Benutzername',
|
||||||
'password_placeholder' => 'Passwort',
|
'password_placeholder' => 'Passwort',
|
||||||
'remember_me' => 'Angemeldet bleiben',
|
|
||||||
'forgot_password' => "Passwort vergessen?",
|
'forgot_password' => "Passwort vergessen?",
|
||||||
'enter_email' => "Bitte E-Mail-Adresse eingeben",
|
'enter_email' => "Bitte E-Mail-Adresse eingeben",
|
||||||
'enter_login' => "Bitte Benutzernamen eingeben",
|
'enter_login' => "Bitte Benutzernamen eingeben",
|
||||||
|
|
@ -129,8 +112,6 @@ return [
|
||||||
'last_name' => 'Nachname',
|
'last_name' => 'Nachname',
|
||||||
'full_name' => 'Kompletter Name',
|
'full_name' => 'Kompletter Name',
|
||||||
'email' => 'E-Mail',
|
'email' => 'E-Mail',
|
||||||
'role_field' => 'Rolle',
|
|
||||||
'role_comment' => 'Rollen definieren Benutzerberechtigungen, die auf Benutzerebene auf der Registerkarte Berechtigungen überschrieben werden können.',
|
|
||||||
'groups' => 'Gruppen',
|
'groups' => 'Gruppen',
|
||||||
'groups_comment' => 'Geben Sie hier die Gruppenzugehörigkeit an',
|
'groups_comment' => 'Geben Sie hier die Gruppenzugehörigkeit an',
|
||||||
'avatar' => 'Avatar',
|
'avatar' => 'Avatar',
|
||||||
|
|
@ -167,25 +148,9 @@ return [
|
||||||
'return' => 'Zurück zur Gruppen-Übersicht',
|
'return' => 'Zurück zur Gruppen-Übersicht',
|
||||||
'users_count' => 'Benutzer',
|
'users_count' => 'Benutzer',
|
||||||
],
|
],
|
||||||
'role' => [
|
|
||||||
'name' => 'Rolle',
|
|
||||||
'name_field' => 'Name',
|
|
||||||
'name_comment' => 'Der Name wird in der Rollenliste auf dem Administratorformular angezeigt.',
|
|
||||||
'description_field' => 'Beschreibung',
|
|
||||||
'code_field' => 'Code',
|
|
||||||
'code_comment' => 'Geben Sie einen eindeutigen Code an, wenn Sie mit der API auf das Rollenobjekt zugreifen möchten.',
|
|
||||||
'menu_label' => 'Rollen verwalten',
|
|
||||||
'list_title' => 'Rollen verwalten',
|
|
||||||
'new' => 'Neue Rolle',
|
|
||||||
'delete_confirm' => 'Diese Administratorrolle löschen?',
|
|
||||||
'return' => 'Zurück zur Rollenliste',
|
|
||||||
'users_count' => 'Benutzer',
|
|
||||||
],
|
|
||||||
'preferences' => [
|
'preferences' => [
|
||||||
'not_authenticated' => 'Zum Speichern oder Anzeigen dieser Einstellungen liegt kein Nutzerkonto vor'
|
'not_authenticated' => 'Zum Speichern oder Anzeigen dieser Einstellungen liegt kein Nutzerkonto vor'
|
||||||
],
|
]
|
||||||
'trashed_hint_title' => 'Dieses Konto wurde gelöscht.',
|
|
||||||
'trashed_hint_desc' => 'Dieses Konto wurde gelöscht und kann nicht mehr angemeldet werden. Um es wiederherzustellen, klicken Sie auf das Symbol "Benutzer wiederherstellen" unten rechts',
|
|
||||||
],
|
],
|
||||||
'list' => [
|
'list' => [
|
||||||
'default_title' => 'Auflisten',
|
'default_title' => 'Auflisten',
|
||||||
|
|
@ -230,11 +195,6 @@ return [
|
||||||
'remove_confirm' => 'Sind Sie sicher?',
|
'remove_confirm' => 'Sind Sie sicher?',
|
||||||
'remove_file' => 'Datei entfernen',
|
'remove_file' => 'Datei entfernen',
|
||||||
],
|
],
|
||||||
'repeater' => [
|
|
||||||
'add_new_item' => 'Neues Element hinzufügen',
|
|
||||||
'min_items_failed' => ':name erfordert ein Minimum an :min Elementen, aber es wurden nur :items bereitgestellt',
|
|
||||||
'max_items_failed' => ':name lässt nur bis zu :max Elemente zu, :items wurden bereitgestellt',
|
|
||||||
],
|
|
||||||
'form' => [
|
'form' => [
|
||||||
'create_title' => "Neuer :name",
|
'create_title' => "Neuer :name",
|
||||||
'update_title' => "Bearbeite :name",
|
'update_title' => "Bearbeite :name",
|
||||||
|
|
@ -352,8 +312,6 @@ return [
|
||||||
'permissions' => 'Verzeichnis :name oder ein Unterverzeichnis kann nicht von PHP beschrieben werden. Bitte setzen Sie die korrekten Rechte für den Webserver in diesem Verzeichnis.',
|
'permissions' => 'Verzeichnis :name oder ein Unterverzeichnis kann nicht von PHP beschrieben werden. Bitte setzen Sie die korrekten Rechte für den Webserver in diesem Verzeichnis.',
|
||||||
'extension' => 'Die PHP Erweiterung :name ist nicht installiert. Bitte installieren Sie diese Library und aktivieren Sie die Erweiterung.',
|
'extension' => 'Die PHP Erweiterung :name ist nicht installiert. Bitte installieren Sie diese Library und aktivieren Sie die Erweiterung.',
|
||||||
'plugin_missing' => 'Das Plugin :name hat eine Abhängigkeit die nicht installiert ist. Bitte installieren Sie alle benötigten Plugins.',
|
'plugin_missing' => 'Das Plugin :name hat eine Abhängigkeit die nicht installiert ist. Bitte installieren Sie alle benötigten Plugins.',
|
||||||
'debug' => 'Der Debug-Modus ist aktiviert. Dies wird für Produktionsinstallationen nicht empfohlen.',
|
|
||||||
'decompileBackendAssets' => 'Assets im Backend sind derzeit dekompiliert. Dies wird für Produktionsinstallationen nicht empfohlen.',
|
|
||||||
],
|
],
|
||||||
'editor' => [
|
'editor' => [
|
||||||
'menu_label' => 'Editor Einstellungen',
|
'menu_label' => 'Editor Einstellungen',
|
||||||
|
|
@ -409,8 +367,6 @@ return [
|
||||||
'minimal' => 'Minimal',
|
'minimal' => 'Minimal',
|
||||||
'full' => 'Vollständig',
|
'full' => 'Vollständig',
|
||||||
],
|
],
|
||||||
'paragraph_formats' => 'Absatzformatierungen',
|
|
||||||
'paragraph_formats_comment' => 'Die Optionen, welche in der Dropdown-Liste für Absatzformatierungen angezeigt werden.',
|
|
||||||
],
|
],
|
||||||
'tooltips' => [
|
'tooltips' => [
|
||||||
'preview_website' => 'Vorschau der Webseite'
|
'preview_website' => 'Vorschau der Webseite'
|
||||||
|
|
@ -430,8 +386,6 @@ return [
|
||||||
'brand' => 'Brand',
|
'brand' => 'Brand',
|
||||||
'logo' => 'Logo',
|
'logo' => 'Logo',
|
||||||
'logo_description' => 'Lade ein eigenes Logo hoch, das im Backend verwendet werden soll.',
|
'logo_description' => 'Lade ein eigenes Logo hoch, das im Backend verwendet werden soll.',
|
||||||
'favicon' => 'Favicon',
|
|
||||||
'favicon_description' => 'Laden Sie ein benutzerdefiniertes Favicon zur Verwendung im Back-End hoch',
|
|
||||||
'app_name' => 'App-Name',
|
'app_name' => 'App-Name',
|
||||||
'app_name_description' => 'Dieser Name wird als Titel des Backends angezeigt.',
|
'app_name_description' => 'Dieser Name wird als Titel des Backends angezeigt.',
|
||||||
'app_tagline' => 'App-Tagline',
|
'app_tagline' => 'App-Tagline',
|
||||||
|
|
@ -445,7 +399,6 @@ return [
|
||||||
'navigation' => 'Navigation',
|
'navigation' => 'Navigation',
|
||||||
'menu_mode' => 'Menustyles',
|
'menu_mode' => 'Menustyles',
|
||||||
'menu_mode_inline' => 'Inline',
|
'menu_mode_inline' => 'Inline',
|
||||||
'menu_mode_inline_no_icons' => 'Inline (ohne Icons)',
|
|
||||||
'menu_mode_tile' => 'Tiles',
|
'menu_mode_tile' => 'Tiles',
|
||||||
'menu_mode_collapsed' => 'Collapsed'
|
'menu_mode_collapsed' => 'Collapsed'
|
||||||
],
|
],
|
||||||
|
|
@ -550,7 +503,6 @@ return [
|
||||||
],
|
],
|
||||||
'permissions' => [
|
'permissions' => [
|
||||||
'manage_media' => 'Medien verwalten',
|
'manage_media' => 'Medien verwalten',
|
||||||
'allow_unsafe_markdown' => 'Unsicheres Markdown verwenden (kann Javascript enthalten)',
|
|
||||||
],
|
],
|
||||||
'mediafinder' => [
|
'mediafinder' => [
|
||||||
'label' => 'Media Finder',
|
'label' => 'Media Finder',
|
||||||
|
|
@ -582,12 +534,7 @@ return [
|
||||||
'multiple_selected' => 'Mehrere Dateien ausgewählt.',
|
'multiple_selected' => 'Mehrere Dateien ausgewählt.',
|
||||||
'uploading_file_num' => 'Lade :number Datei(en)...',
|
'uploading_file_num' => 'Lade :number Datei(en)...',
|
||||||
'uploading_complete' => 'Upload vollständig',
|
'uploading_complete' => 'Upload vollständig',
|
||||||
'uploading_error' => 'Upload fehlgeschlagen',
|
|
||||||
'type_blocked' => 'Der verwendete Dateityp ist aus Sicherheitsgründen gesperrt.',
|
|
||||||
'order_by' => 'Sortieren nach',
|
'order_by' => 'Sortieren nach',
|
||||||
'direction' => 'Direction',
|
|
||||||
'direction_asc' => 'Aufsteigend',
|
|
||||||
'direction_desc' => 'Absteigend',
|
|
||||||
'folder' => 'Ordner',
|
'folder' => 'Ordner',
|
||||||
'no_files_found' => 'Keine entsprechenden Dateien gefunden.',
|
'no_files_found' => 'Keine entsprechenden Dateien gefunden.',
|
||||||
'delete_empty' => 'Bitte Wählen Sie Dateien zum Löschen aus.',
|
'delete_empty' => 'Bitte Wählen Sie Dateien zum Löschen aus.',
|
||||||
|
|
@ -610,11 +557,11 @@ return [
|
||||||
'restore' => 'Alle Änderungen rückgängig machen',
|
'restore' => 'Alle Änderungen rückgängig machen',
|
||||||
'resize' => 'Größe anpassen...',
|
'resize' => 'Größe anpassen...',
|
||||||
'selection_mode_normal' => 'Normal',
|
'selection_mode_normal' => 'Normal',
|
||||||
'selection_mode_fixed_ratio' => 'Festes Verhältnis',
|
'selection_mode_fixed_ratio' => 'Fixes Verhältnis',
|
||||||
'selection_mode_fixed_size' => 'Feste Größe',
|
'selection_mode_fixed_size' => 'Fixe Größe',
|
||||||
'height' => 'Höhe',
|
'height' => 'Höhe',
|
||||||
'width' => 'Breite',
|
'width' => 'Breite',
|
||||||
'selection_mode' => 'Auswahlmodus',
|
'selection_mode' => 'Selection mode',
|
||||||
'resize_image' => 'Bildgröße anpassen',
|
'resize_image' => 'Bildgröße anpassen',
|
||||||
'image_size' => 'Dimensionen:',
|
'image_size' => 'Dimensionen:',
|
||||||
'selected_size' => 'Ausgewählt:'
|
'selected_size' => 'Ausgewählt:'
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ return [
|
||||||
'invalid_type' => 'Invalid field type used :type.',
|
'invalid_type' => 'Invalid field type used :type.',
|
||||||
'options_method_invalid_model' => "The attribute ':field' does not resolve to a valid model. Try specifying the options method for model class :model explicitly.",
|
'options_method_invalid_model' => "The attribute ':field' does not resolve to a valid model. Try specifying the options method for model class :model explicitly.",
|
||||||
'options_method_not_exists' => "The model class :model must define a method :method() returning options for the ':field' form field.",
|
'options_method_not_exists' => "The model class :model must define a method :method() returning options for the ':field' form field.",
|
||||||
'options_static_method_invalid_value' => "The static method ':method()' on :class did not return a valid options array.",
|
|
||||||
'colors_method_not_exists' => "The model class :model must define a method :method() returning html color HEX codes for the ':field' form field.",
|
'colors_method_not_exists' => "The model class :model must define a method :method() returning html color HEX codes for the ':field' form field.",
|
||||||
],
|
],
|
||||||
'widget' => [
|
'widget' => [
|
||||||
|
|
@ -373,7 +372,6 @@ return [
|
||||||
'editor' => [
|
'editor' => [
|
||||||
'menu_label' => 'Editor settings',
|
'menu_label' => 'Editor settings',
|
||||||
'menu_description' => 'Customize the global editor preferences, such as font size and color scheme.',
|
'menu_description' => 'Customize the global editor preferences, such as font size and color scheme.',
|
||||||
'preview' => 'Preview',
|
|
||||||
'font_size' => 'Font size',
|
'font_size' => 'Font size',
|
||||||
'tab_size' => 'Tab size',
|
'tab_size' => 'Tab size',
|
||||||
'use_hard_tabs' => 'Indent using tabs',
|
'use_hard_tabs' => 'Indent using tabs',
|
||||||
|
|
|
||||||
|
|
@ -396,8 +396,7 @@ return [
|
||||||
'filter' => [
|
'filter' => [
|
||||||
'all' => 'todo',
|
'all' => 'todo',
|
||||||
'options_method_not_exists' => "La clase de modelo :model debe definir un método :method() para regresar opciones para el filtro ':filter'.",
|
'options_method_not_exists' => "La clase de modelo :model debe definir un método :method() para regresar opciones para el filtro ':filter'.",
|
||||||
'date_all' => 'todo el período',
|
'date_all' => 'todo el período'
|
||||||
'number_all' => 'todos los números'
|
|
||||||
],
|
],
|
||||||
'import_export' => [
|
'import_export' => [
|
||||||
'upload_csv_file' => '1. Subir un archivo CSV',
|
'upload_csv_file' => '1. Subir un archivo CSV',
|
||||||
|
|
|
||||||
|
|
@ -228,7 +228,7 @@ return [
|
||||||
'preview_no_record_message' => 'Nessun record selezionato.',
|
'preview_no_record_message' => 'Nessun record selezionato.',
|
||||||
'select' => 'Seleziona',
|
'select' => 'Seleziona',
|
||||||
'select_all' => 'seleziona tutto',
|
'select_all' => 'seleziona tutto',
|
||||||
'select_none' => 'deseleziona tutto',
|
'select_none' => 'non selezionare niente',
|
||||||
'select_placeholder' => 'seleziona',
|
'select_placeholder' => 'seleziona',
|
||||||
'insert_row' => 'Inserisci riga',
|
'insert_row' => 'Inserisci riga',
|
||||||
'insert_row_below' => 'Inserisci riga sotto',
|
'insert_row_below' => 'Inserisci riga sotto',
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ return [
|
||||||
'invalid_type' => 'Ongeldig type veld: :type.',
|
'invalid_type' => 'Ongeldig type veld: :type.',
|
||||||
'options_method_invalid_model' => "Het attribuut ':field' levert geen geldig model op. Probeer de opties methode expliciet te specifieren voor modelklasse :model.",
|
'options_method_invalid_model' => "Het attribuut ':field' levert geen geldig model op. Probeer de opties methode expliciet te specifieren voor modelklasse :model.",
|
||||||
'options_method_not_exists' => 'De modelklasse :model moet de methode :method() definiëren met daarin opties voor het veld ":field".',
|
'options_method_not_exists' => 'De modelklasse :model moet de methode :method() definiëren met daarin opties voor het veld ":field".',
|
||||||
'options_static_method_invalid_value' => "De statische methode ':method()' in :class leverde geen geldige array met opties op.",
|
|
||||||
'colors_method_not_exists' => 'De modelklasse :model moet de methode :method() definiëren met daarin html HEX kleurcodes voor het veld ":field".',
|
'colors_method_not_exists' => 'De modelklasse :model moet de methode :method() definiëren met daarin html HEX kleurcodes voor het veld ":field".',
|
||||||
],
|
],
|
||||||
'widget' => [
|
'widget' => [
|
||||||
|
|
@ -373,7 +372,6 @@ return [
|
||||||
'editor' => [
|
'editor' => [
|
||||||
'menu_label' => 'Editor instellingen',
|
'menu_label' => 'Editor instellingen',
|
||||||
'menu_description' => 'Beheer editor instellingen, zoals lettergrootte en kleurschema.',
|
'menu_description' => 'Beheer editor instellingen, zoals lettergrootte en kleurschema.',
|
||||||
'preview' => 'Voorbeeldweergave',
|
|
||||||
'font_size' => 'Lettergrootte',
|
'font_size' => 'Lettergrootte',
|
||||||
'tab_size' => 'Tab grootte',
|
'tab_size' => 'Tab grootte',
|
||||||
'use_hard_tabs' => 'Inspringen met tabs',
|
'use_hard_tabs' => 'Inspringen met tabs',
|
||||||
|
|
@ -408,7 +406,6 @@ return [
|
||||||
'label' => 'Label',
|
'label' => 'Label',
|
||||||
'class_name' => 'Class naam',
|
'class_name' => 'Class naam',
|
||||||
'markup_tags' => 'Opmaak HTML-tags',
|
'markup_tags' => 'Opmaak HTML-tags',
|
||||||
'markup_tag' => 'Opmaak HTML-tag',
|
|
||||||
'allowed_empty_tags' => 'Toegestane lege HTML-tags',
|
'allowed_empty_tags' => 'Toegestane lege HTML-tags',
|
||||||
'allowed_empty_tags_comment' => 'Een lijst van HTML-tags die niet worden verwijderd als ze leeg zijn.',
|
'allowed_empty_tags_comment' => 'Een lijst van HTML-tags die niet worden verwijderd als ze leeg zijn.',
|
||||||
'allowed_tags' => 'Toegestane HTML-tags',
|
'allowed_tags' => 'Toegestane HTML-tags',
|
||||||
|
|
@ -419,7 +416,6 @@ return [
|
||||||
'remove_tags_comment' => 'Een lijst van HTML-tags die samen met hun inhoud worden verwijderd.',
|
'remove_tags_comment' => 'Een lijst van HTML-tags die samen met hun inhoud worden verwijderd.',
|
||||||
'line_breaker_tags' => 'Line breaker tags',
|
'line_breaker_tags' => 'Line breaker tags',
|
||||||
'line_breaker_tags_comment' => 'Een lijst van HTML-tags waartussen een line breaker element wordt geplaatst.',
|
'line_breaker_tags_comment' => 'Een lijst van HTML-tags waartussen een line breaker element wordt geplaatst.',
|
||||||
'toolbar_options' => 'Toolbar opties',
|
|
||||||
'toolbar_buttons' => 'Toolbar knoppen',
|
'toolbar_buttons' => 'Toolbar knoppen',
|
||||||
'toolbar_buttons_comment' => 'De toolbar knoppen die standaard getoond worden door de Rich Editor.',
|
'toolbar_buttons_comment' => 'De toolbar knoppen die standaard getoond worden door de Rich Editor.',
|
||||||
'toolbar_buttons_preset' => 'Voeg preset toe voor toolbar knoppen:',
|
'toolbar_buttons_preset' => 'Voeg preset toe voor toolbar knoppen:',
|
||||||
|
|
@ -428,11 +424,9 @@ return [
|
||||||
'minimal' => 'Minimaal',
|
'minimal' => 'Minimaal',
|
||||||
'full' => 'Volledig',
|
'full' => 'Volledig',
|
||||||
],
|
],
|
||||||
'paragraph_formats' => 'Paragraaf formaten',
|
|
||||||
'paragraph_formats_comment' => 'De opties die in de "Paragraaf formaat" lijst zullen verschijnen.',
|
|
||||||
],
|
],
|
||||||
'tooltips' => [
|
'tooltips' => [
|
||||||
'preview_website' => 'Voorbeeldweergave website',
|
'preview_website' => 'Voorvertoning website',
|
||||||
],
|
],
|
||||||
'mysettings' => [
|
'mysettings' => [
|
||||||
'menu_label' => 'Mijn instellingen',
|
'menu_label' => 'Mijn instellingen',
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,8 @@ return [
|
||||||
],
|
],
|
||||||
'field' => [
|
'field' => [
|
||||||
'invalid_type' => 'Использован неверный тип поля: :type.',
|
'invalid_type' => 'Использован неверный тип поля: :type.',
|
||||||
'options_method_invalid_model' => "Атрибут ':field' не соответствует допустимой модели. Попробуйте явно указать метод параметров для класса :model .",
|
|
||||||
'options_method_not_exists' => "Класс модели :model должен содержать метод :method(), возвращающий опции для поля формы ':field'.",
|
'options_method_not_exists' => "Класс модели :model должен содержать метод :method(), возвращающий опции для поля формы ':field'.",
|
||||||
'colors_method_not_exists' => "Класс модели :model должен содержать метод :method(), возвращающий HTML цвет в HEX для поля формы ':field'.",
|
'colors_method_not_exists' => "Класс модели :model должен содержать метод :method(), возвращающий HTML цвет в HEX для поля формы ':field'."
|
||||||
],
|
],
|
||||||
'widget' => [
|
'widget' => [
|
||||||
'not_registered' => "Класс виджета ':name' не зарегистрирован.",
|
'not_registered' => "Класс виджета ':name' не зарегистрирован.",
|
||||||
|
|
@ -25,12 +24,12 @@ return [
|
||||||
'access_denied' => [
|
'access_denied' => [
|
||||||
'label' => 'Доступ запрещен',
|
'label' => 'Доступ запрещен',
|
||||||
'help' => 'У вас нет необходимых прав для просмотра этой страницы.',
|
'help' => 'У вас нет необходимых прав для просмотра этой страницы.',
|
||||||
'cms_link' => 'Перейти к CMS',
|
'cms_link' => 'Перейти к CMS'
|
||||||
],
|
],
|
||||||
'no_database' => [
|
'no_database' => [
|
||||||
'label' => 'Отсутствует база данных',
|
'label' => 'Отсутствует база данных',
|
||||||
'help' => "Для доступа к серверу требуется база данных. Проверьте, что база данных настроена и перенесена, прежде чем повторять попытку.",
|
'help' => "Для доступа к серверу требуется база данных. Проверьте, что база данных настроена и перенесена, прежде чем повторять попытку.",
|
||||||
'cms_link' => 'Вернуться на главную страницу',
|
'cms_link' => 'Вернуться на главную страницу'
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'partial' => [
|
'partial' => [
|
||||||
|
|
@ -42,12 +41,6 @@ return [
|
||||||
'not_found' => "AJAX обработчик ':name' не найден.",
|
'not_found' => "AJAX обработчик ':name' не найден.",
|
||||||
],
|
],
|
||||||
'account' => [
|
'account' => [
|
||||||
'impersonate' => 'Имперсонация пользователя',
|
|
||||||
'impersonate_confirm' => 'Вы уверены, что хотите имперсонировать себя в качестве этого пользователя? Вы сможете вернуться в исходное состояние выйдя из системы.',
|
|
||||||
'impersonate_success' => 'Теперь вы имперсонированы как этот пользователь',
|
|
||||||
'impersonate_working' => 'Имперсонация...',
|
|
||||||
'impersonating' => 'Имперсонация :full_name',
|
|
||||||
'stop_impersonating' => 'Остановить имперсонацию',
|
|
||||||
'signed_in_as' => 'Выполнен вход как :full_name',
|
'signed_in_as' => 'Выполнен вход как :full_name',
|
||||||
'sign_out' => 'Выйти',
|
'sign_out' => 'Выйти',
|
||||||
'login' => 'Вход',
|
'login' => 'Вход',
|
||||||
|
|
@ -57,9 +50,9 @@ return [
|
||||||
'password_placeholder' => 'пароль',
|
'password_placeholder' => 'пароль',
|
||||||
'remember_me' => 'Оставаться в системе',
|
'remember_me' => 'Оставаться в системе',
|
||||||
'forgot_password' => 'Забыли пароль?',
|
'forgot_password' => 'Забыли пароль?',
|
||||||
'enter_email' => 'Введите ваш Email',
|
'enter_email' => 'Введите вашу почту',
|
||||||
'enter_login' => 'Введите ваш Логин',
|
'enter_login' => 'Введите ваш Логин',
|
||||||
'email_placeholder' => 'email',
|
'email_placeholder' => 'почта',
|
||||||
'enter_new_password' => 'Введите новый пароль',
|
'enter_new_password' => 'Введите новый пароль',
|
||||||
'password_reset' => 'Сбросить пароль',
|
'password_reset' => 'Сбросить пароль',
|
||||||
'restore_success' => 'На вашу электронную почту отправлено сообщение с инструкциями для восстановления пароля.',
|
'restore_success' => 'На вашу электронную почту отправлено сообщение с инструкциями для восстановления пароля.',
|
||||||
|
|
@ -70,7 +63,7 @@ return [
|
||||||
'apply' => 'Применить',
|
'apply' => 'Применить',
|
||||||
'cancel' => 'Отменить',
|
'cancel' => 'Отменить',
|
||||||
'delete' => 'Удалить',
|
'delete' => 'Удалить',
|
||||||
'ok' => 'OK',
|
'ok' => 'OK'
|
||||||
],
|
],
|
||||||
'dashboard' => [
|
'dashboard' => [
|
||||||
'menu_label' => 'Панель управления',
|
'menu_label' => 'Панель управления',
|
||||||
|
|
@ -99,7 +92,7 @@ return [
|
||||||
'expand_all' => 'Развернуть всё',
|
'expand_all' => 'Развернуть всё',
|
||||||
'status' => [
|
'status' => [
|
||||||
'widget_title_default' => 'Статус системы',
|
'widget_title_default' => 'Статус системы',
|
||||||
'update_available' => '{0} нет новых обновлений!|{1} доступно новое обновление!|[2,Inf] доступны новые обновления!',
|
'update_available' => '{0} нет новый обновлений!|{1} доступно новое обновление!|[2,Inf] доступны новые обновления!',
|
||||||
'updates_pending' => 'Доступны обновления',
|
'updates_pending' => 'Доступны обновления',
|
||||||
'updates_nil' => 'Используется последняя версия',
|
'updates_nil' => 'Используется последняя версия',
|
||||||
'updates_link' => 'Обновить',
|
'updates_link' => 'Обновить',
|
||||||
|
|
@ -109,7 +102,7 @@ return [
|
||||||
'core_build' => 'Сборка',
|
'core_build' => 'Сборка',
|
||||||
'event_log' => 'Лог событий',
|
'event_log' => 'Лог событий',
|
||||||
'request_log' => 'Лог запросов',
|
'request_log' => 'Лог запросов',
|
||||||
'app_birthday' => 'Онлайн с',
|
'app_birthday' => 'Онлайн с'
|
||||||
],
|
],
|
||||||
'welcome' => [
|
'welcome' => [
|
||||||
'widget_title_default' => 'Добро пожаловать',
|
'widget_title_default' => 'Добро пожаловать',
|
||||||
|
|
@ -118,7 +111,7 @@ return [
|
||||||
'first_sign_in' => 'Это первый раз, когда вы вошли в систему.',
|
'first_sign_in' => 'Это первый раз, когда вы вошли в систему.',
|
||||||
'last_sign_in' => 'Последний раз вы заходили',
|
'last_sign_in' => 'Последний раз вы заходили',
|
||||||
'view_access_logs' => 'Посмотреть лог доступа',
|
'view_access_logs' => 'Посмотреть лог доступа',
|
||||||
'nice_message' => 'Хорошего дня!',
|
'nice_message' => 'Хорошего дня!'
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'user' => [
|
'user' => [
|
||||||
|
|
@ -170,7 +163,7 @@ return [
|
||||||
'new' => 'Добавить группу',
|
'new' => 'Добавить группу',
|
||||||
'delete_confirm' => 'Вы действительно хотите удалить эту группу администраторов?',
|
'delete_confirm' => 'Вы действительно хотите удалить эту группу администраторов?',
|
||||||
'return' => 'Вернуться к списку групп',
|
'return' => 'Вернуться к списку групп',
|
||||||
'users_count' => 'Пользователи',
|
'users_count' => 'Пользователи'
|
||||||
],
|
],
|
||||||
'role' => [
|
'role' => [
|
||||||
'name' => 'Роль',
|
'name' => 'Роль',
|
||||||
|
|
@ -184,10 +177,10 @@ return [
|
||||||
'new' => 'Новая роль',
|
'new' => 'Новая роль',
|
||||||
'delete_confirm' => 'Удалить эту роль администратора?',
|
'delete_confirm' => 'Удалить эту роль администратора?',
|
||||||
'return' => 'Вернуться к списку ролей',
|
'return' => 'Вернуться к списку ролей',
|
||||||
'users_count' => 'Пользователи',
|
'users_count' => 'Пользователи'
|
||||||
],
|
],
|
||||||
'preferences' => [
|
'preferences' => [
|
||||||
'not_authenticated' => 'Невозможно загрузить или сохранить настройки для неавторизованного пользователя.',
|
'not_authenticated' => 'Невозможно загрузить или сохранить настройки для неавторизованного пользователя.'
|
||||||
],
|
],
|
||||||
'trashed_hint_title' => 'Этот аккаунт был удален',
|
'trashed_hint_title' => 'Этот аккаунт был удален',
|
||||||
'trashed_hint_desc' => 'Этот аккаунт был удален и не может быть авторизован. Чтобы восстановить его, нажмите иконку восстановления пользователя в правом нижнем углу.',
|
'trashed_hint_desc' => 'Этот аккаунт был удален и не может быть авторизован. Чтобы восстановить его, нажмите иконку восстановления пользователя в правом нижнем углу.',
|
||||||
|
|
@ -221,7 +214,7 @@ return [
|
||||||
'delete_selected_confirm' => 'Удалить выбранные записи?',
|
'delete_selected_confirm' => 'Удалить выбранные записи?',
|
||||||
'delete_selected_success' => 'Выбранные записи успешно удалены.',
|
'delete_selected_success' => 'Выбранные записи успешно удалены.',
|
||||||
'column_switch_true' => 'Да',
|
'column_switch_true' => 'Да',
|
||||||
'column_switch_false' => 'Нет',
|
'column_switch_false' => 'Нет'
|
||||||
],
|
],
|
||||||
'fileupload' => [
|
'fileupload' => [
|
||||||
'attachment' => 'Приложение',
|
'attachment' => 'Приложение',
|
||||||
|
|
@ -233,7 +226,7 @@ return [
|
||||||
'upload_file' => 'Загрузить файл',
|
'upload_file' => 'Загрузить файл',
|
||||||
'upload_error' => 'Ошибка загрузки',
|
'upload_error' => 'Ошибка загрузки',
|
||||||
'remove_confirm' => 'Вы уверены?',
|
'remove_confirm' => 'Вы уверены?',
|
||||||
'remove_file' => 'Удалить файл',
|
'remove_file' => 'Удалить файл'
|
||||||
],
|
],
|
||||||
'repeater' => [
|
'repeater' => [
|
||||||
'add_new_item' => 'Добавить новый объект',
|
'add_new_item' => 'Добавить новый объект',
|
||||||
|
|
@ -299,16 +292,15 @@ return [
|
||||||
'delete_row' => 'Удалить строку',
|
'delete_row' => 'Удалить строку',
|
||||||
'concurrency_file_changed_title' => 'Файл был изменен',
|
'concurrency_file_changed_title' => 'Файл был изменен',
|
||||||
'concurrency_file_changed_description' => 'Файл,редактируемый вами, был изменен другим пользователем. Вы можете перезагрузить файл и потерять ваши изменения или перезаписать его',
|
'concurrency_file_changed_description' => 'Файл,редактируемый вами, был изменен другим пользователем. Вы можете перезагрузить файл и потерять ваши изменения или перезаписать его',
|
||||||
'return_to_list' => 'Вернуться к списку',
|
'return_to_list' => 'Вернуться к списку'
|
||||||
],
|
],
|
||||||
'recordfinder' => [
|
'recordfinder' => [
|
||||||
'find_record' => 'Найти запись',
|
'find_record' => 'Найти запись',
|
||||||
'invalid_model_class' => 'Предоставленный класс модели ":modelClass" для поиска записи является недействительным',
|
'cancel' => 'Отмена'
|
||||||
'cancel' => 'Отмена',
|
|
||||||
],
|
],
|
||||||
'pagelist' => [
|
'pagelist' => [
|
||||||
'page_link' => 'Ссылка на страницу',
|
'page_link' => 'Ссылка на страницу',
|
||||||
'select_page' => 'Выберите страницу...',
|
'select_page' => 'Выберите страницу...'
|
||||||
],
|
],
|
||||||
'relation' => [
|
'relation' => [
|
||||||
'missing_config' => "Поведение отношения не имеет конфигурации для ':config'.",
|
'missing_config' => "Поведение отношения не имеет конфигурации для ':config'.",
|
||||||
|
|
@ -341,11 +333,11 @@ return [
|
||||||
'link_name' => 'Соединение :name',
|
'link_name' => 'Соединение :name',
|
||||||
'unlink' => 'Отвязать',
|
'unlink' => 'Отвязать',
|
||||||
'unlink_name' => 'Разъединение :name',
|
'unlink_name' => 'Разъединение :name',
|
||||||
'unlink_confirm' => 'Вы уверены?',
|
'unlink_confirm' => 'Вы уверены?'
|
||||||
],
|
],
|
||||||
'reorder' => [
|
'reorder' => [
|
||||||
'default_title' => 'Сортировать записи',
|
'default_title' => 'Сортировать записи',
|
||||||
'no_records' => 'Нет доступных записей для сортировки.',
|
'no_records' => 'Нет доступных записей для сортировки.'
|
||||||
],
|
],
|
||||||
'model' => [
|
'model' => [
|
||||||
'name' => 'Модель',
|
'name' => 'Модель',
|
||||||
|
|
@ -363,7 +355,6 @@ return [
|
||||||
'extension' => 'Расширение PHP :name не установлено. Установите эту библиотеку и активируйте расширение.',
|
'extension' => 'Расширение PHP :name не установлено. Установите эту библиотеку и активируйте расширение.',
|
||||||
'plugin_missing' => 'Плагин :name имеет зависимость. Установите этот плагин.',
|
'plugin_missing' => 'Плагин :name имеет зависимость. Установите этот плагин.',
|
||||||
'debug' => 'Режим отладки включен. Это не рекомендуется для рабочих инсталяций.',
|
'debug' => 'Режим отладки включен. Это не рекомендуется для рабочих инсталяций.',
|
||||||
'decompileBackendAssets' => 'Ассеты в бэкенде в настоящее время декомпилированы. Это не рекомендуется для рабочих инсталяций.',
|
|
||||||
],
|
],
|
||||||
'editor' => [
|
'editor' => [
|
||||||
'menu_label' => 'Настройки редактора',
|
'menu_label' => 'Настройки редактора',
|
||||||
|
|
@ -402,7 +393,6 @@ return [
|
||||||
'label' => 'Название',
|
'label' => 'Название',
|
||||||
'class_name' => 'Класс',
|
'class_name' => 'Класс',
|
||||||
'markup_tags' => 'Теги разметки',
|
'markup_tags' => 'Теги разметки',
|
||||||
'markup_tag' => 'Тег разметки',
|
|
||||||
'allowed_empty_tags' => 'Разрешенные пустые теги',
|
'allowed_empty_tags' => 'Разрешенные пустые теги',
|
||||||
'allowed_empty_tags_comment' => 'Список тегов, которые не будут удаляться, если внутри них нет содержания.',
|
'allowed_empty_tags_comment' => 'Список тегов, которые не будут удаляться, если внутри них нет содержания.',
|
||||||
'allowed_tags' => 'Разрешенные теги',
|
'allowed_tags' => 'Разрешенные теги',
|
||||||
|
|
@ -413,29 +403,20 @@ return [
|
||||||
'remove_tags_comment' => 'Список тегов, которые будут удалены вместе с их содержанием.',
|
'remove_tags_comment' => 'Список тегов, которые будут удалены вместе с их содержанием.',
|
||||||
'line_breaker_tags' => 'Теги с переводом строки',
|
'line_breaker_tags' => 'Теги с переводом строки',
|
||||||
'line_breaker_tags_comment' => 'Список тегов, в которых будет использоваться тег перевода строки',
|
'line_breaker_tags_comment' => 'Список тегов, в которых будет использоваться тег перевода строки',
|
||||||
'toolbar_options' => 'Опции панели инструментов',
|
|
||||||
'toolbar_buttons' => 'Кнопки панели инструментов',
|
'toolbar_buttons' => 'Кнопки панели инструментов',
|
||||||
'toolbar_buttons_comment' => 'Кнопки панели инструментов, которые будут отображаться в Rich Editor по умолчанию.',
|
'toolbar_buttons_comment' => 'Кнопки панели инструментов, которые будут отображаться в Rich Editor по умолчанию.'
|
||||||
'toolbar_buttons_preset' => 'Вставить предустановленный набор кнопок панели инструментов:',
|
|
||||||
'toolbar_buttons_presets' => [
|
|
||||||
'default' => 'По умолчанию',
|
|
||||||
'minimal' => 'Минимальный',
|
|
||||||
'full' => 'Полный',
|
|
||||||
],
|
|
||||||
'paragraph_formats' => 'Форматы абзацев',
|
|
||||||
'paragraph_formats_comment' => 'Опции появляющиеся в выпадающем списке Форматы абзацев.',
|
|
||||||
],
|
],
|
||||||
'tooltips' => [
|
'tooltips' => [
|
||||||
'preview_website' => 'Просмотр сайта',
|
'preview_website' => 'Просмотр сайта'
|
||||||
],
|
],
|
||||||
'mysettings' => [
|
'mysettings' => [
|
||||||
'menu_label' => 'Мои настройки',
|
'menu_label' => 'Мои настройки',
|
||||||
'menu_description' => 'Управление настройками учетной записи администратора.',
|
'menu_description' => 'Управление настройками учетной записи администратора.'
|
||||||
],
|
],
|
||||||
'myaccount' => [
|
'myaccount' => [
|
||||||
'menu_label' => 'Мой аккаунт',
|
'menu_label' => 'Мой аккаунт',
|
||||||
'menu_description' => 'Управление личной информацией (имя, почта, пароль)',
|
'menu_description' => 'Управление личной информацией (имя, почта, пароль)',
|
||||||
'menu_keywords' => 'безопасность логин',
|
'menu_keywords' => 'безопасность логин'
|
||||||
],
|
],
|
||||||
'branding' => [
|
'branding' => [
|
||||||
'menu_label' => 'Персонализация панели управления',
|
'menu_label' => 'Персонализация панели управления',
|
||||||
|
|
@ -460,7 +441,7 @@ return [
|
||||||
'menu_mode_inline' => 'Строчный',
|
'menu_mode_inline' => 'Строчный',
|
||||||
'menu_mode_inline_no_icons' => 'Строчный (без иконок)',
|
'menu_mode_inline_no_icons' => 'Строчный (без иконок)',
|
||||||
'menu_mode_tile' => 'Плитка',
|
'menu_mode_tile' => 'Плитка',
|
||||||
'menu_mode_collapsed' => 'Схлопнутый',
|
'menu_mode_collapsed' => 'Схлопнутый'
|
||||||
],
|
],
|
||||||
'backend_preferences' => [
|
'backend_preferences' => [
|
||||||
'menu_label' => 'Настройки панели управления',
|
'menu_label' => 'Настройки панели управления',
|
||||||
|
|
@ -470,7 +451,7 @@ return [
|
||||||
'timezone' => 'Часовой пояс',
|
'timezone' => 'Часовой пояс',
|
||||||
'timezone_comment' => 'Выводить даты в выбранном часовом поясе.',
|
'timezone_comment' => 'Выводить даты в выбранном часовом поясе.',
|
||||||
'locale' => 'Язык',
|
'locale' => 'Язык',
|
||||||
'locale_comment' => 'Выберите желаемый язык панели управления.',
|
'locale_comment' => 'Выберите желаемый язык панели управления.'
|
||||||
],
|
],
|
||||||
'access_log' => [
|
'access_log' => [
|
||||||
'hint' => 'В этом журнале отображается список успешных попыток авторизаций администраторов. Записи хранятся :days дней.',
|
'hint' => 'В этом журнале отображается список успешных попыток авторизаций администраторов. Записи хранятся :days дней.',
|
||||||
|
|
@ -483,13 +464,13 @@ return [
|
||||||
'ip_address' => 'IP адрес',
|
'ip_address' => 'IP адрес',
|
||||||
'first_name' => 'Имя',
|
'first_name' => 'Имя',
|
||||||
'last_name' => 'Фамилия',
|
'last_name' => 'Фамилия',
|
||||||
'email' => 'Email',
|
'email' => 'Почта'
|
||||||
],
|
],
|
||||||
'filter' => [
|
'filter' => [
|
||||||
'all' => 'все',
|
'all' => 'все',
|
||||||
'options_method_not_exists' => "Модель класса :model должна определить метод :method() возвращающего варианты для фильтра ':filter'.",
|
'options_method_not_exists' => "Модель класса :model должна определить метод :method() возвращающего варианты для фильтра ':filter'.",
|
||||||
'date_all' => 'весь период',
|
'date_all' => 'весь период',
|
||||||
'number_all' => 'все номера',
|
'number_all' => 'все номера'
|
||||||
],
|
],
|
||||||
'import_export' => [
|
'import_export' => [
|
||||||
'upload_csv_file' => '1. Загрузка CSV-файл',
|
'upload_csv_file' => '1. Загрузка CSV-файл',
|
||||||
|
|
@ -560,14 +541,12 @@ return [
|
||||||
'iso_8859_13' => 'ISO-8859-13 (Latin-7, Baltic Rim)',
|
'iso_8859_13' => 'ISO-8859-13 (Latin-7, Baltic Rim)',
|
||||||
'iso_8859_14' => 'ISO-8859-14 (Latin-8, Celtic)',
|
'iso_8859_14' => 'ISO-8859-14 (Latin-8, Celtic)',
|
||||||
'iso_8859_15' => 'ISO-8859-15 (Latin-9, Western European revision with euro sign)',
|
'iso_8859_15' => 'ISO-8859-15 (Latin-9, Western European revision with euro sign)',
|
||||||
'windows_1250' => 'Windows-1250 (CP1250, Central and Eastern European)',
|
|
||||||
'windows_1251' => 'Windows-1251 (CP1251)',
|
'windows_1251' => 'Windows-1251 (CP1251)',
|
||||||
'windows_1252' => 'Windows-1252 (CP1252)'
|
'windows_1252' => 'Windows-1252 (CP1252)'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'permissions' => [
|
'permissions' => [
|
||||||
'manage_media' => 'Загрузка и управление медиаконтентом - изображениями, видео, звуками, документами',
|
'manage_media' => 'Загрузка и управление медиаконтентом - изображениями, видео, звуками, документами',
|
||||||
'allow_unsafe_markdown' => 'Использовать небезопасный Markdown (может включать Javascript)',
|
|
||||||
],
|
],
|
||||||
'mediafinder' => [
|
'mediafinder' => [
|
||||||
'label' => 'Поиск медиа',
|
'label' => 'Поиск медиа',
|
||||||
|
|
@ -635,6 +614,6 @@ return [
|
||||||
'selection_mode' => 'Режим выделения',
|
'selection_mode' => 'Режим выделения',
|
||||||
'resize_image' => 'Изменение размера изображения',
|
'resize_image' => 'Изменение размера изображения',
|
||||||
'image_size' => 'Размер изображения:',
|
'image_size' => 'Размер изображения:',
|
||||||
'selected_size' => 'Выбрано:',
|
'selected_size' => 'Выбрано:'
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ return [
|
||||||
'invalid_type' => 'Uporabljen je neveljaven tip polja :type.',
|
'invalid_type' => 'Uporabljen je neveljaven tip polja :type.',
|
||||||
'options_method_invalid_model' => "Atribut ':field' ne ustreza veljavnemu modelu. Poskusite natančno določiti možnosti metode za model :model.",
|
'options_method_invalid_model' => "Atribut ':field' ne ustreza veljavnemu modelu. Poskusite natančno določiti možnosti metode za model :model.",
|
||||||
'options_method_not_exists' => "Model :model mora vsebovati metodo :method(), ki vrača možnosti za polje ':field' na obrazcu.",
|
'options_method_not_exists' => "Model :model mora vsebovati metodo :method(), ki vrača možnosti za polje ':field' na obrazcu.",
|
||||||
'options_static_method_invalid_value' => "Statična metoda ':method()' v razredu :class ni vrnila veljavnih možnosti.",
|
|
||||||
'colors_method_not_exists' => "Model :model mora vsebovati metodo :method(), ki vrača HTML barvne kode v HEX formatu za polje ':field' na obrazcu.",
|
'colors_method_not_exists' => "Model :model mora vsebovati metodo :method(), ki vrača HTML barvne kode v HEX formatu za polje ':field' na obrazcu.",
|
||||||
],
|
],
|
||||||
'widget' => [
|
'widget' => [
|
||||||
|
|
@ -49,10 +48,6 @@ return [
|
||||||
'impersonate_working' => 'Impersoniram...',
|
'impersonate_working' => 'Impersoniram...',
|
||||||
'impersonating' => 'Impersonacija uporabnika :full_name',
|
'impersonating' => 'Impersonacija uporabnika :full_name',
|
||||||
'stop_impersonating' => 'Prekliči impersonacijo',
|
'stop_impersonating' => 'Prekliči impersonacijo',
|
||||||
'unsuspend' => 'Odsuspendiraj',
|
|
||||||
'unsuspend_confirm' => 'Ali ste prepričani, da želite odsuspendirati tega uporabnika?',
|
|
||||||
'unsuspend_success' => 'Uporabnik je odsuspendiran.',
|
|
||||||
'unsuspend_working' => 'Odsuspendiram...',
|
|
||||||
'signed_in_as' => 'Prijavljeni ste kot :full_name',
|
'signed_in_as' => 'Prijavljeni ste kot :full_name',
|
||||||
'sign_out' => 'Odjava',
|
'sign_out' => 'Odjava',
|
||||||
'login' => 'Prijava',
|
'login' => 'Prijava',
|
||||||
|
|
@ -407,7 +402,6 @@ return [
|
||||||
'label' => 'Opis',
|
'label' => 'Opis',
|
||||||
'class_name' => 'Oznaka razreda',
|
'class_name' => 'Oznaka razreda',
|
||||||
'markup_tags' => 'Označevalne oznake',
|
'markup_tags' => 'Označevalne oznake',
|
||||||
'markup_tag' => 'Označevalna oznaka',
|
|
||||||
'allowed_empty_tags' => 'Dovoljene prazne oznake',
|
'allowed_empty_tags' => 'Dovoljene prazne oznake',
|
||||||
'allowed_empty_tags_comment' => 'Seznam oznak, ki niso odstranjene, če v njih ni vsebine.',
|
'allowed_empty_tags_comment' => 'Seznam oznak, ki niso odstranjene, če v njih ni vsebine.',
|
||||||
'allowed_tags' => 'Dovoljene oznake',
|
'allowed_tags' => 'Dovoljene oznake',
|
||||||
|
|
@ -418,7 +412,6 @@ return [
|
||||||
'remove_tags_comment' => 'Seznam oznak, ki so odstranjene skupaj z njihovo vsebino.',
|
'remove_tags_comment' => 'Seznam oznak, ki so odstranjene skupaj z njihovo vsebino.',
|
||||||
'line_breaker_tags' => 'Oznake prekinitve vrstic',
|
'line_breaker_tags' => 'Oznake prekinitve vrstic',
|
||||||
'line_breaker_tags_comment' => 'Seznam oznak, ki se uporabljajo za postavitev elementa prekinitve med vrstice.',
|
'line_breaker_tags_comment' => 'Seznam oznak, ki se uporabljajo za postavitev elementa prekinitve med vrstice.',
|
||||||
'toolbar_options' => 'Nastavitve orodne vrstice',
|
|
||||||
'toolbar_buttons' => 'Gumbi orodne vrstice',
|
'toolbar_buttons' => 'Gumbi orodne vrstice',
|
||||||
'toolbar_buttons_comment' => 'Gumbi orodne vrstice, ki se privzeto prikažejo v urejevalniku. [fullscreen, bold, italic, underline, strikeThrough, subscript, superscript, fontFamily, fontSize, |, color, emoticons, inlineStyle, paragraphStyle, |, paragraphFormat, align, formatOL, formatUL, outdent, indent, quote, insertHR, -, insertLink, insertImage, insertVideo, insertAudio, insertFile, insertTable, undo, redo, clearFormatting, selectAll, html]',
|
'toolbar_buttons_comment' => 'Gumbi orodne vrstice, ki se privzeto prikažejo v urejevalniku. [fullscreen, bold, italic, underline, strikeThrough, subscript, superscript, fontFamily, fontSize, |, color, emoticons, inlineStyle, paragraphStyle, |, paragraphFormat, align, formatOL, formatUL, outdent, indent, quote, insertHR, -, insertLink, insertImage, insertVideo, insertAudio, insertFile, insertTable, undo, redo, clearFormatting, selectAll, html]',
|
||||||
'toolbar_buttons_preset' => 'Vstavite prednastavljeno konfiguracijo gumbov orodne vrstice:',
|
'toolbar_buttons_preset' => 'Vstavite prednastavljeno konfiguracijo gumbov orodne vrstice:',
|
||||||
|
|
@ -427,8 +420,6 @@ return [
|
||||||
'minimal' => 'Minimalno',
|
'minimal' => 'Minimalno',
|
||||||
'full' => 'Polno',
|
'full' => 'Polno',
|
||||||
],
|
],
|
||||||
'paragraph_formats' => 'Formati odstavkov',
|
|
||||||
'paragraph_formats_comment' => 'Možnosti, ki se prikažejo v spustnem seznamu Format odstavka.',
|
|
||||||
],
|
],
|
||||||
'tooltips' => [
|
'tooltips' => [
|
||||||
'preview_website' => 'Ogled spletne strani',
|
'preview_website' => 'Ogled spletne strani',
|
||||||
|
|
@ -479,7 +470,7 @@ return [
|
||||||
],
|
],
|
||||||
'access_log' => [
|
'access_log' => [
|
||||||
'hint' => 'Ta dnevnik beleži seznam uspešnih prijav administratorjev. Zapisi se hranijo :days dni.',
|
'hint' => 'Ta dnevnik beleži seznam uspešnih prijav administratorjev. Zapisi se hranijo :days dni.',
|
||||||
'menu_label' => 'Dnevnik dostopov',
|
'menu_label' => 'Dnevnik dostopa',
|
||||||
'menu_description' => 'Prikaz seznama uspešnih prijav administratorjev.',
|
'menu_description' => 'Prikaz seznama uspešnih prijav administratorjev.',
|
||||||
'id' => 'ID',
|
'id' => 'ID',
|
||||||
'created_at' => 'Datum in čas',
|
'created_at' => 'Datum in čas',
|
||||||
|
|
@ -567,12 +558,11 @@ return [
|
||||||
'iso_8859_15' => 'ISO-8859-15 (Latin-9, Western European revision with euro sign)',
|
'iso_8859_15' => 'ISO-8859-15 (Latin-9, Western European revision with euro sign)',
|
||||||
'windows_1250' => 'Windows-1250 (CP1250, Central and Eastern European)',
|
'windows_1250' => 'Windows-1250 (CP1250, Central and Eastern European)',
|
||||||
'windows_1251' => 'Windows-1251 (CP1251)',
|
'windows_1251' => 'Windows-1251 (CP1251)',
|
||||||
'windows_1252' => 'Windows-1252 (CP1252)',
|
'windows_1252' => 'Windows-1252 (CP1252)'
|
||||||
],
|
]
|
||||||
],
|
],
|
||||||
'permissions' => [
|
'permissions' => [
|
||||||
'manage_media' => 'Nalaganje in upravljanje z media vsebinami - slike, video posnetki, zvočni posnetki, dokumenti',
|
'manage_media' => 'Nalaganje in upravljanje z media vsebinami - slike, video posnetki, zvočni posnetki, dokumenti',
|
||||||
'allow_unsafe_markdown' => 'Dovoli uporabo nevarnih označb (lahko vključi Javascript)',
|
|
||||||
],
|
],
|
||||||
'mediafinder' => [
|
'mediafinder' => [
|
||||||
'label' => 'Media brskalnik',
|
'label' => 'Media brskalnik',
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,6 @@ return [
|
||||||
'widget_width' => '寬度',
|
'widget_width' => '寬度',
|
||||||
'full_width' => '全部寬度',
|
'full_width' => '全部寬度',
|
||||||
'add_widget' => '新增元件',
|
'add_widget' => '新增元件',
|
||||||
'manage_widgets' => '管理元件',
|
|
||||||
'widget_inspector_title' => '元件設定',
|
'widget_inspector_title' => '元件設定',
|
||||||
'widget_inspector_description' => '設定報表元件',
|
'widget_inspector_description' => '設定報表元件',
|
||||||
'widget_columns_label' => '寬度 :columns',
|
'widget_columns_label' => '寬度 :columns',
|
||||||
|
|
@ -63,12 +62,6 @@ return [
|
||||||
'widget_new_row_description' => '把元件放到新列',
|
'widget_new_row_description' => '把元件放到新列',
|
||||||
'widget_title_label' => '元件標題',
|
'widget_title_label' => '元件標題',
|
||||||
'widget_title_error' => '需要元件標題',
|
'widget_title_error' => '需要元件標題',
|
||||||
'reset_layout' => '重置版面',
|
|
||||||
'reset_layout_confirm' => '確定重置為預設版面?',
|
|
||||||
'reset_layout_success' => '版面已重置。',
|
|
||||||
'make_default' => '設定為預設',
|
|
||||||
'make_default_confirm' => '確定將此版面設定為預設?',
|
|
||||||
'make_default_success' => '已設定此版面為預設。',
|
|
||||||
'status' => [
|
'status' => [
|
||||||
'widget_title_default' => '系統狀態',
|
'widget_title_default' => '系統狀態',
|
||||||
'update_available' => '{0} 更新可用!|{1} 更新可用!|[2,Inf] 更新可用!'
|
'update_available' => '{0} 更新可用!|{1} 更新可用!|[2,Inf] 更新可用!'
|
||||||
|
|
@ -177,7 +170,7 @@ return [
|
||||||
'field_off' => '關',
|
'field_off' => '關',
|
||||||
'field_on' => '開',
|
'field_on' => '開',
|
||||||
'add' => '增加',
|
'add' => '增加',
|
||||||
'apply' => '確定',
|
'apply' => '應用',
|
||||||
'cancel' => '取消',
|
'cancel' => '取消',
|
||||||
'close' => '關閉',
|
'close' => '關閉',
|
||||||
'confirm' => '確認',
|
'confirm' => '確認',
|
||||||
|
|
@ -304,9 +297,7 @@ return [
|
||||||
'email' => 'Email'
|
'email' => 'Email'
|
||||||
],
|
],
|
||||||
'filter' => [
|
'filter' => [
|
||||||
'all' => '全部',
|
'all' => '全部'
|
||||||
'date_all' => '全部區間',
|
|
||||||
'number_all' => '全部數目',
|
|
||||||
],
|
],
|
||||||
'permissions' => [
|
'permissions' => [
|
||||||
'manage_media' => 'Upload and manage media contents - images, videos, sounds, documents'
|
'manage_media' => 'Upload and manage media contents - images, videos, sounds, documents'
|
||||||
|
|
@ -325,10 +316,10 @@ return [
|
||||||
'display' => '顯示',
|
'display' => '顯示',
|
||||||
'filter_everything' => '所有',
|
'filter_everything' => '所有',
|
||||||
'filter_images' => '圖片',
|
'filter_images' => '圖片',
|
||||||
'filter_video' => '影片',
|
'filter_video' => '視頻',
|
||||||
'filter_audio' => '音訊',
|
'filter_audio' => '音頻',
|
||||||
'filter_documents' => '文檔',
|
'filter_documents' => '文檔',
|
||||||
'library' => '媒體庫',
|
'library' => '庫',
|
||||||
'size' => '大小',
|
'size' => '大小',
|
||||||
'title' => '標題',
|
'title' => '標題',
|
||||||
'last_modified' => '最近修改',
|
'last_modified' => '最近修改',
|
||||||
|
|
@ -341,7 +332,7 @@ return [
|
||||||
'multiple_selected' => '多選.',
|
'multiple_selected' => '多選.',
|
||||||
'uploading_file_num' => '上傳 :number 檔案...',
|
'uploading_file_num' => '上傳 :number 檔案...',
|
||||||
'uploading_complete' => '上傳完畢',
|
'uploading_complete' => '上傳完畢',
|
||||||
'order_by' => '排列方式',
|
'order_by' => '排序',
|
||||||
'folder' => '檔案夾',
|
'folder' => '檔案夾',
|
||||||
'no_files_found' => '沒找到您請求的檔案.',
|
'no_files_found' => '沒找到您請求的檔案.',
|
||||||
'delete_empty' => '請選擇刪除項.',
|
'delete_empty' => '請選擇刪除項.',
|
||||||
|
|
@ -371,9 +362,6 @@ return [
|
||||||
'selection_mode' => '選擇模式',
|
'selection_mode' => '選擇模式',
|
||||||
'resize_image' => '調整圖片',
|
'resize_image' => '調整圖片',
|
||||||
'image_size' => '圖片大小:',
|
'image_size' => '圖片大小:',
|
||||||
'selected_size' => '選中:',
|
'selected_size' => '選中:'
|
||||||
'direction' => '順序',
|
|
||||||
'direction_asc' => '升冪',
|
|
||||||
'direction_desc' => '降冪',
|
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,6 @@
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
<?php if (EditorSetting::isConfigured()): ?>
|
<?php if (EditorSetting::isConfigured()): ?>
|
||||||
<style>
|
<style>
|
||||||
<?= strip_tags(EditorSetting::renderCss()) ?>
|
<?= EditorSetting::renderCss() ?>
|
||||||
</style>
|
</style>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
|
|
||||||
|
|
@ -49,24 +49,15 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="toolbar-item toolbar-item-account">
|
<div class="toolbar-item toolbar-item-account">
|
||||||
<ul class="mainmenu-toolbar">
|
<ul class="mainmenu-toolbar">
|
||||||
<?php foreach (BackendMenu::listQuickActionItems() as $item): ?>
|
<li class="mainmenu-preview with-tooltip">
|
||||||
<li class="mainmenu-quick-action with-tooltip">
|
|
||||||
<a
|
<a
|
||||||
href="<?= $item->url ?>"
|
href="<?= Url::to('/') ?>"
|
||||||
title="<?= e(trans($item->label)) ?>"
|
target="_blank"
|
||||||
<?= Html::attributes($item->attributes) ?>
|
rel="noopener noreferrer"
|
||||||
>
|
title="<?= e(trans('backend::lang.tooltips.preview_website')) ?>">
|
||||||
|
<i class="icon-crosshairs"></i>
|
||||||
<?php if ($item->iconSvg): ?>
|
|
||||||
<img
|
|
||||||
src="<?= Url::asset($item->iconSvg) ?>"
|
|
||||||
class="svg-icon" loading="lazy" width="20" height="20" />
|
|
||||||
<?php endif ?>
|
|
||||||
|
|
||||||
<i class="<?= $item->iconSvg ? 'svg-replace' : null ?> <?= $item->icon ?>"></i>
|
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<?php endforeach ?>
|
|
||||||
<li class="mainmenu-account with-tooltip">
|
<li class="mainmenu-account with-tooltip">
|
||||||
<a
|
<a
|
||||||
href="javascript:;" onclick="$.oc.layout.toggleAccountMenu(this)"
|
href="javascript:;" onclick="$.oc.layout.toggleAccountMenu(this)"
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,8 @@ class AccessLog extends Model
|
||||||
$records = static::where('user_id', $user->id)
|
$records = static::where('user_id', $user->id)
|
||||||
->orderBy('created_at', 'desc')
|
->orderBy('created_at', 'desc')
|
||||||
->limit(2)
|
->limit(2)
|
||||||
->get();
|
->get()
|
||||||
|
;
|
||||||
|
|
||||||
if (!count($records)) {
|
if (!count($records)) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use Lang;
|
||||||
use Model;
|
use Model;
|
||||||
use Response;
|
use Response;
|
||||||
use League\Csv\Writer as CsvWriter;
|
use League\Csv\Writer as CsvWriter;
|
||||||
use League\Csv\EscapeFormula as CsvEscapeFormula;
|
use October\Rain\Parse\League\EscapeFormula as CsvEscapeFormula;
|
||||||
use ApplicationException;
|
use ApplicationException;
|
||||||
use SplTempFileObject;
|
use SplTempFileObject;
|
||||||
|
|
||||||
|
|
@ -112,7 +112,8 @@ abstract class ExportModel extends Model
|
||||||
$csv->setEscape($options['escape']);
|
$csv->setEscape($options['escape']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$csv->addFormatter(new CsvEscapeFormula());
|
// Temporary until upgrading to league/csv >= 9.1.0 (will be $csv->addFormatter($formatter))
|
||||||
|
$formatter = new CsvEscapeFormula();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add headers
|
* Add headers
|
||||||
|
|
@ -127,6 +128,10 @@ abstract class ExportModel extends Model
|
||||||
*/
|
*/
|
||||||
foreach ($results as $result) {
|
foreach ($results as $result) {
|
||||||
$data = $this->matchDataToColumns($result, $columns);
|
$data = $this->matchDataToColumns($result, $columns);
|
||||||
|
|
||||||
|
// Temporary until upgrading to league/csv >= 9.1.0
|
||||||
|
$data = $formatter($data);
|
||||||
|
|
||||||
$csv->insertOne($data);
|
$csv->insertOne($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ use Str;
|
||||||
use Lang;
|
use Lang;
|
||||||
use Model;
|
use Model;
|
||||||
use League\Csv\Reader as CsvReader;
|
use League\Csv\Reader as CsvReader;
|
||||||
use League\Csv\Statement as CsvStatement;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model used for importing data
|
* Model used for importing data
|
||||||
|
|
@ -109,6 +108,11 @@ abstract class ImportModel extends Model
|
||||||
*/
|
*/
|
||||||
$reader = CsvReader::createFromPath($filePath, 'r');
|
$reader = CsvReader::createFromPath($filePath, 'r');
|
||||||
|
|
||||||
|
// Filter out empty rows
|
||||||
|
$reader->addFilter(function (array $row) {
|
||||||
|
return count($row) > 1 || reset($row) !== null;
|
||||||
|
});
|
||||||
|
|
||||||
if ($options['delimiter'] !== null) {
|
if ($options['delimiter'] !== null) {
|
||||||
$reader->setDelimiter($options['delimiter']);
|
$reader->setDelimiter($options['delimiter']);
|
||||||
}
|
}
|
||||||
|
|
@ -121,11 +125,15 @@ abstract class ImportModel extends Model
|
||||||
$reader->setEscape($options['escape']);
|
$reader->setEscape($options['escape']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($options['firstRowTitles']) {
|
||||||
|
$reader->setOffset(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
$options['encoding'] !== null &&
|
$options['encoding'] !== null &&
|
||||||
$reader->supportsStreamFilter()
|
$reader->isActiveStreamFilter()
|
||||||
) {
|
) {
|
||||||
$reader->addStreamFilter(sprintf(
|
$reader->appendStreamFilter(sprintf(
|
||||||
'%s%s:%s',
|
'%s%s:%s',
|
||||||
TranscodeFilter::FILTER_NAME,
|
TranscodeFilter::FILTER_NAME,
|
||||||
strtolower($options['encoding']),
|
strtolower($options['encoding']),
|
||||||
|
|
@ -133,19 +141,8 @@ abstract class ImportModel extends Model
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create reader statement
|
|
||||||
$stmt = (new CsvStatement)
|
|
||||||
->where(function (array $row) {
|
|
||||||
// Filter out empty rows
|
|
||||||
return count($row) > 1 || reset($row) !== null;
|
|
||||||
});
|
|
||||||
|
|
||||||
if ($options['firstRowTitles']) {
|
|
||||||
$stmt = $stmt->offset(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = [];
|
$result = [];
|
||||||
$contents = $stmt->process($reader);
|
$contents = $reader->fetch();
|
||||||
foreach ($contents as $row) {
|
foreach ($contents as $row) {
|
||||||
$result[] = $this->processImportRow($row, $matches);
|
$result[] = $this->processImportRow($row, $matches);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,8 +27,8 @@ class User extends UserBase
|
||||||
public $rules = [
|
public $rules = [
|
||||||
'email' => 'required|between:6,255|email|unique:backend_users',
|
'email' => 'required|between:6,255|email|unique:backend_users',
|
||||||
'login' => 'required|between:2,255|unique:backend_users',
|
'login' => 'required|between:2,255|unique:backend_users',
|
||||||
'password' => 'required:create|min:4|confirmed',
|
'password' => 'required:create|between:4,255|confirmed',
|
||||||
'password_confirmation' => 'required_with:password|min:4'
|
'password_confirmation' => 'required_with:password|between:4,255'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -193,31 +193,3 @@ div.control-componentlist {
|
||||||
.nav.selector-group li.active {
|
.nav.selector-group li.active {
|
||||||
border-left-color: @brand-secondary;
|
border-left-color: @brand-secondary;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Fancy breadcrumb
|
|
||||||
//
|
|
||||||
body.breadcrumb-fancy .control-breadcrumb,
|
|
||||||
.control-breadcrumb.breadcrumb-fancy {
|
|
||||||
background-color: mix(black, saturate(@brand-secondary, 20%), 16%);
|
|
||||||
|
|
||||||
li {
|
|
||||||
background-color: mix(black, saturate(@brand-secondary, 20%), 31%);
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
background-color: mix(black, saturate(@brand-secondary, 20%), 16%);
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
border-left-color: mix(black, saturate(@brand-secondary, 20%), 16%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
border-left-color: mix(black, saturate(@brand-secondary, 20%), 31%);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:last-child)::before {
|
|
||||||
border-left-color: @brand-secondary;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ tabs:
|
||||||
|
|
||||||
editor_preview:
|
editor_preview:
|
||||||
type: partial
|
type: partial
|
||||||
label: backend::lang.editor.preview
|
|
||||||
tab: backend::lang.backend_preferences.code_editor
|
tab: backend::lang.backend_preferences.code_editor
|
||||||
path: field_editor_preview
|
path: field_editor_preview
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ App::before(function ($request) {
|
||||||
'middleware' => ['web'],
|
'middleware' => ['web'],
|
||||||
'prefix' => Config::get('cms.backendUri', 'backend')
|
'prefix' => Config::get('cms.backendUri', 'backend')
|
||||||
], function () {
|
], function () {
|
||||||
Route::any('{slug?}', 'Backend\Classes\BackendController@run')->where('slug', '(.*)?');
|
Route::any('{slug}', 'Backend\Classes\BackendController@run')->where('slug', '(.*)?');
|
||||||
})
|
})
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1283,7 +1283,6 @@ class Form extends WidgetBase
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Advanced usage, supplied options are callable
|
* Advanced usage, supplied options are callable
|
||||||
* [\Path\To\Class, methodName]
|
|
||||||
*/
|
*/
|
||||||
if (is_array($fieldOptions) && is_callable($fieldOptions)) {
|
if (is_array($fieldOptions) && is_callable($fieldOptions)) {
|
||||||
$fieldOptions = call_user_func($fieldOptions, $this, $field);
|
$fieldOptions = call_user_func($fieldOptions, $this, $field);
|
||||||
|
|
@ -1329,22 +1328,6 @@ class Form extends WidgetBase
|
||||||
* Field options are an explicit method reference
|
* Field options are an explicit method reference
|
||||||
*/
|
*/
|
||||||
elseif (is_string($fieldOptions)) {
|
elseif (is_string($fieldOptions)) {
|
||||||
// \Path\To\Class::staticMethodOptions
|
|
||||||
if (str_contains($fieldOptions, '::')) {
|
|
||||||
$options = explode('::', $fieldOptions);
|
|
||||||
if (count($options) === 2 && class_exists($options[0]) && method_exists($options[0], $options[1])) {
|
|
||||||
$result = $options[0]::{$options[1]}();
|
|
||||||
if (!is_array($result)) {
|
|
||||||
throw new ApplicationException(Lang::get('backend::lang.field.options_static_method_invalid_value', [
|
|
||||||
'class' => $options[0],
|
|
||||||
'method' => $options[1]
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// $model->{$fieldOptions}()
|
|
||||||
if (!$this->objectMethodExists($this->model, $fieldOptions)) {
|
if (!$this->objectMethodExists($this->model, $fieldOptions)) {
|
||||||
throw new ApplicationException(Lang::get('backend::lang.field.options_method_not_exists', [
|
throw new ApplicationException(Lang::get('backend::lang.field.options_method_not_exists', [
|
||||||
'model' => get_class($this->model),
|
'model' => get_class($this->model),
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,6 @@ use October\Rain\Html\Helper as HtmlHelper;
|
||||||
use October\Rain\Router\Helper as RouterHelper;
|
use October\Rain\Router\Helper as RouterHelper;
|
||||||
use System\Helpers\DateTime as DateTimeHelper;
|
use System\Helpers\DateTime as DateTimeHelper;
|
||||||
use System\Classes\PluginManager;
|
use System\Classes\PluginManager;
|
||||||
use System\Classes\MediaLibrary;
|
|
||||||
use System\Classes\ImageResizer;
|
|
||||||
use Backend\Classes\ListColumn;
|
use Backend\Classes\ListColumn;
|
||||||
use Backend\Classes\WidgetBase;
|
use Backend\Classes\WidgetBase;
|
||||||
use October\Rain\Database\Model;
|
use October\Rain\Database\Model;
|
||||||
|
|
@ -524,7 +522,7 @@ class Lists extends WidgetBase
|
||||||
/*
|
/*
|
||||||
* Apply sorting
|
* Apply sorting
|
||||||
*/
|
*/
|
||||||
if (($sortColumn = $this->getSortColumn()) && !$this->showTree && in_array($sortColumn, array_keys($this->getVisibleColumns()))) {
|
if (($sortColumn = $this->getSortColumn()) && !$this->showTree) {
|
||||||
if (($column = array_get($this->allColumns, $sortColumn)) && $column->valueFrom) {
|
if (($column = array_get($this->allColumns, $sortColumn)) && $column->valueFrom) {
|
||||||
$sortColumn = $this->isColumnPivot($column)
|
$sortColumn = $this->isColumnPivot($column)
|
||||||
? 'pivot_' . $column->valueFrom
|
? 'pivot_' . $column->valueFrom
|
||||||
|
|
@ -1189,42 +1187,6 @@ class Lists extends WidgetBase
|
||||||
return htmlentities($value, ENT_QUOTES, 'UTF-8', false);
|
return htmlentities($value, ENT_QUOTES, 'UTF-8', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Process an image value
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function evalImageTypeValue($record, $column, $value)
|
|
||||||
{
|
|
||||||
$config = $column->config;
|
|
||||||
|
|
||||||
// Get config options with defaults
|
|
||||||
$width = isset($config['width']) ? $config['width'] : 50;
|
|
||||||
$height = isset($config['height']) ? $config['height'] : 50;
|
|
||||||
$options = isset($config['options']) ? $config['options'] : [];
|
|
||||||
|
|
||||||
// Handle attachMany relationships
|
|
||||||
if (isset($record->attachMany[$column->columnName])) {
|
|
||||||
$image = $value->first();
|
|
||||||
|
|
||||||
// Handle attachOne relationships
|
|
||||||
} elseif (isset($record->attachOne[$column->columnName])) {
|
|
||||||
$image = $value;
|
|
||||||
|
|
||||||
// Handle absolute URLs
|
|
||||||
} elseif (str_contains($value, '://')) {
|
|
||||||
$image = $value;
|
|
||||||
|
|
||||||
// Assume all other values to be from the media library
|
|
||||||
} else {
|
|
||||||
$image = MediaLibrary::url($value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_null($image)) {
|
|
||||||
$imageUrl = ImageResizer::filterGetUrl($image, $width, $height, $options);
|
|
||||||
return "<img src='$imageUrl' width='$width' height='$height' />";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process as number, proxy to text
|
* Process as number, proxy to text
|
||||||
* @return string
|
* @return string
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
<div
|
<div
|
||||||
id="<?= $this->getId(); ?>"
|
|
||||||
class="control-filter <?= $cssClasses ?>"
|
class="control-filter <?= $cssClasses ?>"
|
||||||
data-control="filterwidget"
|
data-control="filterwidget"
|
||||||
data-options-handler="<?= $this->getEventHandler('onFilterGetOptions') ?>"
|
data-options-handler="<?= $this->getEventHandler('onFilterGetOptions') ?>"
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,11 @@
|
||||||
<?php namespace Cms;
|
<?php namespace Cms;
|
||||||
|
|
||||||
use App;
|
use App;
|
||||||
use Url;
|
|
||||||
use Lang;
|
|
||||||
use File;
|
|
||||||
use Event;
|
use Event;
|
||||||
use Backend;
|
use Backend;
|
||||||
use BackendMenu;
|
use BackendMenu;
|
||||||
use BackendAuth;
|
use BackendAuth;
|
||||||
use Backend\Models\UserRole;
|
use Backend\Models\UserRole;
|
||||||
use Cms\Classes\Theme as CmsTheme;
|
|
||||||
use Backend\Classes\WidgetManager;
|
use Backend\Classes\WidgetManager;
|
||||||
use October\Rain\Support\ModuleServiceProvider;
|
use October\Rain\Support\ModuleServiceProvider;
|
||||||
use System\Classes\SettingsManager;
|
use System\Classes\SettingsManager;
|
||||||
|
|
@ -58,10 +54,6 @@ class ServiceProvider extends ModuleServiceProvider
|
||||||
|
|
||||||
$this->bootMenuItemEvents();
|
$this->bootMenuItemEvents();
|
||||||
$this->bootRichEditorEvents();
|
$this->bootRichEditorEvents();
|
||||||
|
|
||||||
if (App::runningInBackend()) {
|
|
||||||
$this->bootBackendLocalization();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -175,19 +167,6 @@ class ServiceProvider extends ModuleServiceProvider
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$manager->registerQuickActions('October.Cms', [
|
|
||||||
'preview' => [
|
|
||||||
'label' => 'backend::lang.tooltips.preview_website',
|
|
||||||
'icon' => 'icon-crosshairs',
|
|
||||||
'url' => Url::to('/'),
|
|
||||||
'order' => 10,
|
|
||||||
'attributes' => [
|
|
||||||
'target' => '_blank',
|
|
||||||
'rel' => 'noopener noreferrer',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -305,20 +284,6 @@ class ServiceProvider extends ModuleServiceProvider
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Boots localization from an active theme for backend items.
|
|
||||||
*/
|
|
||||||
protected function bootBackendLocalization()
|
|
||||||
{
|
|
||||||
$theme = CmsTheme::getActiveTheme();
|
|
||||||
|
|
||||||
$langPath = $theme->getPath() . '/lang';
|
|
||||||
|
|
||||||
if (File::isDirectory($langPath)) {
|
|
||||||
Lang::addNamespace('themes.' . $theme->getId(), $langPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers events for menu items.
|
* Registers events for menu items.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,10 @@ use File;
|
||||||
use Lang;
|
use Lang;
|
||||||
use Config;
|
use Config;
|
||||||
use Request;
|
use Request;
|
||||||
use ApplicationException;
|
|
||||||
use ValidationException;
|
|
||||||
use Cms\Helpers\File as FileHelper;
|
use Cms\Helpers\File as FileHelper;
|
||||||
use October\Rain\Extension\Extendable;
|
use October\Rain\Extension\Extendable;
|
||||||
use October\Rain\Filesystem\PathResolver;
|
use ApplicationException;
|
||||||
|
use ValidationException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The CMS theme asset file class.
|
* The CMS theme asset file class.
|
||||||
|
|
@ -286,15 +285,14 @@ class Asset extends Extendable
|
||||||
$fileName = $this->fileName;
|
$fileName = $this->fileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Limit paths to those under the assets directory
|
||||||
$directory = $this->theme->getPath() . '/' . $this->dirName . '/';
|
$directory = $this->theme->getPath() . '/' . $this->dirName . '/';
|
||||||
$filePath = $directory . $fileName;
|
$path = realpath($directory . $fileName);
|
||||||
|
if (!starts_with($path, $directory)) {
|
||||||
// Limit paths to those under the theme's assets directory
|
|
||||||
if (!PathResolver::within($filePath, $directory)) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return PathResolver::resolve($filePath);
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -316,8 +316,7 @@ class CmsCompoundObject extends CmsObject
|
||||||
|
|
||||||
self::$objectComponentPropertyMap = $objectComponentMap;
|
self::$objectComponentPropertyMap = $objectComponentMap;
|
||||||
|
|
||||||
$expiresAt = now()->addMinutes(Config::get('cms.parsedPageCacheTTL', 10));
|
Cache::put($key, base64_encode(serialize($objectComponentMap)), Config::get('cms.parsedPageCacheTTL', 10));
|
||||||
Cache::put($key, base64_encode(serialize($objectComponentMap)), $expiresAt);
|
|
||||||
|
|
||||||
if (array_key_exists($componentName, $objectComponentMap[$objectCode])) {
|
if (array_key_exists($componentName, $objectComponentMap[$objectCode])) {
|
||||||
return $objectComponentMap[$objectCode][$componentName];
|
return $objectComponentMap[$objectCode][$componentName];
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,11 @@ use App;
|
||||||
use Lang;
|
use Lang;
|
||||||
use Event;
|
use Event;
|
||||||
use Config;
|
use Config;
|
||||||
use Exception;
|
|
||||||
use ValidationException;
|
|
||||||
use ApplicationException;
|
|
||||||
use Cms\Contracts\CmsObject as CmsObjectContract;
|
|
||||||
use October\Rain\Filesystem\PathResolver;
|
|
||||||
use October\Rain\Halcyon\Model as HalcyonModel;
|
use October\Rain\Halcyon\Model as HalcyonModel;
|
||||||
|
use Cms\Contracts\CmsObject as CmsObjectContract;
|
||||||
|
use ApplicationException;
|
||||||
|
use ValidationException;
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a base class for all CMS objects - content files, pages, partials and layouts.
|
* This is a base class for all CMS objects - content files, pages, partials and layouts.
|
||||||
|
|
@ -235,15 +234,7 @@ class CmsObject extends HalcyonModel implements CmsObjectContract
|
||||||
$fileName = $this->fileName;
|
$fileName = $this->fileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
$directory = $this->theme->getPath() . '/' . $this->getObjectTypeDirName() . '/';
|
return $this->theme->getPath().'/'.$this->getObjectTypeDirName().'/'.$fileName;
|
||||||
$filePath = $directory . $fileName;
|
|
||||||
|
|
||||||
// Limit paths to those under the corresponding theme directory
|
|
||||||
if (!PathResolver::within($filePath, $directory)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PathResolver::resolve($filePath);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
<?php namespace Cms\Classes;
|
<?php namespace Cms\Classes;
|
||||||
|
|
||||||
use ApplicationException;
|
|
||||||
use October\Rain\Support\Collection as CollectionBase;
|
use October\Rain\Support\Collection as CollectionBase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -38,32 +37,15 @@ class CmsObjectCollection extends CollectionBase
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns objects whose properties match the supplied value.
|
* Returns objects whose properties match the supplied value.
|
||||||
*
|
|
||||||
* Note that this deviates from Laravel 6's Illuminate\Support\Traits\EnumeratesValues::where() method signature,
|
|
||||||
* which uses ($key, $operator = null, $value = null) as parameters and that this class extends.
|
|
||||||
*
|
|
||||||
* To ensure backwards compatibility with our current Halcyon functionality, this method retains the original
|
|
||||||
* parameters and functions the same way as before, with handling for the $value and $strict parameters to ensure
|
|
||||||
* they match the previously expected formats. This means that you cannot use operators for "where" queries on
|
|
||||||
* CMS object collections.
|
|
||||||
*
|
|
||||||
* @param string $property
|
* @param string $property
|
||||||
* @param string $value
|
* @param string $value
|
||||||
* @param bool $strict
|
* @param bool $strict
|
||||||
* @return static
|
* @return static
|
||||||
*/
|
*/
|
||||||
public function where($property, $value = null, $strict = null)
|
public function where($property, $value, $strict = true)
|
||||||
{
|
{
|
||||||
if (empty($value) || !is_string($value)) {
|
|
||||||
throw new ApplicationException('You must provide a string value to compare with when executing a "where" '
|
|
||||||
. 'query for CMS object collections.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($strict) || !is_bool($strict)) {
|
|
||||||
$strict = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->filter(function ($object) use ($property, $value, $strict) {
|
return $this->filter(function ($object) use ($property, $value, $strict) {
|
||||||
|
|
||||||
if (!array_key_exists($property, $object->settings)) {
|
if (!array_key_exists($property, $object->settings)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,7 @@ class CodeParser
|
||||||
$body = preg_replace('/^\s*function/m', 'public function', $body);
|
$body = preg_replace('/^\s*function/m', 'public function', $body);
|
||||||
|
|
||||||
$namespaces = [];
|
$namespaces = [];
|
||||||
$pattern = '/(use\s+[a-z0-9_\\\\]+(\s+as\s+[a-z0-9_]+)?;(\r\n|\n)?)/mi';
|
$pattern = '/(use\s+[a-z0-9_\\\\]+(\s+as\s+[a-z0-9_]+)?;\n?)/mi';
|
||||||
preg_match_all($pattern, $body, $namespaces);
|
preg_match_all($pattern, $body, $namespaces);
|
||||||
$body = preg_replace($pattern, '', $body);
|
$body = preg_replace($pattern, '', $body);
|
||||||
|
|
||||||
|
|
@ -141,15 +141,14 @@ class CodeParser
|
||||||
$fileContents = '<?php '.PHP_EOL;
|
$fileContents = '<?php '.PHP_EOL;
|
||||||
|
|
||||||
foreach ($namespaces[0] as $namespace) {
|
foreach ($namespaces[0] as $namespace) {
|
||||||
// Only allow compound or aliased use statements
|
if (str_contains($namespace, '\\')) {
|
||||||
if (str_contains($namespace, '\\') || str_contains($namespace, ' as ')) {
|
$fileContents .= $namespace;
|
||||||
$fileContents .= trim($namespace).PHP_EOL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$fileContents .= 'class '.$className.$parentClass.PHP_EOL;
|
$fileContents .= 'class '.$className.$parentClass.PHP_EOL;
|
||||||
$fileContents .= '{'.PHP_EOL;
|
$fileContents .= '{'.PHP_EOL;
|
||||||
$fileContents .= trim($body).PHP_EOL;
|
$fileContents .= $body.PHP_EOL;
|
||||||
$fileContents .= '}'.PHP_EOL;
|
$fileContents .= '}'.PHP_EOL;
|
||||||
|
|
||||||
$this->validate($fileContents);
|
$this->validate($fileContents);
|
||||||
|
|
@ -225,8 +224,7 @@ class CodeParser
|
||||||
$cached = $this->getCachedInfo() ?: [];
|
$cached = $this->getCachedInfo() ?: [];
|
||||||
$cached[$this->filePath] = $cacheItem;
|
$cached[$this->filePath] = $cacheItem;
|
||||||
|
|
||||||
$expiresAt = now()->addMinutes(1440);
|
Cache::put($this->dataCacheKey, base64_encode(serialize($cached)), 1440);
|
||||||
Cache::put($this->dataCacheKey, base64_encode(serialize($cached)), $expiresAt);
|
|
||||||
|
|
||||||
self::$cache[$this->filePath] = $result;
|
self::$cache[$this->filePath] = $result;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
<?php namespace Cms\Classes;
|
<?php namespace Cms\Classes;
|
||||||
|
|
||||||
use Lang;
|
use Lang;
|
||||||
use BackendAuth;
|
|
||||||
use ApplicationException;
|
use ApplicationException;
|
||||||
use October\Rain\Filesystem\Definitions as FileDefinitions;
|
use October\Rain\Filesystem\Definitions as FileDefinitions;
|
||||||
|
|
||||||
|
|
@ -198,12 +197,6 @@ class Page extends CmsCompoundObject
|
||||||
}
|
}
|
||||||
|
|
||||||
$page = self::loadCached($theme, $item->reference);
|
$page = self::loadCached($theme, $item->reference);
|
||||||
|
|
||||||
// Remove hidden CMS pages from menus when backend user is logged out
|
|
||||||
if ($page && $page->is_hidden && !BackendAuth::getUser()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$controller = Controller::getController() ?: new Controller;
|
$controller = Controller::getController() ?: new Controller;
|
||||||
$pageUrl = $controller->pageUrl($item->reference, [], false);
|
$pageUrl = $controller->pageUrl($item->reference, [], false);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,11 @@ class Partial extends CmsCompoundObject
|
||||||
*/
|
*/
|
||||||
protected $dirName = 'partials';
|
protected $dirName = 'partials';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array Allowable file extensions. TEMPORARY! DO NOT INCLUDE in Build 1.1.x, workaround for unsupported code
|
||||||
|
*/
|
||||||
|
protected $allowedExtensions = ['htm', 'html', 'css', 'js', 'svg'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns name of a PHP class to us a parent for the PHP class created for the object's PHP section.
|
* Returns name of a PHP class to us a parent for the PHP class created for the object's PHP section.
|
||||||
* @return string Returns the class name.
|
* @return string Returns the class name.
|
||||||
|
|
|
||||||
|
|
@ -127,11 +127,10 @@ class Router
|
||||||
: $fileName;
|
: $fileName;
|
||||||
|
|
||||||
$key = $this->getUrlListCacheKey();
|
$key = $this->getUrlListCacheKey();
|
||||||
$expiresAt = now()->addMinutes(Config::get('cms.urlCacheTtl', 1));
|
|
||||||
Cache::put(
|
Cache::put(
|
||||||
$key,
|
$key,
|
||||||
base64_encode(serialize($urlList)),
|
base64_encode(serialize($urlList)),
|
||||||
$expiresAt
|
Config::get('cms.urlCacheTtl', 1)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -252,8 +251,7 @@ class Router
|
||||||
|
|
||||||
$this->urlMap = $map;
|
$this->urlMap = $map;
|
||||||
if ($cacheable) {
|
if ($cacheable) {
|
||||||
$expiresAt = now()->addMinutes(Config::get('cms.urlCacheTtl', 1));
|
Cache::put($key, base64_encode(serialize($map)), Config::get('cms.urlCacheTtl', 1));
|
||||||
Cache::put($key, base64_encode(serialize($map)), $expiresAt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -158,8 +158,7 @@ class Theme
|
||||||
if ($checkDatabase && App::hasDatabase()) {
|
if ($checkDatabase && App::hasDatabase()) {
|
||||||
try {
|
try {
|
||||||
try {
|
try {
|
||||||
$expiresAt = now()->addMinutes(1440);
|
$dbResult = Cache::remember(self::ACTIVE_KEY, 1440, function () {
|
||||||
$dbResult = Cache::remember(self::ACTIVE_KEY, $expiresAt, function () {
|
|
||||||
return Parameter::applyKey(self::ACTIVE_KEY)->value('value');
|
return Parameter::applyKey(self::ACTIVE_KEY)->value('value');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,11 @@
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "Alexey Bobkov",
|
"name": "Alexey Bobkov",
|
||||||
"email": "aleksey.bobkov@gmail.com",
|
"email": "aleksey.bobkov@gmail.com"
|
||||||
"role": "Co-founder"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Samuel Georges",
|
"name": "Samuel Georges",
|
||||||
"email": "daftspunky@gmail.com",
|
"email": "daftspunky@gmail.com"
|
||||||
"role": "Co-founder"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Luke Towers",
|
"name": "Luke Towers",
|
||||||
|
|
@ -24,10 +22,9 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.2",
|
"php": ">=7.0",
|
||||||
"composer/installers": "~1.0",
|
"composer/installers": "~1.0",
|
||||||
"october/rain": "~1.1.0",
|
"october/rain": "~1.0.469"
|
||||||
"laravel/framework": "~6.0"
|
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
|
|
||||||
|
|
@ -103,11 +103,8 @@ class ThemeOptions extends Controller
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default to the active theme if user doesn't have access to manage all themes
|
* Default to the active theme if user doesn't have access to manage all themes
|
||||||
*
|
|
||||||
* @param string $dirName
|
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
protected function getDirName(string $dirName = null)
|
protected function getDirName($dirName = null)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Only the active theme can be managed without this permission
|
* Only the active theme can be managed without this permission
|
||||||
|
|
|
||||||
|
|
@ -2,16 +2,12 @@
|
||||||
|
|
||||||
use October\Rain\Support\Facade;
|
use October\Rain\Support\Facade;
|
||||||
|
|
||||||
/**
|
|
||||||
* @method static string url(string $path = null)
|
|
||||||
*
|
|
||||||
* @see \Cms\Helpers\Cms
|
|
||||||
*/
|
|
||||||
class Cms extends Facade
|
class Cms extends Facade
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Get the registered name of the component.
|
* Get the registered name of the component.
|
||||||
*
|
*
|
||||||
|
* @see \Cms\Helpers\Cms
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected static function getFacadeAccessor()
|
protected static function getFacadeAccessor()
|
||||||
|
|
|
||||||
|
|
@ -10,24 +10,12 @@ return [
|
||||||
'invalid_file_extension'=>'Ungültige Dateiendung: :invalid. Erlaubt sind: :allowed.',
|
'invalid_file_extension'=>'Ungültige Dateiendung: :invalid. Erlaubt sind: :allowed.',
|
||||||
'error_deleting' => 'Fehler beim Löschen der Template-Datei ":name".',
|
'error_deleting' => 'Fehler beim Löschen der Template-Datei ":name".',
|
||||||
'delete_success' => 'Templates wurden erfolgreich gelöscht: :count.',
|
'delete_success' => 'Templates wurden erfolgreich gelöscht: :count.',
|
||||||
'file_name_required' => 'Ein Dateiname ist erforderlich.',
|
'file_name_required' => 'Ein Dateiname ist erforderlich.'
|
||||||
'safe_mode_enabled' => 'Der abgesicherte Modus ist derzeit aktiviert. Die Bearbeitung des PHP-Codes von CMS-Templates ist deaktiviert. Um den abgesicherten Modus zu deaktivieren, setzen Sie den Konfigurationswert `cms.enableSafeMode` auf `false`.',
|
|
||||||
],
|
|
||||||
'dashboard' => [
|
|
||||||
'active_theme' => [
|
|
||||||
'widget_title_default' => 'Website',
|
|
||||||
'online' => 'Online',
|
|
||||||
'maintenance' => 'In der Wartung',
|
|
||||||
'manage_themes' => 'Themes Verwalten',
|
|
||||||
'customize_theme' => 'Theme anpassen',
|
|
||||||
],
|
|
||||||
],
|
],
|
||||||
'theme' => [
|
'theme' => [
|
||||||
'not_found_name' => "Das Theme ':name' konnte nicht gefunden werden.",
|
'not_found_name' => "Das Theme ':name' konnte nicht gefunden werden.",
|
||||||
'by_author' => 'Von :name',
|
|
||||||
'active' => [
|
'active' => [
|
||||||
'not_set' => "Aktives Theme nicht definiert",
|
'not_set' => "Aktives Theme nicht definiert",
|
||||||
'not_found' => 'Aktives Theme wurde nicht gefunden.',
|
|
||||||
],
|
],
|
||||||
'edit' => [
|
'edit' => [
|
||||||
'not_set' => "Edit Theme nicht definiert",
|
'not_set' => "Edit Theme nicht definiert",
|
||||||
|
|
@ -47,8 +35,6 @@ return [
|
||||||
'homepage_placeholder' => 'Webseiten URL',
|
'homepage_placeholder' => 'Webseiten URL',
|
||||||
'code_label' => 'Code',
|
'code_label' => 'Code',
|
||||||
'code_placeholder' => 'Ein einzigartiger Code genutzt bei der Weiterverbreitung dieses Themes',
|
'code_placeholder' => 'Ein einzigartiger Code genutzt bei der Weiterverbreitung dieses Themes',
|
||||||
'preview_image_label' => 'Bildvorschau',
|
|
||||||
'preview_image_placeholder' => 'Der Pfad des Theme-Vorschaubildes.',
|
|
||||||
'dir_name_label' => 'Verzeichnisname',
|
'dir_name_label' => 'Verzeichnisname',
|
||||||
'dir_name_create_label' => 'Name des Zielverzeichnisses',
|
'dir_name_create_label' => 'Name des Zielverzeichnisses',
|
||||||
'theme_label' => 'Theme',
|
'theme_label' => 'Theme',
|
||||||
|
|
@ -98,8 +84,7 @@ return [
|
||||||
'settings_menu' => 'Wartungsmodus',
|
'settings_menu' => 'Wartungsmodus',
|
||||||
'settings_menu_description' => 'Konfigurieren Sie den Wartungsmodus.',
|
'settings_menu_description' => 'Konfigurieren Sie den Wartungsmodus.',
|
||||||
'is_enabled' => 'Wartungsmodus aktivieren',
|
'is_enabled' => 'Wartungsmodus aktivieren',
|
||||||
'is_enabled_comment' => 'Sobald aktiviert, werden Besucher die unten ausgewählte Seite sehen.',
|
'is_enabled_comment' => 'Sobald aktiviert, werden Besucher die unten ausgewählte Seite sehen.'
|
||||||
'hint' => 'Im Wartungsmodus wird die Wartungsseite für Besucher angezeigt, die nicht im Back-End-Bereich angemeldet sind.',
|
|
||||||
],
|
],
|
||||||
'page' => [
|
'page' => [
|
||||||
'not_found_name' => "Die Seite ':name' konnte nicht gefunden werden",
|
'not_found_name' => "Die Seite ':name' konnte nicht gefunden werden",
|
||||||
|
|
@ -112,22 +97,16 @@ return [
|
||||||
'help' => "Entschuldigung, ein Fehler trat auf, sodass die gewünschte Seite nicht angezeigt werden kann.",
|
'help' => "Entschuldigung, ein Fehler trat auf, sodass die gewünschte Seite nicht angezeigt werden kann.",
|
||||||
],
|
],
|
||||||
'menu_label' => 'Seiten',
|
'menu_label' => 'Seiten',
|
||||||
'unsaved_label' => 'Ungespeicherte Seite(n)',
|
|
||||||
'no_list_records' => 'Keine Seiten gefunden',
|
'no_list_records' => 'Keine Seiten gefunden',
|
||||||
'new' => 'Neue Seite',
|
'new' => 'Neue Seite',
|
||||||
'invalid_url' => 'Ungültiges URL-Format. Die URL muss mit einem Slash beginnen und darf nur Ziffern, lateinische Zeichen und die folgenden Symbole beinhalten: ._-[]:?|/+*^$',
|
'invalid_url' => 'Ungültiges URL-Format. Die URL muss mit einem Slash beginnen und darf nur Ziffern, lateinische Zeichen und die folgenden Symbole beinhalten: ._-[]:?|/+*^$',
|
||||||
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Seiten wirklich löschen?',
|
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Seiten wirklich löschen?',
|
||||||
'delete_confirm_single' => 'Wollen Sie diese Seite wirklich löschen?',
|
'delete_confirm_single' => 'Wollen Sie diese Seite wirklich löschen?',
|
||||||
'no_layout' => '-- Kein Layout --',
|
'no_layout' => '-- Kein Layout --'
|
||||||
'cms_page' => 'CMS Seite',
|
|
||||||
'title' => 'Seitentitel',
|
|
||||||
'url' => 'Seiten-URL',
|
|
||||||
'file_name' => 'Seiten-Dateiname',
|
|
||||||
],
|
],
|
||||||
'layout' => [
|
'layout' => [
|
||||||
'not_found_name' => "Das Layout ':name' wurde nicht gefunden",
|
'not_found_name' => "Das Layout ':name' wurde nicht gefunden",
|
||||||
'menu_label' => 'Layouts',
|
'menu_label' => 'Layouts',
|
||||||
'unsaved_label' => 'Ungespeicherte(s) Layout(s)',
|
|
||||||
'no_list_records' => 'Keine Layouts gefunden',
|
'no_list_records' => 'Keine Layouts gefunden',
|
||||||
'new' => 'Neues Layout',
|
'new' => 'Neues Layout',
|
||||||
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Layouts wirklich löschen?',
|
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Layouts wirklich löschen?',
|
||||||
|
|
@ -137,7 +116,6 @@ return [
|
||||||
'not_found_name' => "Das Partial ':name' wurde nicht gefunden.",
|
'not_found_name' => "Das Partial ':name' wurde nicht gefunden.",
|
||||||
'invalid_name' => "Ungültiger Partial-Name: :name.",
|
'invalid_name' => "Ungültiger Partial-Name: :name.",
|
||||||
'menu_label' => 'Partials',
|
'menu_label' => 'Partials',
|
||||||
'unsaved_label' => 'Ungespeicherte(s) Partial(s)',
|
|
||||||
'no_list_records' => 'Keine Partials gefunden',
|
'no_list_records' => 'Keine Partials gefunden',
|
||||||
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Partials wirklich löschen?',
|
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Partials wirklich löschen?',
|
||||||
'delete_confirm_single' => 'Wollen Sie das ausgewählte Partial wirklich löschen?',
|
'delete_confirm_single' => 'Wollen Sie das ausgewählte Partial wirklich löschen?',
|
||||||
|
|
@ -146,7 +124,6 @@ return [
|
||||||
'content' => [
|
'content' => [
|
||||||
'not_found_name' => "Die Inhaltsdatei ':name' wurde nicht gefunden.",
|
'not_found_name' => "Die Inhaltsdatei ':name' wurde nicht gefunden.",
|
||||||
'menu_label' => 'Inhalt',
|
'menu_label' => 'Inhalt',
|
||||||
'unsaved_label' => 'Ungespeicherter Inhalt',
|
|
||||||
'no_list_records' => 'Keine Inhaltsdateien gefunden',
|
'no_list_records' => 'Keine Inhaltsdateien gefunden',
|
||||||
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Inhalte und Verzeichnisse wirklich löschen?',
|
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Inhalte und Verzeichnisse wirklich löschen?',
|
||||||
'delete_confirm_single' => 'Wollen Sie diese Inhaltsdatei wirklich löschen?',
|
'delete_confirm_single' => 'Wollen Sie diese Inhaltsdatei wirklich löschen?',
|
||||||
|
|
@ -181,34 +158,18 @@ return [
|
||||||
'hidden' => 'Versteckt',
|
'hidden' => 'Versteckt',
|
||||||
'hidden_comment' => 'Versteckte Seiten können nur von eingeloggten Backend-Benutzern genutzt werden.',
|
'hidden_comment' => 'Versteckte Seiten können nur von eingeloggten Backend-Benutzern genutzt werden.',
|
||||||
'enter_fullscreen' => 'In den Vollbildmodus wechseln',
|
'enter_fullscreen' => 'In den Vollbildmodus wechseln',
|
||||||
'exit_fullscreen' => 'Vollbildmodus beenden',
|
'exit_fullscreen' => 'Vollbildmodus beenden'
|
||||||
'open_searchbox' => 'Suchfeld öffnen',
|
|
||||||
'close_searchbox' => 'Suchfeld schließen',
|
|
||||||
'open_replacebox' => 'Ersetzen-Feld öffnen',
|
|
||||||
'close_replacebox' => 'Ersetzen-Feld schließen',
|
|
||||||
'commit' => 'Commit',
|
|
||||||
'reset' => 'Zurücksetzen',
|
|
||||||
'commit_confirm' => 'Sind Sie sicher, dass Sie Ihre Änderungen an dieser Datei auf das Dateisystem übertragen wollen? Dies wird die bestehende Datei auf dem Dateisystem überschreiben',
|
|
||||||
'reset_confirm' => 'Sind Sie sicher, dass Sie diese Datei auf die Kopie zurücksetzen wollen, die sich auf dem Dateisystem befindet? Dadurch wird sie vollständig durch die Datei ersetzt, die sich auf dem Dateisystem befindet.',
|
|
||||||
'committing' => 'Committing',
|
|
||||||
'resetting' => 'Zurücksetzen',
|
|
||||||
'commit_success' => 'Der :type wurde auf das Dateisystem übertragen',
|
|
||||||
'reset_success' => 'Der :type wurde auf die Dateisystemversion zurückgesetzt',
|
|
||||||
],
|
],
|
||||||
'asset' => [
|
'asset' => [
|
||||||
'menu_label' => "Assets",
|
'menu_label' => "Assets",
|
||||||
'unsaved_label' => 'Ungespeicherte(s) Asset(s)',
|
|
||||||
'drop_down_add_title' => 'Hinzufügen...',
|
'drop_down_add_title' => 'Hinzufügen...',
|
||||||
'drop_down_operation_title' => 'Aktion...',
|
'drop_down_operation_title' => 'Aktion...',
|
||||||
'upload_files' => 'Datei(en) hochladen',
|
'upload_files' => 'Datei(en) hochladen',
|
||||||
'create_file' => 'Datei erstellen',
|
'create_file' => 'Datei erstellen',
|
||||||
'create_directory' => 'Verzeichnis erstellen',
|
'create_directory' => 'Verzeichnis erstellen',
|
||||||
'directory_popup_title' => 'Neues Verzeichnis',
|
|
||||||
'directory_name' => 'Verzeichnisname',
|
|
||||||
'rename' => 'Umbenennen',
|
'rename' => 'Umbenennen',
|
||||||
'delete' => 'Löschen',
|
'delete' => 'Löschen',
|
||||||
'move' => 'Verschieben',
|
'move' => 'Verschieben',
|
||||||
'select' => 'Auswählen',
|
|
||||||
'new' => 'Neue Datei',
|
'new' => 'Neue Datei',
|
||||||
'rename_popup_title' => 'Umbenennen',
|
'rename_popup_title' => 'Umbenennen',
|
||||||
'rename_new_name' => 'Neuer Name',
|
'rename_new_name' => 'Neuer Name',
|
||||||
|
|
@ -235,8 +196,6 @@ return [
|
||||||
'error_moving_file' => 'Fehler beim Verschieben der Datei :file',
|
'error_moving_file' => 'Fehler beim Verschieben der Datei :file',
|
||||||
'error_moving_directory' => 'Fehler beim Verschieben des Verzeichnisses :dir',
|
'error_moving_directory' => 'Fehler beim Verschieben des Verzeichnisses :dir',
|
||||||
'error_deleting_directory' => 'Fehler beim Löschen des Originalverzeichnisses :dir',
|
'error_deleting_directory' => 'Fehler beim Löschen des Originalverzeichnisses :dir',
|
||||||
'no_list_records' => 'Keine Dateien gefunden',
|
|
||||||
'delete_confirm' => 'Ausgewählte Dateien oder Verzeichnisse löschen?',
|
|
||||||
'path' => 'Pfad'
|
'path' => 'Pfad'
|
||||||
],
|
],
|
||||||
'component' => [
|
'component' => [
|
||||||
|
|
@ -249,17 +208,12 @@ return [
|
||||||
'invalid_request' => "Aufgrund ungültiger Komponentendaten kann das Template nicht gespeichert werden.",
|
'invalid_request' => "Aufgrund ungültiger Komponentendaten kann das Template nicht gespeichert werden.",
|
||||||
'no_records' => 'Keine Komponenten gefunden',
|
'no_records' => 'Keine Komponenten gefunden',
|
||||||
'not_found' => "Die Komponente ':name' wurde nicht gefunden.",
|
'not_found' => "Die Komponente ':name' wurde nicht gefunden.",
|
||||||
'no_default_partial' => "Diese Komponente hat keinen 'default' Partial",
|
|
||||||
'method_not_found' => "Die Komponente ':name' enthält keine Methode mit Namen ':method'.",
|
'method_not_found' => "Die Komponente ':name' enthält keine Methode mit Namen ':method'.",
|
||||||
'soft_component_description' => 'Diese Komponente fehlt, aber Sie ist optional.',
|
|
||||||
],
|
],
|
||||||
'template' => [
|
'template' => [
|
||||||
'invalid_type' => "Unbekannter Template-Typ.",
|
'invalid_type' => "Unbekannter Template-Typ.",
|
||||||
'not_found' => "Das angeforderte Template wurde nicht gefunden.",
|
'not_found' => "Das angeforderte Template wurde nicht gefunden.",
|
||||||
'saved'=> "Das Template wurde erfolgreich gespeichert.",
|
'saved'=> "Das Template wurde erfolgreich gespeichert."
|
||||||
'no_list_records' => 'Keine Einträge gefunden',
|
|
||||||
'delete_confirm' => 'Ausgewählte Templates löschen?',
|
|
||||||
'order_by' => 'Sortieren nach',
|
|
||||||
],
|
],
|
||||||
'permissions' => [
|
'permissions' => [
|
||||||
'name' => 'Cms',
|
'name' => 'Cms',
|
||||||
|
|
@ -269,35 +223,5 @@ return [
|
||||||
'manage_layouts' => 'Layouts verwalten',
|
'manage_layouts' => 'Layouts verwalten',
|
||||||
'manage_partials' => 'Partials verwalten',
|
'manage_partials' => 'Partials verwalten',
|
||||||
'manage_themes' => 'Themes verwalten',
|
'manage_themes' => 'Themes verwalten',
|
||||||
'manage_theme_options' => 'Konfigurieren Sie Anpassungsoptionen für das aktive Theme',
|
|
||||||
],
|
|
||||||
'theme_log' => [
|
|
||||||
'hint' => 'Dieses Protokoll zeigt alle Änderungen an, die von Administratoren im Back-End-Bereich am Theme vorgenommen wurden.',
|
|
||||||
'menu_label' => 'Theme Protokoll',
|
|
||||||
'menu_description' => 'Zeigen Sie die am aktiven Theme vorgenommenen Änderungen an.',
|
|
||||||
'empty_link' => 'Leeres Theme Protokoll',
|
|
||||||
'empty_loading' => 'Leeren des Theme Protokolls...',
|
|
||||||
'empty_success' => 'Theme Protokoll',
|
|
||||||
'return_link' => 'Zurück zum Theme Protokoll',
|
|
||||||
'id' => 'ID',
|
|
||||||
'id_label' => 'Protokoll ID',
|
|
||||||
'created_at' => 'Datum & Zeit',
|
|
||||||
'user' => 'Benutzer',
|
|
||||||
'type' => 'Typ',
|
|
||||||
'type_create' => 'Erstellen',
|
|
||||||
'type_update' => 'Aktualisieren',
|
|
||||||
'type_delete' => 'Löschen',
|
|
||||||
'theme_name' => 'Theme',
|
|
||||||
'theme_code' => 'Theme Code',
|
|
||||||
'old_template' => 'Template (Alt)',
|
|
||||||
'new_template' => 'Template (Neu)',
|
|
||||||
'template' => 'Template',
|
|
||||||
'diff' => 'Änderungen',
|
|
||||||
'old_value' => 'Alter Wert',
|
|
||||||
'new_value' => 'Neuer Wert',
|
|
||||||
'preview_title' => 'Templateänderungen',
|
|
||||||
'template_updated' => 'Template wurde aktualisiert',
|
|
||||||
'template_created' => 'Template wurde erstellt',
|
|
||||||
'template_deleted' => 'Template wurde gelöscht',
|
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ return [
|
||||||
'error_deleting' => 'Fout bij het verwijderen van template: ":name". Controleer de schrijfrechten.',
|
'error_deleting' => 'Fout bij het verwijderen van template: ":name". Controleer de schrijfrechten.',
|
||||||
'delete_success' => 'Templates zijn succesvol verwijderd: :count.',
|
'delete_success' => 'Templates zijn succesvol verwijderd: :count.',
|
||||||
'file_name_required' => 'Het invullen van een bestandsnaam is verplicht.',
|
'file_name_required' => 'Het invullen van een bestandsnaam is verplicht.',
|
||||||
'safe_mode_enabled' => 'Veilige modus is op dit moment ingeschakeld.',
|
'safe_mode_enabled' => 'Beveiligde modus is op dit moment ingeschakeld.',
|
||||||
],
|
],
|
||||||
'dashboard' => [
|
'dashboard' => [
|
||||||
'active_theme' => [
|
'active_theme' => [
|
||||||
|
|
@ -245,12 +245,11 @@ return [
|
||||||
'no_description' => 'Geen beschrijving opgegeven',
|
'no_description' => 'Geen beschrijving opgegeven',
|
||||||
'alias' => 'Alias',
|
'alias' => 'Alias',
|
||||||
'alias_description' => 'Een unieke naam voor dit component voor gebruik in de code van een pagina of layout.',
|
'alias_description' => 'Een unieke naam voor dit component voor gebruik in de code van een pagina of layout.',
|
||||||
'validation_message' => 'Een alias voor de component is verplicht en mag alleen bestaan uit letters, cijfers en underscores. De alias moet beginnen met een letter.',
|
'validation_message' => 'Een alias voor het component is verplicht en mag alleen bestaan uit letters, cijfers en underscores. De alias moet beginnen met een letter.',
|
||||||
'invalid_request' => 'De template kan niet worden opgeslagen vanwege ongeldige componentgegevens.',
|
'invalid_request' => 'De template kan niet worden opgeslagen vanwege ongeldige componentgegevens.',
|
||||||
'no_records' => 'Geen componenten gevonden',
|
'no_records' => 'Geen componenten gevonden',
|
||||||
'not_found' => 'De component \':name\' is niet gevonden.',
|
'not_found' => 'Het component \':name\' is niet gevonden.',
|
||||||
'no_default_partial' => "De component bevat geen 'standaard' sjabloon",
|
'method_not_found' => 'Het component \':name\' bevat geen \':method\' methode.',
|
||||||
'method_not_found' => 'De component \':name\' bevat geen \':method\' methode.',
|
|
||||||
'soft_component' => 'Soft Component',
|
'soft_component' => 'Soft Component',
|
||||||
'soft_component_description' => 'Dit component ontbreekt, maar is optioneel.',
|
'soft_component_description' => 'Dit component ontbreekt, maar is optioneel.',
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ return [
|
||||||
'error_deleting' => "Невозможно удалить файл шаблона ':name'. Пожалуйста, проверьте права на запись.",
|
'error_deleting' => "Невозможно удалить файл шаблона ':name'. Пожалуйста, проверьте права на запись.",
|
||||||
'delete_success' => 'Шаблоны были успешно удалены: :count.',
|
'delete_success' => 'Шаблоны были успешно удалены: :count.',
|
||||||
'file_name_required' => 'Пожалуйста, укажите имя файла шаблона.',
|
'file_name_required' => 'Пожалуйста, укажите имя файла шаблона.',
|
||||||
'safe_mode_enabled' => 'В настоящий момент включен безопасный режим.',
|
'safe_mode_enabled' => 'В настоящий момент включен безопасный режим.'
|
||||||
],
|
],
|
||||||
'dashboard' => [
|
'dashboard' => [
|
||||||
'active_theme' => [
|
'active_theme' => [
|
||||||
|
|
@ -19,7 +19,7 @@ return [
|
||||||
'online' => 'Онлайн',
|
'online' => 'Онлайн',
|
||||||
'maintenance' => 'в разработке',
|
'maintenance' => 'в разработке',
|
||||||
'manage_themes' => 'Управление темами',
|
'manage_themes' => 'Управление темами',
|
||||||
'customize_theme' => 'Настройка темы',
|
'customize_theme' => 'Настройка Темы'
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'theme' => [
|
'theme' => [
|
||||||
|
|
@ -27,12 +27,12 @@ return [
|
||||||
'by_author' => 'Создано :name',
|
'by_author' => 'Создано :name',
|
||||||
'active' => [
|
'active' => [
|
||||||
'not_set' => 'Активная тема не установлена.',
|
'not_set' => 'Активная тема не установлена.',
|
||||||
'not_found' => 'Активная тема не найдена.',
|
'not_found' => 'Активная тема не найдена.'
|
||||||
],
|
],
|
||||||
'edit' => [
|
'edit' => [
|
||||||
'not_set' => 'Тема для редактирования не установлена.',
|
'not_set' => 'Тема для редактирования не установлена.',
|
||||||
'not_found' => 'Тема для редактирования не найдена.',
|
'not_found' => 'Тема для редактирования не найдена.',
|
||||||
'not_match' => 'Объект, который вы пытаетесь открыть, не принадлежит редактируемой теме. Пожалуйста, обновите страницу.',
|
'not_match' => 'Объект, который вы пытаетесь открыть, не принадлежит редактируемой теме. Пожалуйста, обновите страницу.'
|
||||||
],
|
],
|
||||||
'settings_menu' => 'Фронтенд темы',
|
'settings_menu' => 'Фронтенд темы',
|
||||||
'settings_menu_description' => 'Управление темой интерфейса',
|
'settings_menu_description' => 'Управление темой интерфейса',
|
||||||
|
|
@ -55,7 +55,7 @@ return [
|
||||||
'theme_title' => 'Темы',
|
'theme_title' => 'Темы',
|
||||||
'activate_button' => 'Активировать',
|
'activate_button' => 'Активировать',
|
||||||
'active_button' => 'Активировано',
|
'active_button' => 'Активировано',
|
||||||
'customize_theme' => 'Настройка темы',
|
'customize_theme' => 'Настройка Темы',
|
||||||
'customize_button' => 'Настроить',
|
'customize_button' => 'Настроить',
|
||||||
'duplicate_button' => 'Дублировать',
|
'duplicate_button' => 'Дублировать',
|
||||||
'duplicate_title' => 'Дублировать тему',
|
'duplicate_title' => 'Дублировать тему',
|
||||||
|
|
@ -83,7 +83,7 @@ return [
|
||||||
'delete_theme_success' => 'Удаление темы успешно завершено!',
|
'delete_theme_success' => 'Удаление темы успешно завершено!',
|
||||||
'create_title' => 'Создать тему',
|
'create_title' => 'Создать тему',
|
||||||
'create_button' => 'Создать',
|
'create_button' => 'Создать',
|
||||||
'create_new_blank_theme' => 'Создать новую пустую тему',
|
'create_new_blank_theme' => 'Создать новый бланк темы',
|
||||||
'create_theme_success' => 'Создание темы успешно завершено!',
|
'create_theme_success' => 'Создание темы успешно завершено!',
|
||||||
'create_theme_required_name' => 'Пожалуйста, укажите имя для темы.',
|
'create_theme_required_name' => 'Пожалуйста, укажите имя для темы.',
|
||||||
'new_directory_name_label' => 'Директория темы',
|
'new_directory_name_label' => 'Директория темы',
|
||||||
|
|
@ -92,24 +92,24 @@ return [
|
||||||
'dir_name_taken' => 'Указанный каталог уже существует.',
|
'dir_name_taken' => 'Указанный каталог уже существует.',
|
||||||
'find_more_themes' => 'Найти еще темы',
|
'find_more_themes' => 'Найти еще темы',
|
||||||
'saving' => 'Сохранение темы...',
|
'saving' => 'Сохранение темы...',
|
||||||
'return' => 'Вернуться к списку тем',
|
'return' => 'Вернуться к списку тем'
|
||||||
],
|
],
|
||||||
'maintenance' => [
|
'maintenance' => [
|
||||||
'settings_menu' => 'Режим обслуживания',
|
'settings_menu' => 'Режим обслуживания',
|
||||||
'settings_menu_description' => 'Управление режимом работы сайта.',
|
'settings_menu_description' => 'Управление режимом работы сайта.',
|
||||||
'is_enabled' => 'Включить режим обслуживания',
|
'is_enabled' => 'Включить режим обслуживания',
|
||||||
'is_enabled_comment' => 'При активации этого режима посетители сайта увидят страницу выбранную ниже.',
|
'is_enabled_comment' => 'При активации этого режима посетители сайта увидят страницу выбранную ниже.',
|
||||||
'hint' => 'Режим обслуживания покажет страницу обслуживания для посетителей, которые не вошли в бэкенд.',
|
'hint' => 'Режим обслуживания покажет страницу обслуживания для посетителей, которые не авторизовались в CMS.'
|
||||||
],
|
],
|
||||||
'page' => [
|
'page' => [
|
||||||
'not_found_name' => "Страница ':name' не найдена",
|
'not_found_name' => "Страница ':name' не найдена",
|
||||||
'not_found' => [
|
'not_found' => [
|
||||||
'label' => 'Страница не найдена',
|
'label' => 'Страница не найдена',
|
||||||
'help' => 'Запрошенная страница не найдена.',
|
'help' => 'Запрошенная страница не найдена.'
|
||||||
],
|
],
|
||||||
'custom_error' => [
|
'custom_error' => [
|
||||||
'label' => 'Ошибка на странице',
|
'label' => 'Ошибка на странице',
|
||||||
'help' => 'К сожалению, страница не может быть отображена из-за ошибки.',
|
'help' => 'К сожалению, страница не может быть отображена из-за ошибки.'
|
||||||
],
|
],
|
||||||
'menu_label' => 'Страницы',
|
'menu_label' => 'Страницы',
|
||||||
'unsaved_label' => 'Несохранённая(е) страница(ы)',
|
'unsaved_label' => 'Несохранённая(е) страница(ы)',
|
||||||
|
|
@ -122,46 +122,46 @@ return [
|
||||||
'cms_page' => 'CMS страница',
|
'cms_page' => 'CMS страница',
|
||||||
'title' => 'Заголовок страницы',
|
'title' => 'Заголовок страницы',
|
||||||
'url' => 'Страница URL',
|
'url' => 'Страница URL',
|
||||||
'file_name' => 'Имя файла страницы',
|
'file_name' => 'Имя файла страницы'
|
||||||
],
|
],
|
||||||
'layout' => [
|
'layout' => [
|
||||||
'not_found_name' => "Не удалось найти макет с именем :name.",
|
'not_found_name' => "Не удалось найти шаблон (layout) с именем :name.",
|
||||||
'menu_label' => 'Макеты',
|
'menu_label' => 'Шаблоны',
|
||||||
'unsaved_label' => 'Несохранённый(е) макет(ы)',
|
'unsaved_label' => 'Несоsхранённый(е) макет(ы)',
|
||||||
'no_list_records' => 'Макет не найдено',
|
'no_list_records' => 'Шаблоны не найдены',
|
||||||
'new' => 'Новый макет',
|
'new' => 'Новый шаблон',
|
||||||
'delete_confirm_multiple' => 'Удалить выделенные макеты?',
|
'delete_confirm_multiple' => 'Вы действительно хотите удалить выделенные шаблоны?',
|
||||||
'delete_confirm_single' => 'Удалить этот макет?',
|
'delete_confirm_single' => 'Вы действительно хотите удалить этот шаблон?'
|
||||||
],
|
],
|
||||||
'partial' => [
|
'partial' => [
|
||||||
'not_found_name' => "Не удалось найти фрагмент с именем :name.",
|
'not_found_name' => "Не удалось найти шаблон (partial) с именем :name.",
|
||||||
'invalid_name' => 'Ошибка в имени фрагмента :name.',
|
'invalid_name' => 'Ошибка в имени шаблона (partial) :name.',
|
||||||
'menu_label' => 'Фрагменты',
|
'menu_label' => 'Фрагменты',
|
||||||
'unsaved_label' => 'Несохранённый(е) фрагмент(ы)',
|
'unsaved_label' => 'Несохранённый(е) фрагмент(ы)',
|
||||||
'no_list_records' => 'Фрагменты не найдены',
|
'no_list_records' => 'Фрагменты не найдены',
|
||||||
'delete_confirm_multiple' => 'Удалить выделенные фрагменты?',
|
'delete_confirm_multiple' => 'Вы действительно хотите удалить выделенные фрагменты?',
|
||||||
'delete_confirm_single' => 'Удалить этот фрагмент?',
|
'delete_confirm_single' => 'Вы действительно хотите удалить этот фрагмент?',
|
||||||
'new' => 'Новый фрагмент',
|
'new' => 'Новый фрагмент'
|
||||||
],
|
],
|
||||||
'content' => [
|
'content' => [
|
||||||
'not_found_name' => "Не удалось найти контент-файл: ':name'.",
|
'not_found_name' => "Не удалось найти файл содержимого (content file): ':name'.",
|
||||||
'menu_label' => 'Контент',
|
'menu_label' => 'Содержимое',
|
||||||
'unsaved_label' => 'Несохранённый контент',
|
'unsaved_label' => 'Несохранённое содержимое',
|
||||||
'no_list_records' => 'Контент-файлы не найдены',
|
'no_list_records' => 'Файлы с содержимым не найдены',
|
||||||
'delete_confirm_multiple' => 'Вы действительно хотите удалить выделенные файлы?',
|
'delete_confirm_multiple' => 'Вы действительно хотите удалить выделенные файлы?',
|
||||||
'delete_confirm_single' => 'Вы действительно хотите удалить этот файл?',
|
'delete_confirm_single' => 'Вы действительно хотите удалить этот файл?',
|
||||||
'new' => 'Новый контент-файл',
|
'new' => 'Новый файл содержимого'
|
||||||
],
|
],
|
||||||
'ajax_handler' => [
|
'ajax_handler' => [
|
||||||
'invalid_name' => 'Ошибка в имени обработчика AJAX: :name.',
|
'invalid_name' => 'Ошибка в имени обработчика AJAX: :name.',
|
||||||
'not_found' => "Обработчик AJAX не найден: ':name'.",
|
'not_found' => "Обработчик AJAX не найден: ':name'."
|
||||||
],
|
],
|
||||||
'cms' => [
|
'cms' => [
|
||||||
'menu_label' => 'CMS',
|
'menu_label' => 'CMS'
|
||||||
],
|
],
|
||||||
'sidebar' => [
|
'sidebar' => [
|
||||||
'add' => 'Добавить',
|
'add' => 'Добавить',
|
||||||
'search' => 'Поиск...',
|
'search' => 'Поиск...'
|
||||||
],
|
],
|
||||||
'editor' => [
|
'editor' => [
|
||||||
'settings' => 'Настройки',
|
'settings' => 'Настройки',
|
||||||
|
|
@ -182,21 +182,13 @@ return [
|
||||||
'hidden_comment' => 'Скрытые страницы доступны только для вошедших в систему пользователей.',
|
'hidden_comment' => 'Скрытые страницы доступны только для вошедших в систему пользователей.',
|
||||||
'enter_fullscreen' => 'Войти в полноэкранный режим',
|
'enter_fullscreen' => 'Войти в полноэкранный режим',
|
||||||
'exit_fullscreen' => 'Выйти из полноэкранного режима',
|
'exit_fullscreen' => 'Выйти из полноэкранного режима',
|
||||||
'open_searchbox' => 'Открыть окно поиска',
|
'open_searchbox' => 'Открыть поле поиска',
|
||||||
'close_searchbox' => 'Закрыть окно поиска',
|
'close_searchbox' => 'Закрыть окно поиска',
|
||||||
'open_replacebox' => 'Открыть поле "Заменить"',
|
'open_replacebox' => 'Открыть поле "Заменить"',
|
||||||
'close_replacebox' => 'Закрыть поле "Заменить"',
|
'close_replacebox' => 'Закрыть Заменить коробку'
|
||||||
'commit' => 'Зафиксировать',
|
|
||||||
'reset' => 'Сброс',
|
|
||||||
'commit_confirm' => 'Вы уверены, что хотите сохранить изменения этого файла в файловой системе? Это перезапишет существующий в файловой системе файл',
|
|
||||||
'reset_confirm' => 'Вы уверены, что хотите сбросить этот файл до копии, которая находится в файловой системе? Это полностью заменит его файлом, который находится в файловой системе.',
|
|
||||||
'committing' => 'Зафиксировать',
|
|
||||||
'resetting' => 'Сбросить',
|
|
||||||
'commit_success' => ':type был зафиксирован в файловой системе',
|
|
||||||
'reset_success' => ':type был сброшен до версии из файловой системы',
|
|
||||||
],
|
],
|
||||||
'asset' => [
|
'asset' => [
|
||||||
'menu_label' => 'Ассеты',
|
'menu_label' => 'Ресурсы',
|
||||||
'unsaved_label' => 'Несохранённый(е) файл(ы)',
|
'unsaved_label' => 'Несохранённый(е) файл(ы)',
|
||||||
'drop_down_add_title' => 'Добавить...',
|
'drop_down_add_title' => 'Добавить...',
|
||||||
'drop_down_operation_title' => 'Действие...',
|
'drop_down_operation_title' => 'Действие...',
|
||||||
|
|
@ -237,7 +229,7 @@ return [
|
||||||
'error_deleting_directory' => 'Не удалось удалить директорию :dir',
|
'error_deleting_directory' => 'Не удалось удалить директорию :dir',
|
||||||
'no_list_records' => 'Файлы не найдены',
|
'no_list_records' => 'Файлы не найдены',
|
||||||
'delete_confirm' => 'Удалить выбранные файлы или каталоги?',
|
'delete_confirm' => 'Удалить выбранные файлы или каталоги?',
|
||||||
'path' => 'Путь',
|
'path' => 'Путь'
|
||||||
],
|
],
|
||||||
'component' => [
|
'component' => [
|
||||||
'menu_label' => 'Компоненты',
|
'menu_label' => 'Компоненты',
|
||||||
|
|
@ -249,10 +241,7 @@ return [
|
||||||
'invalid_request' => 'Шаблон не может быть сохранен, так как запрос содержит поврежденную информацию о компонентах.',
|
'invalid_request' => 'Шаблон не может быть сохранен, так как запрос содержит поврежденную информацию о компонентах.',
|
||||||
'no_records' => 'Компоненты не найдены',
|
'no_records' => 'Компоненты не найдены',
|
||||||
'not_found' => "Компонент ':name' не найден.",
|
'not_found' => "Компонент ':name' не найден.",
|
||||||
'no_default_partial' => "Этот компонент не имеет 'default' фрагмента (partial)",
|
'method_not_found' => "Компонент ':name' не содержит метод ':method'."
|
||||||
'method_not_found' => "Компонент ':name' не содержит метод ':method'.",
|
|
||||||
'soft_component' => 'Мягкий компонент',
|
|
||||||
'soft_component_description' => 'Этот компонент отсутствует, но он не является обязательным.',
|
|
||||||
],
|
],
|
||||||
'template' => [
|
'template' => [
|
||||||
'invalid_type' => 'Неизвестный тип шаблона.',
|
'invalid_type' => 'Неизвестный тип шаблона.',
|
||||||
|
|
@ -260,17 +249,17 @@ return [
|
||||||
'saved' => 'Шаблон был успешно сохранен.',
|
'saved' => 'Шаблон был успешно сохранен.',
|
||||||
'no_list_records' => 'Записи не найдены',
|
'no_list_records' => 'Записи не найдены',
|
||||||
'delete_confirm' => 'Удалить выбранные шаблоны?',
|
'delete_confirm' => 'Удалить выбранные шаблоны?',
|
||||||
'order_by' => 'Сортировать по',
|
'order_by' => 'Сортировать по'
|
||||||
],
|
],
|
||||||
'permissions' => [
|
'permissions' => [
|
||||||
'name' => 'CMS',
|
'name' => 'Управление CMS',
|
||||||
'manage_content' => 'Управление контент-файлами сайта',
|
'manage_content' => 'Управление контентом',
|
||||||
'manage_assets' => 'Управление ассетами сайта - изображениями, JavaScript и CSS файлами',
|
'manage_assets' => 'Управление файлами',
|
||||||
'manage_pages' => 'Создание, редактирование и удаление страниц сайта',
|
'manage_pages' => 'Управление страницами',
|
||||||
'manage_layouts' => 'Создание, редактирование и удаление CMS макетами',
|
'manage_layouts' => 'Управление шаблонами',
|
||||||
'manage_partials' => 'Создание, редактирование и удаление CMS фрагментами',
|
'manage_partials' => 'Управление фрагментами',
|
||||||
'manage_themes' => 'Активация, деактивация и конфигурация CMS тем',
|
'manage_themes' => 'Управление темами',
|
||||||
'manage_theme_options' => 'Настройка параметров для активной темы',
|
'manage_theme_options' => 'Настроить текущую тему CMS',
|
||||||
],
|
],
|
||||||
'theme_log' => [
|
'theme_log' => [
|
||||||
'hint' => 'В этом журнале отображаются изменения, внесенные в тему администраторами во внутренней области CMS.',
|
'hint' => 'В этом журнале отображаются изменения, внесенные в тему администраторами во внутренней области CMS.',
|
||||||
|
|
@ -299,6 +288,6 @@ return [
|
||||||
'preview_title' => 'Изменение шаблона',
|
'preview_title' => 'Изменение шаблона',
|
||||||
'template_updated' => 'Шаблон обновлен',
|
'template_updated' => 'Шаблон обновлен',
|
||||||
'template_created' => 'Шаблон был создан',
|
'template_created' => 'Шаблон был создан',
|
||||||
'template_deleted' => 'Шаблон был удален',
|
'template_deleted' => 'Шаблон был удален'
|
||||||
],
|
]
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -46,8 +46,8 @@ return [
|
||||||
'dir_name_create_label' => '目標主題目錄',
|
'dir_name_create_label' => '目標主題目錄',
|
||||||
'theme_label' => '主題',
|
'theme_label' => '主題',
|
||||||
'theme_title' => '主題',
|
'theme_title' => '主題',
|
||||||
'activate_button' => '啟用',
|
'activate_button' => '激活',
|
||||||
'active_button' => '啟用',
|
'active_button' => '激活',
|
||||||
'customize_theme' => '自訂主題',
|
'customize_theme' => '自訂主題',
|
||||||
'customize_button' => '自訂',
|
'customize_button' => '自訂',
|
||||||
'duplicate_button' => '複製',
|
'duplicate_button' => '複製',
|
||||||
|
|
@ -110,10 +110,7 @@ return [
|
||||||
'invalid_url' => '不合法的URL格式. URL可以正斜槓開頭, 包含數字, 拉丁字母和下面的字元: ._-[]:?|/+*^$',
|
'invalid_url' => '不合法的URL格式. URL可以正斜槓開頭, 包含數字, 拉丁字母和下面的字元: ._-[]:?|/+*^$',
|
||||||
'delete_confirm_multiple' => '真的想要刪除選擇的頁面嗎?',
|
'delete_confirm_multiple' => '真的想要刪除選擇的頁面嗎?',
|
||||||
'delete_confirm_single' => '真的想要刪除這個頁面嗎?',
|
'delete_confirm_single' => '真的想要刪除這個頁面嗎?',
|
||||||
'no_layout' => '-- 沒有佈局 --',
|
'no_layout' => '-- 沒有佈局 --'
|
||||||
'title' => '頁面標題',
|
|
||||||
'url' => '頁面網址',
|
|
||||||
'file_name' => '頁面檔案名稱',
|
|
||||||
],
|
],
|
||||||
'layout' => [
|
'layout' => [
|
||||||
'not_found_name' => "佈局 ':name' 找不到",
|
'not_found_name' => "佈局 ':name' 找不到",
|
||||||
|
|
@ -171,8 +168,8 @@ return [
|
||||||
'content' => '內容',
|
'content' => '內容',
|
||||||
'hidden' => '隱藏',
|
'hidden' => '隱藏',
|
||||||
'hidden_comment' => '隱藏頁面只能被登錄的後台使用者訪問.',
|
'hidden_comment' => '隱藏頁面只能被登錄的後台使用者訪問.',
|
||||||
'enter_fullscreen' => '進入全螢幕模式',
|
'enter_fullscreen' => '進入全屏模式',
|
||||||
'exit_fullscreen' => '退出全螢幕模式',
|
'exit_fullscreen' => '退出全屏模式'
|
||||||
],
|
],
|
||||||
'asset' => [
|
'asset' => [
|
||||||
'menu_label' => '資源',
|
'menu_label' => '資源',
|
||||||
|
|
@ -184,12 +181,12 @@ return [
|
||||||
'create_directory' => '新建目錄',
|
'create_directory' => '新建目錄',
|
||||||
'directory_popup_title' => '新目錄',
|
'directory_popup_title' => '新目錄',
|
||||||
'directory_name' => '目錄名',
|
'directory_name' => '目錄名',
|
||||||
'rename' => '重新命名',
|
'rename' => '重命名',
|
||||||
'delete' => '刪除',
|
'delete' => '刪除',
|
||||||
'move' => '移動',
|
'move' => '移動',
|
||||||
'select' => '選擇',
|
'select' => '選擇',
|
||||||
'new' => '新檔案',
|
'new' => '新檔案',
|
||||||
'rename_popup_title' => '重新命名',
|
'rename_popup_title' => '重命名',
|
||||||
'rename_new_name' => '新名稱',
|
'rename_new_name' => '新名稱',
|
||||||
'invalid_path' => '路徑名稱只能包含數字, 拉丁字母和以下字元: _-/',
|
'invalid_path' => '路徑名稱只能包含數字, 拉丁字母和以下字元: _-/',
|
||||||
'error_deleting_file' => '刪除檔案 :name 錯誤.',
|
'error_deleting_file' => '刪除檔案 :name 錯誤.',
|
||||||
|
|
@ -198,7 +195,7 @@ return [
|
||||||
'invalid_name' => '名稱只能包含數字, 拉丁字母, 空格和以下字元: _-',
|
'invalid_name' => '名稱只能包含數字, 拉丁字母, 空格和以下字元: _-',
|
||||||
'original_not_found' => '原始檔案或目錄找不到',
|
'original_not_found' => '原始檔案或目錄找不到',
|
||||||
'already_exists' => '檔案或目錄已存在',
|
'already_exists' => '檔案或目錄已存在',
|
||||||
'error_renaming' => '重新命名檔案或目錄錯誤',
|
'error_renaming' => '重命名檔案或目錄錯誤',
|
||||||
'name_cant_be_empty' => '名稱不能為空',
|
'name_cant_be_empty' => '名稱不能為空',
|
||||||
'too_large' => '上傳的檔案太大. 最大檔案大小是 :max_size',
|
'too_large' => '上傳的檔案太大. 最大檔案大小是 :max_size',
|
||||||
'type_not_allowed' => '只有下面的檔案類型是允許的: :allowed_types',
|
'type_not_allowed' => '只有下面的檔案類型是允許的: :allowed_types',
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ App::before(function ($request) {
|
||||||
* The CMS module intercepts all URLs that were not
|
* The CMS module intercepts all URLs that were not
|
||||||
* handled by the back-end modules.
|
* handled by the back-end modules.
|
||||||
*/
|
*/
|
||||||
Route::any('{slug?}', 'Cms\Classes\CmsController@run')->where('slug', '(.*)?')->middleware('web');
|
Route::any('{slug}', 'Cms\Classes\CmsController@run')->where('slug', '(.*)?')->middleware('web');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @event cms.route
|
* @event cms.route
|
||||||
|
|
|
||||||
|
|
@ -190,8 +190,7 @@ trait UrlMaker
|
||||||
'mtime' => @File::lastModified($filePath)
|
'mtime' => @File::lastModified($filePath)
|
||||||
];
|
];
|
||||||
|
|
||||||
$expiresAt = now()->addMinutes(Config::get('cms.parsedPageCacheTTL', 1440));
|
Cache::put($key, serialize($cached), Config::get('cms.parsedPageCacheTTL', 1440));
|
||||||
Cache::put($key, serialize($cached), $expiresAt);
|
|
||||||
|
|
||||||
return static::$urlPageName = $baseFileName;
|
return static::$urlPageName = $baseFileName;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ use Cms\Classes\Controller;
|
||||||
use Cms\Classes\ComponentBase;
|
use Cms\Classes\ComponentBase;
|
||||||
use Illuminate\Pagination\Paginator;
|
use Illuminate\Pagination\Paginator;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
|
use Illuminate\Support\Debug\HtmlDumper;
|
||||||
use Symfony\Component\VarDumper\Cloner\VarCloner;
|
use Symfony\Component\VarDumper\Cloner\VarCloner;
|
||||||
use October\Rain\Database\Model;
|
use October\Rain\Database\Model;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -97,14 +97,6 @@ class ServiceProvider extends ModuleServiceProvider
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Set a default samesite config value for invalid values
|
|
||||||
*/
|
|
||||||
if (!in_array(strtolower(Config::get('session.same_site')), ['lax', 'strict', 'none'])) {
|
|
||||||
Config::set('session.same_site', 'Lax');
|
|
||||||
}
|
|
||||||
|
|
||||||
Paginator::useBootstrapThree();
|
|
||||||
Paginator::defaultSimpleView('system::pagination.simple-default');
|
Paginator::defaultSimpleView('system::pagination.simple-default');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -143,7 +135,7 @@ class ServiceProvider extends ModuleServiceProvider
|
||||||
protected function registerPrivilegedActions()
|
protected function registerPrivilegedActions()
|
||||||
{
|
{
|
||||||
$requests = ['/combine/', '@/system/updates', '@/system/install', '@/backend/auth'];
|
$requests = ['/combine/', '@/system/updates', '@/system/install', '@/backend/auth'];
|
||||||
$commands = ['october:up', 'october:update', 'october:env', 'october:version'];
|
$commands = ['october:up', 'october:update'];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Requests
|
* Requests
|
||||||
|
|
@ -258,8 +250,6 @@ class ServiceProvider extends ModuleServiceProvider
|
||||||
$this->registerConsoleCommand('october.env', 'System\Console\OctoberEnv');
|
$this->registerConsoleCommand('october.env', 'System\Console\OctoberEnv');
|
||||||
$this->registerConsoleCommand('october.install', 'System\Console\OctoberInstall');
|
$this->registerConsoleCommand('october.install', 'System\Console\OctoberInstall');
|
||||||
$this->registerConsoleCommand('october.passwd', 'System\Console\OctoberPasswd');
|
$this->registerConsoleCommand('october.passwd', 'System\Console\OctoberPasswd');
|
||||||
$this->registerConsoleCommand('october.version', 'System\Console\OctoberVersion');
|
|
||||||
$this->registerConsoleCommand('october.manifest', 'System\Console\OctoberManifest');
|
|
||||||
|
|
||||||
$this->registerConsoleCommand('plugin.install', 'System\Console\PluginInstall');
|
$this->registerConsoleCommand('plugin.install', 'System\Console\PluginInstall');
|
||||||
$this->registerConsoleCommand('plugin.remove', 'System\Console\PluginRemove');
|
$this->registerConsoleCommand('plugin.remove', 'System\Console\PluginRemove');
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ return [
|
||||||
'Eloquent' => Illuminate\Database\Eloquent\Model::class,
|
'Eloquent' => Illuminate\Database\Eloquent\Model::class,
|
||||||
'Event' => Illuminate\Support\Facades\Event::class,
|
'Event' => Illuminate\Support\Facades\Event::class,
|
||||||
'Hash' => Illuminate\Support\Facades\Hash::class,
|
'Hash' => Illuminate\Support\Facades\Hash::class,
|
||||||
|
'Input' => Illuminate\Support\Facades\Input::class,
|
||||||
'Lang' => Illuminate\Support\Facades\Lang::class,
|
'Lang' => Illuminate\Support\Facades\Lang::class,
|
||||||
'Log' => Illuminate\Support\Facades\Log::class,
|
'Log' => Illuminate\Support\Facades\Log::class,
|
||||||
'Mail' => Illuminate\Support\Facades\Mail::class,
|
'Mail' => Illuminate\Support\Facades\Mail::class,
|
||||||
|
|
@ -29,6 +30,7 @@ return [
|
||||||
'Storage' => Illuminate\Support\Facades\Storage::class,
|
'Storage' => Illuminate\Support\Facades\Storage::class,
|
||||||
'Url' => Illuminate\Support\Facades\URL::class, // Preferred
|
'Url' => Illuminate\Support\Facades\URL::class, // Preferred
|
||||||
'URL' => Illuminate\Support\Facades\URL::class,
|
'URL' => Illuminate\Support\Facades\URL::class,
|
||||||
|
'Validator' => Illuminate\Support\Facades\Validator::class,
|
||||||
'View' => Illuminate\Support\Facades\View::class,
|
'View' => Illuminate\Support\Facades\View::class,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -40,7 +42,6 @@ return [
|
||||||
'Config' => October\Rain\Support\Facades\Config::class,
|
'Config' => October\Rain\Support\Facades\Config::class,
|
||||||
'Seeder' => October\Rain\Database\Updates\Seeder::class,
|
'Seeder' => October\Rain\Database\Updates\Seeder::class,
|
||||||
'Flash' => October\Rain\Support\Facades\Flash::class,
|
'Flash' => October\Rain\Support\Facades\Flash::class,
|
||||||
'Input' => October\Rain\Support\Facades\Input::class,
|
|
||||||
'Form' => October\Rain\Support\Facades\Form::class,
|
'Form' => October\Rain\Support\Facades\Form::class,
|
||||||
'Html' => October\Rain\Support\Facades\Html::class,
|
'Html' => October\Rain\Support\Facades\Html::class,
|
||||||
'Http' => October\Rain\Support\Facades\Http::class,
|
'Http' => October\Rain\Support\Facades\Http::class,
|
||||||
|
|
@ -51,7 +52,6 @@ return [
|
||||||
'Twig' => October\Rain\Support\Facades\Twig::class,
|
'Twig' => October\Rain\Support\Facades\Twig::class,
|
||||||
'DbDongle' => October\Rain\Support\Facades\DbDongle::class,
|
'DbDongle' => October\Rain\Support\Facades\DbDongle::class,
|
||||||
'Schema' => October\Rain\Support\Facades\Schema::class,
|
'Schema' => October\Rain\Support\Facades\Schema::class,
|
||||||
'Validator' => October\Rain\Support\Facades\Validator::class,
|
|
||||||
'Cms' => Cms\Facades\Cms::class,
|
'Cms' => Cms\Facades\Cms::class,
|
||||||
'Backend' => Backend\Facades\Backend::class,
|
'Backend' => Backend\Facades\Backend::class,
|
||||||
'BackendMenu' => Backend\Facades\BackendMenu::class,
|
'BackendMenu' => Backend\Facades\BackendMenu::class,
|
||||||
|
|
@ -60,12 +60,4 @@ return [
|
||||||
'SystemException' => October\Rain\Exception\SystemException::class,
|
'SystemException' => October\Rain\Exception\SystemException::class,
|
||||||
'ApplicationException' => October\Rain\Exception\ApplicationException::class,
|
'ApplicationException' => October\Rain\Exception\ApplicationException::class,
|
||||||
'ValidationException' => October\Rain\Exception\ValidationException::class,
|
'ValidationException' => October\Rain\Exception\ValidationException::class,
|
||||||
|
|
||||||
/*
|
|
||||||
* Fallback aliases
|
|
||||||
*/
|
|
||||||
// Input facade was removed in Laravel 6 - we are keeping it in the Rain library for backwards compatibility.
|
|
||||||
'Illuminate\Support\Facades\Input' => October\Rain\Support\Facades\Input::class,
|
|
||||||
// Illuminate's HtmlDumper was "dumped" in Laravel 6 - we'll route this to Symfony's HtmlDumper as Laravel have done.
|
|
||||||
'Illuminate\Support\Debug\HtmlDumper' => Symfony\Component\VarDumper\Dumper\HtmlDumper::class,
|
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -69,8 +69,7 @@ var fieldElement=$form.find('[name="'+fieldName+'"], [name="'+fieldName+'[]"], [
|
||||||
if(fieldElement.length>0){var _event=jQuery.Event('ajaxInvalidField')
|
if(fieldElement.length>0){var _event=jQuery.Event('ajaxInvalidField')
|
||||||
$(window).trigger(_event,[fieldElement.get(0),fieldName,fieldMessages,isFirstInvalidField])
|
$(window).trigger(_event,[fieldElement.get(0),fieldName,fieldMessages,isFirstInvalidField])
|
||||||
if(isFirstInvalidField){if(!_event.isDefaultPrevented())fieldElement.focus()
|
if(isFirstInvalidField){if(!_event.isDefaultPrevented())fieldElement.focus()
|
||||||
isFirstInvalidField=false}}})},handleFlashMessage:function(message,type){},handleRedirectResponse:function(url){window.location.assign(url)
|
isFirstInvalidField=false}}})},handleFlashMessage:function(message,type){},handleRedirectResponse:function(url){window.location.assign(url)},handleUpdateResponse:function(data,textStatus,jqXHR){var updatePromise=$.Deferred().done(function(){for(var partial in data){var selector=(options.update[partial])?options.update[partial]:partial
|
||||||
$el.trigger('ajaxDone')},handleUpdateResponse:function(data,textStatus,jqXHR){var updatePromise=$.Deferred().done(function(){for(var partial in data){var selector=(options.update[partial])?options.update[partial]:partial
|
|
||||||
if($.type(selector)=='string'&&selector.charAt(0)=='@'){$(selector.substring(1)).append(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
if($.type(selector)=='string'&&selector.charAt(0)=='@'){$(selector.substring(1)).append(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
||||||
else if($.type(selector)=='string'&&selector.charAt(0)=='^'){$(selector.substring(1)).prepend(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
else if($.type(selector)=='string'&&selector.charAt(0)=='^'){$(selector.substring(1)).prepend(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
||||||
else{$(selector).trigger('ajaxBeforeReplace')
|
else{$(selector).trigger('ajaxBeforeReplace')
|
||||||
|
|
|
||||||
|
|
@ -69,8 +69,7 @@ var fieldElement=$form.find('[name="'+fieldName+'"], [name="'+fieldName+'[]"], [
|
||||||
if(fieldElement.length>0){var _event=jQuery.Event('ajaxInvalidField')
|
if(fieldElement.length>0){var _event=jQuery.Event('ajaxInvalidField')
|
||||||
$(window).trigger(_event,[fieldElement.get(0),fieldName,fieldMessages,isFirstInvalidField])
|
$(window).trigger(_event,[fieldElement.get(0),fieldName,fieldMessages,isFirstInvalidField])
|
||||||
if(isFirstInvalidField){if(!_event.isDefaultPrevented())fieldElement.focus()
|
if(isFirstInvalidField){if(!_event.isDefaultPrevented())fieldElement.focus()
|
||||||
isFirstInvalidField=false}}})},handleFlashMessage:function(message,type){},handleRedirectResponse:function(url){window.location.assign(url)
|
isFirstInvalidField=false}}})},handleFlashMessage:function(message,type){},handleRedirectResponse:function(url){window.location.assign(url)},handleUpdateResponse:function(data,textStatus,jqXHR){var updatePromise=$.Deferred().done(function(){for(var partial in data){var selector=(options.update[partial])?options.update[partial]:partial
|
||||||
$el.trigger('ajaxDone')},handleUpdateResponse:function(data,textStatus,jqXHR){var updatePromise=$.Deferred().done(function(){for(var partial in data){var selector=(options.update[partial])?options.update[partial]:partial
|
|
||||||
if($.type(selector)=='string'&&selector.charAt(0)=='@'){$(selector.substring(1)).append(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
if($.type(selector)=='string'&&selector.charAt(0)=='@'){$(selector.substring(1)).append(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
||||||
else if($.type(selector)=='string'&&selector.charAt(0)=='^'){$(selector.substring(1)).prepend(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
else if($.type(selector)=='string'&&selector.charAt(0)=='^'){$(selector.substring(1)).prepend(data[partial]).trigger('ajaxUpdate',[context,data,textStatus,jqXHR])}
|
||||||
else{$(selector).trigger('ajaxBeforeReplace')
|
else{$(selector).trigger('ajaxBeforeReplace')
|
||||||
|
|
|
||||||
|
|
@ -288,11 +288,6 @@ if (window.jQuery.request !== undefined) {
|
||||||
*/
|
*/
|
||||||
handleRedirectResponse: function(url) {
|
handleRedirectResponse: function(url) {
|
||||||
window.location.assign(url)
|
window.location.assign(url)
|
||||||
// Indicate that the AJAX request is finished if we're still on the current page
|
|
||||||
// so that the loading indicator for redirects that cause a browser to download
|
|
||||||
// a file instead of leave the page will properly stop.
|
|
||||||
// @see https://github.com/octobercms/october/issues/5055
|
|
||||||
$el.trigger('ajaxDone')
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ if ($.oc === undefined) $.oc = {}
|
||||||
if ($.oc.langMessages === undefined) $.oc.langMessages = {}
|
if ($.oc.langMessages === undefined) $.oc.langMessages = {}
|
||||||
$.oc.langMessages['zh-tw'] = $.extend(
|
$.oc.langMessages['zh-tw'] = $.extend(
|
||||||
$.oc.langMessages['zh-tw'] || {},
|
$.oc.langMessages['zh-tw'] || {},
|
||||||
{"markdowneditor":{"formatting":"\u683c\u5f0f","quote":"\u5f15\u8a00","code":"\u7a0b\u5f0f\u78bc","header1":"\u6a19\u984c\u4e00","header2":"\u6a19\u984c\u4e8c","header3":"\u6a19\u984c\u4e09","header4":"\u6a19\u984c\u56db","header5":"\u6a19\u984c\u4e94","header6":"\u6a19\u984c\u516d","bold":"\u7c97\u9ad4","italic":"\u659c\u9ad4","unorderedlist":"\u9805\u76ee\u6e05\u55ae","orderedlist":"\u6578\u5b57\u6e05\u55ae","video":"\u5f71\u7247","image":"\u5716\u7247","link":"\u9023\u7d50","horizontalrule":"\u63d2\u5165\u6c34\u5e73\u7dda","fullscreen":"\u5168\u87a2\u5e55","preview":"\u9810\u89bd"},"mediamanager":{"insert_link":"\u63d2\u5165\u5a92\u9ad4\u6ac3\u9023\u7d50","insert_image":"\u63d2\u5165\u5a92\u9ad4\u6ac3\u5716\u7247","insert_video":"\u63d2\u5165\u5a92\u9ad4\u6ac3\u5f71\u7247","insert_audio":"\u63d2\u5165\u5a92\u9ad4\u6ac3\u97f3\u8a0a","invalid_file_empty_insert":"\u8acb\u9078\u64c7\u6a94\u6848\u4ee5\u63d2\u5165\u9023\u7d50\u3002","invalid_file_single_insert":"\u8acb\u9078\u64c7\u4e00\u500b\u6a94\u6848\u3002","invalid_image_empty_insert":"\u8acb\u9078\u64c7\u63d2\u5165\u7684\u5716\u7247\u3002","invalid_video_empty_insert":"\u8acb\u9078\u64c7\u63d2\u5165\u7684\u5f71\u7247\u3002","invalid_audio_empty_insert":"\u8acb\u9078\u64c7\u63d2\u5165\u7684\u97f3\u8a0a\u3002"},"alert":{"confirm_button_text":"\u78ba\u8a8d","cancel_button_text":"\u53d6\u6d88","widget_remove_confirm":"\u78ba\u5b9a\u79fb\u9664\u6b64\u5143\u4ef6\uff1f"},"datepicker":{"previousMonth":"\u4e0a\u500b\u6708","nextMonth":"\u4e0b\u500b\u6708","months":["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"],"weekdays":["\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d"],"weekdaysShort":["\u9031\u65e5","\u9031\u4e00","\u9031\u4e8c","\u9031\u4e09","\u9031\u56db","\u9031\u4e94","\u9031\u516d"]},"colorpicker":{"choose":"\u78ba\u5b9a"},"filter":{"group":{"all":"\u5168\u90e8"},"scopes":{"apply_button_text":"\u78ba\u5b9a","clear_button_text":"\u6e05\u9664"},"dates":{"all":"\u5168\u90e8","filter_button_text":"\u7be9\u9078","reset_button_text":"\u91cd\u7f6e","date_placeholder":"\u65e5\u671f","after_placeholder":"\u5728\u6b64\u4e4b\u5f8c","before_placeholder":"\u5728\u6b64\u4e4b\u524d"},"numbers":{"all":"\u5168\u90e8","filter_button_text":"\u7be9\u9078","reset_button_text":"\u91cd\u7f6e","min_placeholder":"\u6700\u5c0f\u503c","max_placeholder":"\u6700\u5927\u503c"}},"eventlog":{"show_stacktrace":"Show the stacktrace","hide_stacktrace":"Hide the stacktrace","tabs":{"formatted":"Formatted","raw":"Raw"},"editor":{"title":"Source code editor","description":"Your operating system should be configured to listen to one of these URL schemes.","openWith":"Open with","remember_choice":"Remember selected option for this session","open":"Open","cancel":"Cancel"}}}
|
{"markdowneditor":{"formatting":"Formatting","quote":"Quote","code":"Code","header1":"Header 1","header2":"Header 2","header3":"Header 3","header4":"Header 4","header5":"Header 5","header6":"Header 6","bold":"Bold","italic":"Italic","unorderedlist":"Unordered List","orderedlist":"Ordered List","video":"Video","image":"Image","link":"Link","horizontalrule":"Insert Horizontal Rule","fullscreen":"Full screen","preview":"Preview"},"mediamanager":{"insert_link":"Insert Media Link","insert_image":"Insert Media Image","insert_video":"Insert Media Video","insert_audio":"Insert Media Audio","invalid_file_empty_insert":"Please select file to insert a links to.","invalid_file_single_insert":"Please select a single file.","invalid_image_empty_insert":"Please select image(s) to insert.","invalid_video_empty_insert":"Please select a video file to insert.","invalid_audio_empty_insert":"Please select an audio file to insert."},"alert":{"confirm_button_text":"OK","cancel_button_text":"Cancel","widget_remove_confirm":"Remove this widget?"},"datepicker":{"previousMonth":"Previous Month","nextMonth":"Next Month","months":["January","February","March","April","May","June","July","August","September","October","November","December"],"weekdays":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"weekdaysShort":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},"colorpicker":{"choose":"Ok"},"filter":{"group":{"all":"all"},"scopes":{"apply_button_text":"Apply","clear_button_text":"Clear"},"dates":{"all":"all","filter_button_text":"Filter","reset_button_text":"Reset","date_placeholder":"Date","after_placeholder":"After","before_placeholder":"Before"},"numbers":{"all":"all","filter_button_text":"Filter","reset_button_text":"Reset","min_placeholder":"Min","max_placeholder":"Max"}},"eventlog":{"show_stacktrace":"Show the stacktrace","hide_stacktrace":"Hide the stacktrace","tabs":{"formatted":"Formatted","raw":"Raw"},"editor":{"title":"Source code editor","description":"Your operating system should be configured to listen to one of these URL schemes.","openWith":"Open with","remember_choice":"Remember selected option for this session","open":"Open","cancel":"Cancel"}}}
|
||||||
);
|
);
|
||||||
|
|
||||||
//! moment.js locale configuration v2.22.2
|
//! moment.js locale configuration v2.22.2
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@
|
||||||
this.updateClasses()
|
this.updateClasses()
|
||||||
|
|
||||||
if (location.hash && this.$tabsContainer.is('[data-linkable]')) {
|
if (location.hash && this.$tabsContainer.is('[data-linkable]')) {
|
||||||
$('li > a[href="' + location.hash + '"]', this.$tabsContainer).tab('show')
|
$('li > a[href=' + location.hash + ']', this.$tabsContainer).tab('show')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4597,7 +4597,7 @@ if(tabUrl){window.history.replaceState({},'Tab link reference',tabUrl)}})
|
||||||
if(this.options.slidable){this.$pagesContainer.touchwipe({wipeRight:function(){self.prev();},wipeLeft:function(){self.next();},preventDefaultEvents:false,min_move_x:60});}
|
if(this.options.slidable){this.$pagesContainer.touchwipe({wipeRight:function(){self.prev();},wipeLeft:function(){self.next();},preventDefaultEvents:false,min_move_x:60});}
|
||||||
this.$tabsContainer.toolbar({scrollClassContainer:this.$el})
|
this.$tabsContainer.toolbar({scrollClassContainer:this.$el})
|
||||||
this.updateClasses()
|
this.updateClasses()
|
||||||
if(location.hash&&this.$tabsContainer.is('[data-linkable]')){$('li > a[href="'+location.hash+'"]',this.$tabsContainer).tab('show')}}
|
if(location.hash&&this.$tabsContainer.is('[data-linkable]')){$('li > a[href='+location.hash+']',this.$tabsContainer).tab('show')}}
|
||||||
Tab.prototype.initTab=function(li){var
|
Tab.prototype.initTab=function(li){var
|
||||||
$tabs=$('>li',this.$tabsContainer),tabIndex=$tabs.index(li),time=new Date().getTime(),targetId=this.tabId+'-tab-'+tabIndex+time,$anchor=$('a',li)
|
$tabs=$('>li',this.$tabsContainer),tabIndex=$tabs.index(li),time=new Date().getTime(),targetId=this.tabId+'-tab-'+tabIndex+time,$anchor=$('a',li)
|
||||||
$anchor.data('target','#'+targetId).attr('data-target','#'+targetId).attr('data-toggle','tab')
|
$anchor.data('target','#'+targetId).attr('data-target','#'+targetId).attr('data-toggle','tab')
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,11 @@ use Route;
|
||||||
use Config;
|
use Config;
|
||||||
use Request;
|
use Request;
|
||||||
use Response;
|
use Response;
|
||||||
use October\Rain\Assetic\Asset\FileAsset;
|
use Assetic\Asset\FileAsset;
|
||||||
use October\Rain\Assetic\Asset\AssetCache;
|
use Assetic\Asset\AssetCache;
|
||||||
use October\Rain\Assetic\Asset\AssetCollection;
|
use Assetic\Asset\AssetCollection;
|
||||||
use October\Rain\Assetic\Cache\FilesystemCache;
|
use Assetic\Factory\AssetFactory;
|
||||||
use October\Rain\Assetic\Factory\AssetFactory;
|
use October\Rain\Parse\Assetic\FilesystemCache;
|
||||||
use System\Helpers\Cache as CacheHelper;
|
use System\Helpers\Cache as CacheHelper;
|
||||||
use ApplicationException;
|
use ApplicationException;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
|
|
@ -126,22 +126,22 @@ class CombineAssets
|
||||||
/*
|
/*
|
||||||
* Register JavaScript filters
|
* Register JavaScript filters
|
||||||
*/
|
*/
|
||||||
$this->registerFilter('js', new \October\Rain\Assetic\Filter\JavascriptImporter);
|
$this->registerFilter('js', new \October\Rain\Parse\Assetic\JavascriptImporter);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register CSS filters
|
* Register CSS filters
|
||||||
*/
|
*/
|
||||||
$this->registerFilter('css', new \October\Rain\Assetic\Filter\CssImportFilter);
|
$this->registerFilter('css', new \Assetic\Filter\CssImportFilter);
|
||||||
$this->registerFilter(['css', 'less', 'scss'], new \October\Rain\Assetic\Filter\CssRewriteFilter);
|
$this->registerFilter(['css', 'less', 'scss'], new \Assetic\Filter\CssRewriteFilter);
|
||||||
$this->registerFilter('less', new \October\Rain\Assetic\Filter\LessCompiler);
|
$this->registerFilter('less', new \October\Rain\Parse\Assetic\LessCompiler);
|
||||||
$this->registerFilter('scss', new \October\Rain\Assetic\Filter\ScssCompiler);
|
$this->registerFilter('scss', new \October\Rain\Parse\Assetic\ScssCompiler);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Minification filters
|
* Minification filters
|
||||||
*/
|
*/
|
||||||
if ($this->useMinify) {
|
if ($this->useMinify) {
|
||||||
$this->registerFilter('js', new \October\Rain\Assetic\Filter\JSMinFilter);
|
$this->registerFilter('js', new \Assetic\Filter\JSMinFilter);
|
||||||
$this->registerFilter(['css', 'less', 'scss'], new \October\Rain\Assetic\Filter\StylesheetMinify);
|
$this->registerFilter(['css', 'less', 'scss'], new \October\Rain\Parse\Assetic\StylesheetMinify);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<?php namespace System\Classes;
|
<?php namespace System\Classes;
|
||||||
|
|
||||||
|
use Log;
|
||||||
use View;
|
use View;
|
||||||
use Config;
|
use Config;
|
||||||
use Cms\Classes\Theme;
|
use Cms\Classes\Theme;
|
||||||
|
|
@ -7,7 +8,6 @@ use Cms\Classes\Router;
|
||||||
use Cms\Classes\Controller as CmsController;
|
use Cms\Classes\Controller as CmsController;
|
||||||
use October\Rain\Exception\ErrorHandler as ErrorHandlerBase;
|
use October\Rain\Exception\ErrorHandler as ErrorHandlerBase;
|
||||||
use October\Rain\Exception\SystemException;
|
use October\Rain\Exception\SystemException;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* System Error Handler, this class handles application exception events.
|
* System Error Handler, this class handles application exception events.
|
||||||
|
|
@ -34,6 +34,18 @@ class ErrorHandler extends ErrorHandlerBase
|
||||||
// return parent::handleException($proposedException);
|
// return parent::handleException($proposedException);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We are about to display an error page to the user,
|
||||||
|
* if it is an SystemException, this event should be logged.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function beforeHandleError($exception)
|
||||||
|
{
|
||||||
|
if ($exception instanceof SystemException) {
|
||||||
|
Log::error($exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Looks up an error page using the CMS route "/error". If the route does not
|
* Looks up an error page using the CMS route "/error". If the route does not
|
||||||
* exist, this function will use the error view found in the Cms module.
|
* exist, this function will use the error view found in the Cms module.
|
||||||
|
|
@ -62,7 +74,7 @@ class ErrorHandler extends ErrorHandlerBase
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract content from response object
|
// Extract content from response object
|
||||||
if ($result instanceof Response) {
|
if ($result instanceof \Symfony\Component\HttpFoundation\Response) {
|
||||||
$result = $result->getContent();
|
$result = $result->getContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -134,11 +134,10 @@ class MediaLibrary
|
||||||
$folderContents = $this->scanFolderContents($fullFolderPath);
|
$folderContents = $this->scanFolderContents($fullFolderPath);
|
||||||
|
|
||||||
$cached[$fullFolderPath] = $folderContents;
|
$cached[$fullFolderPath] = $folderContents;
|
||||||
$expiresAt = now()->addMinutes(Config::get('cms.storage.media.ttl', 10));
|
|
||||||
Cache::put(
|
Cache::put(
|
||||||
$this->cacheKey,
|
$this->cacheKey,
|
||||||
base64_encode(serialize($cached)),
|
base64_encode(serialize($cached)),
|
||||||
$expiresAt
|
Config::get('cms.storage.media.ttl', 10)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -536,7 +535,7 @@ class MediaLibrary
|
||||||
*/
|
*/
|
||||||
public function getPathUrl($path)
|
public function getPathUrl($path)
|
||||||
{
|
{
|
||||||
$path = $this->validatePath($path, true);
|
$path = $this->validatePath($path);
|
||||||
|
|
||||||
$fullPath = $this->storagePath . implode("/", array_map("rawurlencode", explode("/", $path)));
|
$fullPath = $this->storagePath . implode("/", array_map("rawurlencode", explode("/", $path)));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -120,29 +120,6 @@ class PluginBase extends ServiceProviderBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers back-end quick actions for this plugin.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function registerQuickActions()
|
|
||||||
{
|
|
||||||
$configuration = $this->getConfigurationFromYaml();
|
|
||||||
if (array_key_exists('quickActions', $configuration)) {
|
|
||||||
$quickActions = $configuration['quickActions'];
|
|
||||||
|
|
||||||
if (is_array($quickActions)) {
|
|
||||||
array_walk_recursive($quickActions, function (&$item, $key) {
|
|
||||||
if ($key === 'url') {
|
|
||||||
$item = Backend::url($item);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return $quickActions;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers any back-end permissions used by this plugin.
|
* Registers any back-end permissions used by this plugin.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -238,6 +238,18 @@ class PluginManager
|
||||||
ComposerManager::instance()->autoload($pluginPath . '/vendor');
|
ComposerManager::instance()->autoload($pluginPath . '/vendor');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable plugin registration for restricted pages, unless elevated
|
||||||
|
*/
|
||||||
|
if (self::$noInit && !$plugin->elevated) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the plugin's register() method
|
||||||
|
*/
|
||||||
|
$plugin->register();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register configuration path
|
* Register configuration path
|
||||||
*/
|
*/
|
||||||
|
|
@ -254,18 +266,6 @@ class PluginManager
|
||||||
View::addNamespace($pluginNamespace, $viewsPath);
|
View::addNamespace($pluginNamespace, $viewsPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable plugin registration for restricted pages, unless elevated
|
|
||||||
*/
|
|
||||||
if (self::$noInit && !$plugin->elevated) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run the plugin's register() method
|
|
||||||
*/
|
|
||||||
$plugin->register();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add init, if available
|
* Add init, if available
|
||||||
*/
|
*/
|
||||||
|
|
@ -346,24 +346,15 @@ class PluginManager
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an array with all enabled plugins
|
* Returns an array with all enabled plugins
|
||||||
|
* The index is the plugin namespace, the value is the plugin information object.
|
||||||
*
|
*
|
||||||
* @return array [$code => $pluginObj]
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function getPlugins()
|
public function getPlugins()
|
||||||
{
|
{
|
||||||
return array_diff_key($this->plugins, $this->disabledPlugins);
|
return array_diff_key($this->plugins, $this->disabledPlugins);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an array will all plugins detected on the filesystem
|
|
||||||
*
|
|
||||||
* @return array [$code => $pluginObj]
|
|
||||||
*/
|
|
||||||
public function getAllPlugins()
|
|
||||||
{
|
|
||||||
return $this->plugins;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a plugin registration class based on its namespace (Author\Plugin).
|
* Returns a plugin registration class based on its namespace (Author\Plugin).
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,10 @@
|
||||||
<?php namespace System\Classes;
|
<?php namespace System\Classes;
|
||||||
|
|
||||||
use Lang;
|
use Lang;
|
||||||
use Config;
|
|
||||||
use Response;
|
|
||||||
use Exception;
|
|
||||||
use SystemException;
|
|
||||||
use ApplicationException;
|
use ApplicationException;
|
||||||
use Illuminate\Routing\Controller as ControllerBase;
|
use Illuminate\Routing\Controller as ControllerBase;
|
||||||
|
use Exception;
|
||||||
|
use Response;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The is the master controller for system related routing.
|
* The is the master controller for system related routing.
|
||||||
|
|
@ -14,7 +12,7 @@ use Illuminate\Routing\Controller as ControllerBase;
|
||||||
*
|
*
|
||||||
* @see System\Classes\CombineAssets Asset combiner class
|
* @see System\Classes\CombineAssets Asset combiner class
|
||||||
* @package october\system
|
* @package october\system
|
||||||
* @author Alexey Bobkov, Samuel Georges, Luke Towers
|
* @author Alexey Bobkov, Samuel Georges
|
||||||
*/
|
*/
|
||||||
class SystemController extends ControllerBase
|
class SystemController extends ControllerBase
|
||||||
{
|
{
|
||||||
|
|
@ -37,49 +35,9 @@ class SystemController extends ControllerBase
|
||||||
$combiner = CombineAssets::instance();
|
$combiner = CombineAssets::instance();
|
||||||
|
|
||||||
return $combiner->getContents($cacheId);
|
return $combiner->getContents($cacheId);
|
||||||
} catch (Exception $ex) {
|
}
|
||||||
|
catch (Exception $ex) {
|
||||||
return Response::make('/* '.e($ex->getMessage()).' */', 500);
|
return Response::make('/* '.e($ex->getMessage()).' */', 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Resizes an image using the provided configuration
|
|
||||||
* and returns a redirect to the resized image
|
|
||||||
*
|
|
||||||
* @param string $identifier The identifier used to retrieve the image configuration
|
|
||||||
* @param string $encodedUrl The double-encoded URL of the resized image, see https://github.com/octobercms/october/issues/3592#issuecomment-671017380
|
|
||||||
* @return RedirectResponse
|
|
||||||
*/
|
|
||||||
public function resizer(string $identifier, string $encodedUrl)
|
|
||||||
{
|
|
||||||
$resizedUrl = ImageResizer::getValidResizedUrl($identifier, $encodedUrl);
|
|
||||||
if (empty($resizedUrl)) {
|
|
||||||
return response('Invalid identifier or redirect URL', 400);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attempt to process the resize
|
|
||||||
try {
|
|
||||||
$resizer = ImageResizer::fromIdentifier($identifier);
|
|
||||||
$resizer->resize();
|
|
||||||
} catch (SystemException $ex) {
|
|
||||||
// If the resizing failed with a SystemException, it was most
|
|
||||||
// likely because it is in progress or has already finished
|
|
||||||
// although it could also be because the cache system used to store
|
|
||||||
// configuration data is broken
|
|
||||||
if (Config::get('cache.default', 'file') === 'array') {
|
|
||||||
throw new Exception('Image resizing requires a persistent cache driver, "array" is not supported. Try changing config/cache.php -> default to a persistent cache driver.');
|
|
||||||
}
|
|
||||||
} catch (Exception $ex) {
|
|
||||||
// If it failed for any other reason, restore the config so that
|
|
||||||
// the resizer route will continue to work until it succeeds
|
|
||||||
if ($resizer) {
|
|
||||||
$resizer->storeConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rethrow the exception
|
|
||||||
throw $ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->to($resizedUrl);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,11 @@ class UpdateManager
|
||||||
{
|
{
|
||||||
use \October\Rain\Support\Traits\Singleton;
|
use \October\Rain\Support\Traits\Singleton;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array The notes for the current operation.
|
||||||
|
*/
|
||||||
|
protected $notes = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Illuminate\Console\OutputStyle
|
* @var \Illuminate\Console\OutputStyle
|
||||||
*/
|
*/
|
||||||
|
|
@ -89,11 +94,6 @@ class UpdateManager
|
||||||
*/
|
*/
|
||||||
protected $repository;
|
protected $repository;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array An array of messages returned by migrations / seeders. Returned at the end of the update process.
|
|
||||||
*/
|
|
||||||
protected $messages = [];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize this singleton.
|
* Initialize this singleton.
|
||||||
*/
|
*/
|
||||||
|
|
@ -167,9 +167,6 @@ class UpdateManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print messages returned by migrations / seeders
|
|
||||||
$this->printMessages();
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -348,13 +345,13 @@ class UpdateManager
|
||||||
/*
|
/*
|
||||||
* Rollback modules
|
* Rollback modules
|
||||||
*/
|
*/
|
||||||
if (isset($this->notesOutput)) {
|
|
||||||
$this->migrator->setOutput($this->notesOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
$rolledBack = $this->migrator->rollback($paths, ['pretend' => false]);
|
$rolledBack = $this->migrator->rollback($paths, ['pretend' => false]);
|
||||||
|
|
||||||
|
foreach ($this->migrator->getNotes() as $note) {
|
||||||
|
$this->note($note);
|
||||||
|
}
|
||||||
|
|
||||||
if (count($rolledBack) == 0) {
|
if (count($rolledBack) == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -366,41 +363,23 @@ class UpdateManager
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines build number from source manifest.
|
* Asks the gateway for the lastest build number and stores it.
|
||||||
*
|
|
||||||
* This will return an array with the following information:
|
|
||||||
* - `build`: The build number we determined was most likely the build installed.
|
|
||||||
* - `modified`: Whether we detected any modifications between the installed build and the manifest.
|
|
||||||
* - `confident`: Whether we are at least 60% sure that this is the installed build. More modifications to
|
|
||||||
* to the code = less confidence.
|
|
||||||
* - `changes`: If $detailed is true, this will include the list of files modified, created and deleted.
|
|
||||||
*
|
|
||||||
* @param bool $detailed If true, the list of files modified, added and deleted will be included in the result.
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getBuildNumberManually($detailed = false)
|
|
||||||
{
|
|
||||||
$source = new SourceManifest();
|
|
||||||
$manifest = new FileManifest(null, null, true);
|
|
||||||
|
|
||||||
// Find build by comparing with source manifest
|
|
||||||
return $source->compare($manifest, $detailed);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the build number in the database.
|
|
||||||
*
|
|
||||||
* @param bool $detailed If true, the list of files modified, added and deleted will be included in the result.
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setBuildNumberManually($detailed = false)
|
public function setBuildNumberManually()
|
||||||
{
|
{
|
||||||
$build = $this->getBuildNumberManually($detailed);
|
$postData = [];
|
||||||
|
|
||||||
if ($build['confident']) {
|
if (Config::get('cms.edgeUpdates', false)) {
|
||||||
$this->setBuild($build['build'], null, $build['modified']);
|
$postData['edge'] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$result = $this->requestServerData('ping', $postData);
|
||||||
|
|
||||||
|
$build = (int) array_get($result, 'pong', 420);
|
||||||
|
|
||||||
|
$this->setBuild($build);
|
||||||
|
|
||||||
return $build;
|
return $build;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -424,13 +403,13 @@ class UpdateManager
|
||||||
*/
|
*/
|
||||||
public function migrateModule($module)
|
public function migrateModule($module)
|
||||||
{
|
{
|
||||||
if (isset($this->notesOutput)) {
|
$this->migrator->run(base_path() . '/modules/' . strtolower($module) . '/database/migrations');
|
||||||
$this->migrator->setOutput($this->notesOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->note($module);
|
$this->note($module);
|
||||||
|
|
||||||
$this->migrator->run(base_path() . '/modules/'.strtolower($module).'/database/migrations');
|
foreach ($this->migrator->getNotes() as $note) {
|
||||||
|
$this->note(' - ' . $note);
|
||||||
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
@ -448,11 +427,7 @@ class UpdateManager
|
||||||
}
|
}
|
||||||
|
|
||||||
$seeder = App::make($className);
|
$seeder = App::make($className);
|
||||||
$return = $seeder->run();
|
$seeder->run();
|
||||||
|
|
||||||
if (isset($return) && (is_string($return) || is_array($return))) {
|
|
||||||
$this->addMessage($className, $return);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->note(sprintf('<info>Seeded %s</info> ', $module));
|
$this->note(sprintf('<info>Seeded %s</info> ', $module));
|
||||||
return $this;
|
return $this;
|
||||||
|
|
@ -487,14 +462,12 @@ class UpdateManager
|
||||||
* Sets the build number and hash
|
* Sets the build number and hash
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @param string $build
|
* @param string $build
|
||||||
* @param bool $modified
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setBuild($build, $hash = null, $modified = false)
|
public function setBuild($build, $hash = null)
|
||||||
{
|
{
|
||||||
$params = [
|
$params = [
|
||||||
'system::core.build' => $build,
|
'system::core.build' => $build
|
||||||
'system::core.modified' => $modified,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
if ($hash) {
|
if ($hash) {
|
||||||
|
|
@ -545,9 +518,13 @@ class UpdateManager
|
||||||
|
|
||||||
$this->note($name);
|
$this->note($name);
|
||||||
|
|
||||||
$this->versionManager->setNotesOutput($this->notesOutput);
|
$this->versionManager->resetNotes()->setNotesOutput($this->notesOutput);
|
||||||
|
|
||||||
$this->versionManager->updatePlugin($plugin);
|
if ($this->versionManager->updatePlugin($plugin) !== false) {
|
||||||
|
foreach ($this->versionManager->getNotes() as $note) {
|
||||||
|
$this->note($note);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
@ -736,8 +713,7 @@ class UpdateManager
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = $this->requestServerData($type . '/popular');
|
$data = $this->requestServerData($type . '/popular');
|
||||||
$expiresAt = now()->addMinutes(60);
|
Cache::put($cacheKey, base64_encode(serialize($data)), 60);
|
||||||
Cache::put($cacheKey, base64_encode(serialize($data)), $expiresAt);
|
|
||||||
|
|
||||||
foreach ($data as $product) {
|
foreach ($data as $product) {
|
||||||
$code = array_get($product, 'code', -1);
|
$code = array_get($product, 'code', -1);
|
||||||
|
|
@ -826,11 +802,35 @@ class UpdateManager
|
||||||
{
|
{
|
||||||
if ($this->notesOutput !== null) {
|
if ($this->notesOutput !== null) {
|
||||||
$this->notesOutput->writeln($message);
|
$this->notesOutput->writeln($message);
|
||||||
|
} else {
|
||||||
|
$this->notes[] = $message;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the notes for the last operation.
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getNotes()
|
||||||
|
{
|
||||||
|
return $this->notes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the notes store.
|
||||||
|
* @return self
|
||||||
|
*/
|
||||||
|
public function resetNotes()
|
||||||
|
{
|
||||||
|
$this->notesOutput = null;
|
||||||
|
|
||||||
|
$this->notes = [];
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an output stream for writing notes.
|
* Sets an output stream for writing notes.
|
||||||
* @param Illuminate\Console\Command $output
|
* @param Illuminate\Console\Command $output
|
||||||
|
|
@ -1015,50 +1015,4 @@ class UpdateManager
|
||||||
{
|
{
|
||||||
return Config::get('database.migrations', 'migrations');
|
return Config::get('database.migrations', 'migrations');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a message from a specific migration or seeder.
|
|
||||||
*
|
|
||||||
* @param string|object $class
|
|
||||||
* @param string|array $message
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function addMessage($class, $message)
|
|
||||||
{
|
|
||||||
if (is_object($class)) {
|
|
||||||
$class = get_class($class);
|
|
||||||
}
|
|
||||||
if (!isset($this->messages[$class])) {
|
|
||||||
$this->messages[$class] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_string($message)) {
|
|
||||||
$this->messages[$class][] = $message;
|
|
||||||
} else if (is_array($message)) {
|
|
||||||
array_merge($this->messages[$class], $message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prints collated messages from the migrations and seeders
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function printMessages()
|
|
||||||
{
|
|
||||||
if (!count($this->messages)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a line break
|
|
||||||
$this->note('');
|
|
||||||
|
|
||||||
foreach ($this->messages as $class => $messages) {
|
|
||||||
$this->note(sprintf('<info>%s reported:</info>', $class));
|
|
||||||
|
|
||||||
foreach ($messages as $message) {
|
|
||||||
$this->note(' - ' . (string) $message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,12 @@ class VersionManager
|
||||||
const HISTORY_TYPE_COMMENT = 'comment';
|
const HISTORY_TYPE_COMMENT = 'comment';
|
||||||
const HISTORY_TYPE_SCRIPT = 'script';
|
const HISTORY_TYPE_SCRIPT = 'script';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The notes for the current operation.
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $notes = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Illuminate\Console\OutputStyle
|
* @var \Illuminate\Console\OutputStyle
|
||||||
*/
|
*/
|
||||||
|
|
@ -420,7 +426,6 @@ class VersionManager
|
||||||
* Execute the database PHP script
|
* Execute the database PHP script
|
||||||
*/
|
*/
|
||||||
$updateFile = $this->pluginManager->getPluginPath($code) . '/updates/' . $script;
|
$updateFile = $this->pluginManager->getPluginPath($code) . '/updates/' . $script;
|
||||||
|
|
||||||
$this->updater->packDown($updateFile);
|
$this->updater->packDown($updateFile);
|
||||||
|
|
||||||
Db::table('system_plugin_history')
|
Db::table('system_plugin_history')
|
||||||
|
|
@ -503,11 +508,35 @@ class VersionManager
|
||||||
{
|
{
|
||||||
if ($this->notesOutput !== null) {
|
if ($this->notesOutput !== null) {
|
||||||
$this->notesOutput->writeln($message);
|
$this->notesOutput->writeln($message);
|
||||||
|
} else {
|
||||||
|
$this->notes[] = $message;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the notes for the last operation.
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getNotes()
|
||||||
|
{
|
||||||
|
return $this->notes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the notes store.
|
||||||
|
* @return self
|
||||||
|
*/
|
||||||
|
public function resetNotes()
|
||||||
|
{
|
||||||
|
$this->notesOutput = null;
|
||||||
|
|
||||||
|
$this->notes = [];
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an output stream for writing notes.
|
* Sets an output stream for writing notes.
|
||||||
* @param Illuminate\Console\Command $output
|
* @param Illuminate\Console\Command $output
|
||||||
|
|
@ -521,7 +550,8 @@ class VersionManager
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extract script and comments from version details
|
* @param $details
|
||||||
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
protected function extractScriptsAndComments($details): array
|
protected function extractScriptsAndComments($details): array
|
||||||
|
|
@ -536,8 +566,7 @@ class VersionManager
|
||||||
$scripts = array_values(array_filter($details, function ($detail) use ($fileNamePattern) {
|
$scripts = array_values(array_filter($details, function ($detail) use ($fileNamePattern) {
|
||||||
return preg_match($fileNamePattern, $detail);
|
return preg_match($fileNamePattern, $detail);
|
||||||
}));
|
}));
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
$comments = (array)$details;
|
$comments = (array)$details;
|
||||||
$scripts = [];
|
$scripts = [];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,11 @@
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "Alexey Bobkov",
|
"name": "Alexey Bobkov",
|
||||||
"email": "aleksey.bobkov@gmail.com",
|
"email": "aleksey.bobkov@gmail.com"
|
||||||
"role": "Co-founder"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Samuel Georges",
|
"name": "Samuel Georges",
|
||||||
"email": "daftspunky@gmail.com",
|
"email": "daftspunky@gmail.com"
|
||||||
"role": "Co-founder"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Luke Towers",
|
"name": "Luke Towers",
|
||||||
|
|
@ -24,10 +22,9 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.2",
|
"php": ">=7.0",
|
||||||
"composer/installers": "~1.0",
|
"composer/installers": "~1.0",
|
||||||
"october/rain": "~1.1.0",
|
"october/rain": "~1.0.469"
|
||||||
"laravel/framework": "~6.0"
|
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
<?php namespace System\Console;
|
<?php namespace System\Console;
|
||||||
|
|
||||||
use App;
|
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -328,7 +327,7 @@ class OctoberEnv extends Command
|
||||||
*/
|
*/
|
||||||
protected function writeToConfigFile($content)
|
protected function writeToConfigFile($content)
|
||||||
{
|
{
|
||||||
file_put_contents(rtrim(App::make('path.config'), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $this->config . '.php', $content);
|
file_put_contents(config_path($this->config . '.php'), $content);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -336,7 +335,7 @@ class OctoberEnv extends Command
|
||||||
*/
|
*/
|
||||||
protected function lines()
|
protected function lines()
|
||||||
{
|
{
|
||||||
return file(rtrim(App::make('path.config'), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $this->config . '.php');
|
return file(config_path($this->config . '.php'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -370,7 +369,7 @@ class OctoberEnv extends Command
|
||||||
'SESSION_DRIVER' => 'driver',
|
'SESSION_DRIVER' => 'driver',
|
||||||
],
|
],
|
||||||
'queue' => [
|
'queue' => [
|
||||||
'QUEUE_CONNECTION' => 'default',
|
'QUEUE_DRIVER' => 'default',
|
||||||
],
|
],
|
||||||
'mail' => [
|
'mail' => [
|
||||||
'MAIL_DRIVER' => 'driver',
|
'MAIL_DRIVER' => 'driver',
|
||||||
|
|
|
||||||
|
|
@ -36,29 +36,16 @@ class OctoberFresh extends Command
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$themeRemoved = false;
|
|
||||||
$pluginRemoved = false;
|
|
||||||
|
|
||||||
$demoThemePath = themes_path().'/demo';
|
$demoThemePath = themes_path().'/demo';
|
||||||
|
|
||||||
if (File::exists($demoThemePath)) {
|
if (File::exists($demoThemePath)) {
|
||||||
File::deleteDirectory($demoThemePath);
|
|
||||||
$themeRemoved = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$demoPluginPath = plugins_path().'/october/demo';
|
|
||||||
if (File::exists($demoPluginPath)) {
|
|
||||||
Artisan::call('plugin:remove', ['name' => 'October.Demo', '--force' => true]);
|
Artisan::call('plugin:remove', ['name' => 'October.Demo', '--force' => true]);
|
||||||
$pluginRemoved = true;
|
File::deleteDirectory($demoThemePath);
|
||||||
}
|
|
||||||
|
|
||||||
if ($themeRemoved && $pluginRemoved) {
|
$this->info('Demo has been removed! Enjoy a fresh start.');
|
||||||
$this->info('Demo theme and plugin have been removed! Enjoy a fresh start.');
|
}
|
||||||
} elseif ($themeRemoved) {
|
else {
|
||||||
$this->info('Demo theme has been removed! Enjoy a fresh start.');
|
$this->error('Demo theme is already removed.');
|
||||||
} elseif ($pluginRemoved) {
|
|
||||||
$this->info('Demo plugin has been removed! Enjoy a fresh start.');
|
|
||||||
} else {
|
|
||||||
$this->info('Demo theme and plugin have already been removed.');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,6 @@ class OctoberMirror extends Command
|
||||||
protected $directories = [
|
protected $directories = [
|
||||||
'storage/app/uploads/public',
|
'storage/app/uploads/public',
|
||||||
'storage/app/media',
|
'storage/app/media',
|
||||||
'storage/app/resized',
|
|
||||||
'storage/temp/public',
|
'storage/temp/public',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ use Symfony\Component\Console\Input\InputOption;
|
||||||
*/
|
*/
|
||||||
class OctoberUpdate extends Command
|
class OctoberUpdate extends Command
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The console command name.
|
* The console command name.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<?php namespace System\Console;
|
<?php namespace System\Console;
|
||||||
|
|
||||||
|
use App;
|
||||||
use Lang;
|
use Lang;
|
||||||
use File;
|
use File;
|
||||||
use Config;
|
use Config;
|
||||||
|
|
@ -8,8 +9,8 @@ use Symfony\Component\Console\Input\InputOption;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use System\Classes\UpdateManager;
|
use System\Classes\UpdateManager;
|
||||||
use System\Classes\CombineAssets;
|
use System\Classes\CombineAssets;
|
||||||
|
use Exception;
|
||||||
use System\Models\Parameter;
|
use System\Models\Parameter;
|
||||||
use System\Models\File as FileModel;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Console command for other utility commands.
|
* Console command for other utility commands.
|
||||||
|
|
@ -26,6 +27,7 @@ use System\Models\File as FileModel;
|
||||||
* - compile less: Compile registered LESS files only.
|
* - compile less: Compile registered LESS files only.
|
||||||
* - compile scss: Compile registered SCSS files only.
|
* - compile scss: Compile registered SCSS files only.
|
||||||
* - compile lang: Compile registered Language files only.
|
* - compile lang: Compile registered Language files only.
|
||||||
|
* - set build: Pull the latest stable build number from the update gateway and set it as the current build number.
|
||||||
* - set project --projectId=<id>: Set the projectId for this october instance.
|
* - set project --projectId=<id>: Set the projectId for this october instance.
|
||||||
*
|
*
|
||||||
* @package october\system
|
* @package october\system
|
||||||
|
|
@ -108,10 +110,31 @@ class OctoberUtil extends Command
|
||||||
|
|
||||||
protected function utilSetBuild()
|
protected function utilSetBuild()
|
||||||
{
|
{
|
||||||
$this->comment('NOTE: This command is now deprecated. Please use "php artisan october:version" instead.');
|
$this->comment('-');
|
||||||
$this->comment('');
|
|
||||||
|
|
||||||
return $this->call('october:version');
|
/*
|
||||||
|
* Skip setting the build number if no database is detected to set it within
|
||||||
|
*/
|
||||||
|
if (!App::hasDatabase()) {
|
||||||
|
$this->comment('No database detected - skipping setting the build number.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$build = UpdateManager::instance()->setBuildNumberManually();
|
||||||
|
$this->comment('*** October sets build: '.$build);
|
||||||
|
}
|
||||||
|
catch (Exception $ex) {
|
||||||
|
$this->comment('*** You were kicked from #october by Ex: ('.$ex->getMessage().')');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->comment('-');
|
||||||
|
sleep(1);
|
||||||
|
$this->comment('Ping? Pong!');
|
||||||
|
$this->comment('-');
|
||||||
|
sleep(1);
|
||||||
|
$this->comment('Ping? Pong!');
|
||||||
|
$this->comment('-');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function utilCompileJs()
|
protected function utilCompileJs()
|
||||||
|
|
@ -271,66 +294,7 @@ class OctoberUtil extends Command
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$uploadsDisk = Config::get('cms.storage.uploads.disk', 'local');
|
// @todo
|
||||||
if ($uploadsDisk !== 'local') {
|
|
||||||
$this->error("Purging uploads is only supported on the 'local' disk, current uploads disk is $uploadsDisk");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$totalCount = 0;
|
|
||||||
$validFiles = FileModel::pluck('disk_name')->all();
|
|
||||||
$uploadsPath = Config::get('filesystems.disks.local.root', storage_path('app')) . '/' . Config::get('cms.storage.uploads.folder', 'uploads');
|
|
||||||
|
|
||||||
// Recursive function to scan the directory for files and ensure they exist in system_files.
|
|
||||||
$purgeFunc = function ($targetDir) use (&$purgeFunc, &$totalCount, $uploadsPath, $validFiles) {
|
|
||||||
if ($files = File::glob($targetDir.'/*')) {
|
|
||||||
if ($dirs = File::directories($targetDir)) {
|
|
||||||
foreach ($dirs as $dir) {
|
|
||||||
$purgeFunc($dir);
|
|
||||||
|
|
||||||
if (File::isDirectoryEmpty($dir) && is_writeable($dir)) {
|
|
||||||
rmdir($dir);
|
|
||||||
$this->info('Removed folder: '. str_replace($uploadsPath, '', $dir));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($files as $file) {
|
|
||||||
if (!is_file($file)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip .gitignore files
|
|
||||||
if ($file === '.gitignore') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip files unable to be purged
|
|
||||||
if (!is_writeable($file)) {
|
|
||||||
$this->warn('Unable to purge file: ' . str_replace($uploadsPath, '', $file));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip valid files
|
|
||||||
if (in_array(basename($file), $validFiles)) {
|
|
||||||
$this->warn('Skipped file in use: '. str_replace($uploadsPath, '', $file));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
unlink($file);
|
|
||||||
$this->info('Purged: '. str_replace($uploadsPath, '', $file));
|
|
||||||
$totalCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$purgeFunc($uploadsPath);
|
|
||||||
|
|
||||||
if ($totalCount > 0) {
|
|
||||||
$this->comment(sprintf('Successfully deleted %d invalid file(s), leaving %d valid files', $totalCount, count($validFiles)));
|
|
||||||
} else {
|
|
||||||
$this->comment('No files found to purge.');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function utilPurgeOrphans()
|
protected function utilPurgeOrphans()
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ class ThemeSync extends Command
|
||||||
|
|
||||||
foreach ($userPaths as $userPath) {
|
foreach ($userPaths as $userPath) {
|
||||||
foreach ($themePaths as $themePath) {
|
foreach ($themePaths as $themePath) {
|
||||||
$pregMatch = '/^' . str_replace('/', '\/', $userPath) . '/i';
|
$pregMatch = '/' . str_replace('/', '\/', $userPath) . '/i';
|
||||||
|
|
||||||
if ($userPath === $themePath || preg_match($pregMatch, $themePath)) {
|
if ($userPath === $themePath || preg_match($pregMatch, $themePath)) {
|
||||||
$paths[] = $themePath;
|
$paths[] = $themePath;
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
use Lang;
|
use Lang;
|
||||||
use Flash;
|
use Flash;
|
||||||
use Config;
|
|
||||||
use Request;
|
|
||||||
use Backend;
|
use Backend;
|
||||||
use BackendMenu;
|
use BackendMenu;
|
||||||
use System\Classes\SettingsManager;
|
use System\Classes\SettingsManager;
|
||||||
|
|
@ -141,22 +139,6 @@ class Settings extends Controller
|
||||||
return $this->formWidget->render($options);
|
return $this->formWidget->render($options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the form widget used by this behavior.
|
|
||||||
*
|
|
||||||
* @return \Backend\Widgets\Form
|
|
||||||
*/
|
|
||||||
public function formGetWidget()
|
|
||||||
{
|
|
||||||
if (is_null($this->formWidget)) {
|
|
||||||
$item = $this->findSettingItem();
|
|
||||||
$model = $this->createModel($item);
|
|
||||||
$this->initWidgets($model);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->formWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepare the widgets used by this action
|
* Prepare the widgets used by this action
|
||||||
* Model $model
|
* Model $model
|
||||||
|
|
@ -187,22 +169,10 @@ class Settings extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Locates a setting item for a module or plugin.
|
* Locates a setting item for a module or plugin
|
||||||
*
|
|
||||||
* If none of the parameters are provided, they will be auto-guessed from the URL.
|
|
||||||
*
|
|
||||||
* @param string|null $author
|
|
||||||
* @param string|null $plugin
|
|
||||||
* @param string|null $code
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
*/
|
||||||
protected function findSettingItem($author = null, $plugin = null, $code = null)
|
protected function findSettingItem($author, $plugin, $code)
|
||||||
{
|
{
|
||||||
if (is_null($author) || is_null($plugin)) {
|
|
||||||
[$author, $plugin, $code] = $this->guessSettingItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
$manager = SettingsManager::instance();
|
$manager = SettingsManager::instance();
|
||||||
|
|
||||||
$moduleOwner = $author;
|
$moduleOwner = $author;
|
||||||
|
|
@ -217,23 +187,4 @@ class Settings extends Controller
|
||||||
|
|
||||||
return $item;
|
return $item;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Guesses the requested setting item from the current URL segments provided by the Request object.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function guessSettingItem()
|
|
||||||
{
|
|
||||||
$segments = Request::segments();
|
|
||||||
|
|
||||||
if (!empty(Config::get('cms.backendUri', 'backend'))) {
|
|
||||||
array_splice($segments, 0, 4);
|
|
||||||
} else {
|
|
||||||
array_splice($segments, 0, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure there's at least 3 segments
|
|
||||||
return array_pad($segments, 3, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,6 @@ class Updates extends Controller
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$this->vars['coreBuild'] = Parameter::get('system::core.build');
|
$this->vars['coreBuild'] = Parameter::get('system::core.build');
|
||||||
$this->vars['coreBuildModified'] = Parameter::get('system::core.modified', false);
|
|
||||||
$this->vars['projectId'] = Parameter::get('system::project.id');
|
$this->vars['projectId'] = Parameter::get('system::project.id');
|
||||||
$this->vars['projectName'] = Parameter::get('system::project.name');
|
$this->vars['projectName'] = Parameter::get('system::project.name');
|
||||||
$this->vars['projectOwner'] = Parameter::get('system::project.owner');
|
$this->vars['projectOwner'] = Parameter::get('system::project.owner');
|
||||||
|
|
@ -450,15 +449,12 @@ class Updates extends Controller
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contacts the update server for a list of necessary updates.
|
* Contacts the update server for a list of necessary updates.
|
||||||
*
|
|
||||||
* @param bool $force Whether or not to force the redownload of existing tools
|
|
||||||
* @return string The rendered "execute" partial
|
|
||||||
*/
|
*/
|
||||||
public function onForceUpdate($force = true)
|
public function onForceUpdate()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$manager = UpdateManager::instance();
|
$manager = UpdateManager::instance();
|
||||||
$result = $manager->requestUpdateList($force);
|
$result = $manager->requestUpdateList(true);
|
||||||
|
|
||||||
$coreHash = array_get($result, 'core.hash', false);
|
$coreHash = array_get($result, 'core.hash', false);
|
||||||
$coreBuild = array_get($result, 'core.build', false);
|
$coreBuild = array_get($result, 'core.build', false);
|
||||||
|
|
@ -709,7 +705,7 @@ class Updates extends Controller
|
||||||
'system::project.owner' => $result['owner'],
|
'system::project.owner' => $result['owner'],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return $this->onForceUpdate(false);
|
return $this->onForceUpdate();
|
||||||
}
|
}
|
||||||
catch (Exception $ex) {
|
catch (Exception $ex) {
|
||||||
$this->handleError($ex);
|
$this->handleError($ex);
|
||||||
|
|
@ -881,7 +877,7 @@ class Updates extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
Flash::success(Lang::get("system::lang.plugins.{$bulkAction}_success"));
|
Flash::success(Lang::get("system::lang.plugins.{$bulkAction}_success"));
|
||||||
return redirect()->refresh();
|
return $this->listRefresh('manage');
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
data-request="onSave"
|
data-request="onSave"
|
||||||
|
data-browser-validate
|
||||||
data-request-data="redirect:0"
|
data-request-data="redirect:0"
|
||||||
data-hotkey="ctrl+s, cmd+s"
|
data-hotkey="ctrl+s, cmd+s"
|
||||||
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
||||||
|
|
@ -20,6 +21,7 @@
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
data-request="onSave"
|
data-request="onSave"
|
||||||
|
data-browser-validate
|
||||||
data-request-data="close:1"
|
data-request-data="close:1"
|
||||||
data-hotkey="ctrl+enter, cmd+enter"
|
data-hotkey="ctrl+enter, cmd+enter"
|
||||||
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
||||||
|
|
|
||||||
|
|
@ -6,16 +6,16 @@
|
||||||
data-handler="onLoadUpdates">
|
data-handler="onLoadUpdates">
|
||||||
<?= e(trans('system::lang.updates.check_label')) ?>
|
<?= e(trans('system::lang.updates.check_label')) ?>
|
||||||
</a>
|
</a>
|
||||||
<a
|
|
||||||
href="<?= Backend::url('system/updates/install') ?>"
|
|
||||||
class="btn btn-success oc-icon-plus">
|
|
||||||
<?= e(trans('system::lang.plugins.install')) ?>
|
|
||||||
</a>
|
|
||||||
<a
|
<a
|
||||||
href="<?= Backend::url('system/updates/install/themes') ?>"
|
href="<?= Backend::url('system/updates/install/themes') ?>"
|
||||||
class="btn btn-success oc-icon-plus">
|
class="btn btn-success oc-icon-plus">
|
||||||
<?= e(trans('system::lang.themes.install')) ?>
|
<?= e(trans('system::lang.themes.install')) ?>
|
||||||
</a>
|
</a>
|
||||||
|
<a
|
||||||
|
href="<?= Backend::url('system/updates/install') ?>"
|
||||||
|
class="btn btn-success oc-icon-plus">
|
||||||
|
<?= e(trans('system::lang.plugins.install')) ?>
|
||||||
|
</a>
|
||||||
<a
|
<a
|
||||||
href="<?= Backend::url('system/updates/manage') ?>"
|
href="<?= Backend::url('system/updates/manage') ?>"
|
||||||
class="btn btn-default oc-icon-puzzle-piece">
|
class="btn btn-default oc-icon-puzzle-piece">
|
||||||
|
|
|
||||||
|
|
@ -34,19 +34,7 @@
|
||||||
<?php if ($coreBuild): ?>
|
<?php if ($coreBuild): ?>
|
||||||
<div class="scoreboard-item title-value">
|
<div class="scoreboard-item title-value">
|
||||||
<h4><?= e(trans('system::lang.updates.core_current_build')) ?></h4>
|
<h4><?= e(trans('system::lang.updates.core_current_build')) ?></h4>
|
||||||
<?php if ($coreBuildModified): ?>
|
|
||||||
<p
|
|
||||||
class="oc-icon-exclamation-circle"
|
|
||||||
data-toggle="tooltip"
|
|
||||||
data-placement="bottom"
|
|
||||||
title="This build has been modified"
|
|
||||||
>
|
|
||||||
<?= $coreBuild ?>
|
|
||||||
</p>
|
|
||||||
<?php else: ?>
|
|
||||||
<p><?= $coreBuild ?></p>
|
<p><?= $coreBuild ?></p>
|
||||||
<?php endif; ?>
|
|
||||||
|
|
||||||
<p class="description">
|
<p class="description">
|
||||||
<a
|
<a
|
||||||
href="javascript:;"
|
href="javascript:;"
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ class DatabaseSeeder extends Seeder
|
||||||
*/
|
*/
|
||||||
public function run()
|
public function run()
|
||||||
{
|
{
|
||||||
Eloquent::unguarded(function () {
|
Eloquent::unguard();
|
||||||
|
|
||||||
$this->call('System\Database\Seeds\SeedSetupMailLayouts');
|
$this->call('System\Database\Seeds\SeedSetupMailLayouts');
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -441,8 +441,7 @@ return [
|
||||||
'manage_other_administrators' => 'Manage other administrators',
|
'manage_other_administrators' => 'Manage other administrators',
|
||||||
'impersonate_users' => 'Impersonate users',
|
'impersonate_users' => 'Impersonate users',
|
||||||
'manage_preferences' => 'Manage backend preferences',
|
'manage_preferences' => 'Manage backend preferences',
|
||||||
'manage_editor' => 'Manage global code editor preferences',
|
'manage_editor' => 'Manage code editor preferences',
|
||||||
'manage_own_editor' => 'Manage personal code editor preferences',
|
|
||||||
'view_the_dashboard' => 'View the dashboard',
|
'view_the_dashboard' => 'View the dashboard',
|
||||||
'manage_default_dashboard' => 'Manage the default dashboard',
|
'manage_default_dashboard' => 'Manage the default dashboard',
|
||||||
'manage_branding' => 'Customize the back-end',
|
'manage_branding' => 'Customize the back-end',
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,6 @@ return [
|
||||||
'boolean' => 'The :attribute field must be true or false.',
|
'boolean' => 'The :attribute field must be true or false.',
|
||||||
'confirmed' => 'The :attribute confirmation does not match.',
|
'confirmed' => 'The :attribute confirmation does not match.',
|
||||||
'date' => 'The :attribute is not a valid date.',
|
'date' => 'The :attribute is not a valid date.',
|
||||||
'date_equals' => 'The :attribute must be a date equal to :date.',
|
|
||||||
'date_format' => 'The :attribute does not match the format :format.',
|
'date_format' => 'The :attribute does not match the format :format.',
|
||||||
'different' => 'The :attribute and :other must be different.',
|
'different' => 'The :attribute and :other must be different.',
|
||||||
'digits' => 'The :attribute must be :digits digits.',
|
'digits' => 'The :attribute must be :digits digits.',
|
||||||
|
|
@ -40,22 +39,9 @@ return [
|
||||||
'dimensions' => 'The :attribute has invalid image dimensions.',
|
'dimensions' => 'The :attribute has invalid image dimensions.',
|
||||||
'distinct' => 'The :attribute field has a duplicate value.',
|
'distinct' => 'The :attribute field has a duplicate value.',
|
||||||
'email' => 'The :attribute must be a valid email address.',
|
'email' => 'The :attribute must be a valid email address.',
|
||||||
'ends_with' => 'The :attribute must end with one of the following: :values.',
|
|
||||||
'exists' => 'The selected :attribute is invalid.',
|
'exists' => 'The selected :attribute is invalid.',
|
||||||
'file' => 'The :attribute must be a file.',
|
'file' => 'The :attribute must be a file.',
|
||||||
'filled' => 'The :attribute field must have a value.',
|
'filled' => 'The :attribute field must have a value.',
|
||||||
'gt' => [
|
|
||||||
'numeric' => 'The :attribute must be greater than :value.',
|
|
||||||
'file' => 'The :attribute must be greater than :value kilobytes.',
|
|
||||||
'string' => 'The :attribute must be greater than :value characters.',
|
|
||||||
'array' => 'The :attribute must have more than :value items.',
|
|
||||||
],
|
|
||||||
'gte' => [
|
|
||||||
'numeric' => 'The :attribute must be greater than or equal :value.',
|
|
||||||
'file' => 'The :attribute must be greater than or equal :value kilobytes.',
|
|
||||||
'string' => 'The :attribute must be greater than or equal :value characters.',
|
|
||||||
'array' => 'The :attribute must have :value items or more.',
|
|
||||||
],
|
|
||||||
'image' => 'The :attribute must be an image.',
|
'image' => 'The :attribute must be an image.',
|
||||||
'in' => 'The selected :attribute is invalid.',
|
'in' => 'The selected :attribute is invalid.',
|
||||||
'in_array' => 'The :attribute field does not exist in :other.',
|
'in_array' => 'The :attribute field does not exist in :other.',
|
||||||
|
|
@ -64,18 +50,6 @@ return [
|
||||||
'ipv4' => 'The :attribute must be a valid IPv4 address.',
|
'ipv4' => 'The :attribute must be a valid IPv4 address.',
|
||||||
'ipv6' => 'The :attribute must be a valid IPv6 address.',
|
'ipv6' => 'The :attribute must be a valid IPv6 address.',
|
||||||
'json' => 'The :attribute must be a valid JSON string.',
|
'json' => 'The :attribute must be a valid JSON string.',
|
||||||
'lt' => [
|
|
||||||
'numeric' => 'The :attribute must be less than :value.',
|
|
||||||
'file' => 'The :attribute must be less than :value kilobytes.',
|
|
||||||
'string' => 'The :attribute must be less than :value characters.',
|
|
||||||
'array' => 'The :attribute must have less than :value items.',
|
|
||||||
],
|
|
||||||
'lte' => [
|
|
||||||
'numeric' => 'The :attribute must be less than or equal :value.',
|
|
||||||
'file' => 'The :attribute must be less than or equal :value kilobytes.',
|
|
||||||
'string' => 'The :attribute must be less than or equal :value characters.',
|
|
||||||
'array' => 'The :attribute must not have more than :value items.',
|
|
||||||
],
|
|
||||||
'max' => [
|
'max' => [
|
||||||
'numeric' => 'The :attribute may not be greater than :max.',
|
'numeric' => 'The :attribute may not be greater than :max.',
|
||||||
'file' => 'The :attribute may not be greater than :max kilobytes.',
|
'file' => 'The :attribute may not be greater than :max kilobytes.',
|
||||||
|
|
@ -91,7 +65,6 @@ return [
|
||||||
'array' => 'The :attribute must have at least :min items.',
|
'array' => 'The :attribute must have at least :min items.',
|
||||||
],
|
],
|
||||||
'not_in' => 'The selected :attribute is invalid.',
|
'not_in' => 'The selected :attribute is invalid.',
|
||||||
'not_regex' => 'The :attribute format is invalid.',
|
|
||||||
'numeric' => 'The :attribute must be a number.',
|
'numeric' => 'The :attribute must be a number.',
|
||||||
'present' => 'The :attribute field must be present.',
|
'present' => 'The :attribute field must be present.',
|
||||||
'regex' => 'The :attribute format is invalid.',
|
'regex' => 'The :attribute format is invalid.',
|
||||||
|
|
@ -109,13 +82,11 @@ return [
|
||||||
'string' => 'The :attribute must be :size characters.',
|
'string' => 'The :attribute must be :size characters.',
|
||||||
'array' => 'The :attribute must contain :size items.',
|
'array' => 'The :attribute must contain :size items.',
|
||||||
],
|
],
|
||||||
'starts_with' => 'The :attribute must start with one of the following: :values.',
|
|
||||||
'string' => 'The :attribute must be a string.',
|
'string' => 'The :attribute must be a string.',
|
||||||
'timezone' => 'The :attribute must be a valid zone.',
|
'timezone' => 'The :attribute must be a valid zone.',
|
||||||
'unique' => 'The :attribute has already been taken.',
|
'unique' => 'The :attribute has already been taken.',
|
||||||
'uploaded' => 'The :attribute failed to upload.',
|
'uploaded' => 'The :attribute failed to upload.',
|
||||||
'url' => 'The :attribute format is invalid.',
|
'url' => 'The :attribute format is invalid.',
|
||||||
'uuid' => 'The :attribute must be a valid UUID.',
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ return [
|
||||||
'fullscreen' => 'Pantalla completa',
|
'fullscreen' => 'Pantalla completa',
|
||||||
'preview' => 'Previsualizar'
|
'preview' => 'Previsualizar'
|
||||||
],
|
],
|
||||||
|
|
||||||
'mediamanager' => [
|
'mediamanager' => [
|
||||||
'insert_link' => "Insertar Media Vínculo",
|
'insert_link' => "Insertar Media Vínculo",
|
||||||
'insert_image' => "Insertar Media Imagen",
|
'insert_image' => "Insertar Media Imagen",
|
||||||
|
|
@ -44,10 +45,12 @@ return [
|
||||||
'invalid_video_empty_insert' => "Por favor seleccione un archivo de video para insertar.",
|
'invalid_video_empty_insert' => "Por favor seleccione un archivo de video para insertar.",
|
||||||
'invalid_audio_empty_insert' => "Por favor seleccione un archivo de audio para insertar.",
|
'invalid_audio_empty_insert' => "Por favor seleccione un archivo de audio para insertar.",
|
||||||
],
|
],
|
||||||
|
|
||||||
'alert' => [
|
'alert' => [
|
||||||
'confirm_button_text' => 'OK',
|
'confirm_button_text' => 'OK',
|
||||||
'cancel_button_text' => 'Cancelar'
|
'cancel_button_text' => 'Cancelar'
|
||||||
],
|
],
|
||||||
|
|
||||||
'datepicker' => [
|
'datepicker' => [
|
||||||
'previousMonth' => 'Mes Anterior',
|
'previousMonth' => 'Mes Anterior',
|
||||||
'nextMonth' => 'Mes Siguiente',
|
'nextMonth' => 'Mes Siguiente',
|
||||||
|
|
@ -55,31 +58,21 @@ return [
|
||||||
'weekdays' => ['Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado'],
|
'weekdays' => ['Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado'],
|
||||||
'weekdaysShort' => ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab']
|
'weekdaysShort' => ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab']
|
||||||
],
|
],
|
||||||
|
|
||||||
'filter' => [
|
'filter' => [
|
||||||
'group' => [
|
'group' => [
|
||||||
'all' => 'todos'
|
'all' => 'todos'
|
||||||
],
|
],
|
||||||
'scopes' => [
|
|
||||||
'apply_button_text' => 'Aplicar',
|
|
||||||
'clear_button_text' => 'Limpiar',
|
|
||||||
],
|
|
||||||
'dates' => [
|
'dates' => [
|
||||||
'all' => 'todas',
|
'all' => 'todos',
|
||||||
'filter_button_text' => 'Filtrar',
|
'filter_button_text' => 'Filtro',
|
||||||
'reset_button_text' => 'Restablecer',
|
'reset_button_text' => 'Restablecer',
|
||||||
'date_placeholder' => 'Fecha',
|
'date_placeholder' => 'Fecha',
|
||||||
'after_placeholder' => 'Desde',
|
'after_placeholder' => 'Despues',
|
||||||
'before_placeholder' => 'Hasta'
|
'before_placeholder' => 'Antes'
|
||||||
],
|
]
|
||||||
'numbers' => [
|
|
||||||
'all' => 'todos',
|
|
||||||
'filter_button_text' => 'Filtrar',
|
|
||||||
'reset_button_text' => 'Restablecer',
|
|
||||||
'min_placeholder' => 'Mínimo',
|
|
||||||
'max_placeholder' => 'Máximo',
|
|
||||||
'number_placeholder' => 'Número'
|
|
||||||
],
|
|
||||||
],
|
],
|
||||||
|
|
||||||
'eventlog' => [
|
'eventlog' => [
|
||||||
'show_stacktrace' => 'Mostrar el seguimiento de la pila',
|
'show_stacktrace' => 'Mostrar el seguimiento de la pila',
|
||||||
'hide_stacktrace' => 'Ocultar el seguimiento de la pila',
|
'hide_stacktrace' => 'Ocultar el seguimiento de la pila',
|
||||||
|
|
@ -91,7 +84,7 @@ return [
|
||||||
'title' => 'Seleccione el editor de código fuente a usar',
|
'title' => 'Seleccione el editor de código fuente a usar',
|
||||||
'description' => 'Su entorno de sistema operativo debe estar configurado para escuchar a uno de estos esquemas de URL.',
|
'description' => 'Su entorno de sistema operativo debe estar configurado para escuchar a uno de estos esquemas de URL.',
|
||||||
'openWith' => 'Abrir con',
|
'openWith' => 'Abrir con',
|
||||||
'rememberChoice' => 'Recuerde la opción seleccionada para esta sesión del navegador',
|
'rememberChoice' => 'Recuerde que la opción seleccionada para esta sesión del navegador',
|
||||||
'open' => 'Abrir',
|
'open' => 'Abrir',
|
||||||
'cancel' => 'Cancelar'
|
'cancel' => 'Cancelar'
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ return [
|
||||||
'alpha_num' => 'Le champ :attribute ne peut contenir que des lettres et des chiffres.',
|
'alpha_num' => 'Le champ :attribute ne peut contenir que des lettres et des chiffres.',
|
||||||
'array' => 'Le champ :attribute doit être un groupe.',
|
'array' => 'Le champ :attribute doit être un groupe.',
|
||||||
'before' => 'Le champ :attribute doit être une date avant le :date.',
|
'before' => 'Le champ :attribute doit être une date avant le :date.',
|
||||||
'before_or_equal' => 'Le champ :attribute doit être une date avant le ou égal à :date.',
|
'before_or_equal' => 'LE champ :attribute doit être une date avant le ou égal à :date.',
|
||||||
'between' => [
|
'between' => [
|
||||||
'numeric' => 'Le champ :attribute doit être compris entre :min - :max.',
|
'numeric' => 'Le champ :attribute doit être compris entre :min - :max.',
|
||||||
'file' => 'Le champ :attribute doit être compris entre :min - :max kilooctets.',
|
'file' => 'Le champ :attribute doit être compris entre :min - :max kilooctets.',
|
||||||
|
|
@ -36,8 +36,8 @@ return [
|
||||||
'different' => 'Le champ :attribute et :other doivent être différents.',
|
'different' => 'Le champ :attribute et :other doivent être différents.',
|
||||||
'digits' => 'Le champ :attribute doit être de :digits chiffres.',
|
'digits' => 'Le champ :attribute doit être de :digits chiffres.',
|
||||||
'digits_between' => 'Le champ :attribute doit être compris entre :min et :max chiffres.',
|
'digits_between' => 'Le champ :attribute doit être compris entre :min et :max chiffres.',
|
||||||
'dimensions' => 'Le champ :attribute a des dimensions d’image invalides.',
|
'dimensions' => 'Le cahmp :attribute a des dimensions d’image invalides.',
|
||||||
'distinct' => 'Le champ :attribute a une valeur en double..',
|
'distinct' => 'Le cahmp :attribute a une valeur en double..',
|
||||||
'email' => 'Le format du champ :attribute n’est pas valide.',
|
'email' => 'Le format du champ :attribute n’est pas valide.',
|
||||||
'exists' => 'Le champ :attribute sélectionné n’est pas valide.',
|
'exists' => 'Le champ :attribute sélectionné n’est pas valide.',
|
||||||
'file' => 'Le champ :attribute doit être un fichier.',
|
'file' => 'Le champ :attribute doit être un fichier.',
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ return [
|
||||||
'fullscreen' => 'Schermo intero',
|
'fullscreen' => 'Schermo intero',
|
||||||
'preview' => 'Anteprima',
|
'preview' => 'Anteprima',
|
||||||
],
|
],
|
||||||
|
|
||||||
'mediamanager' => [
|
'mediamanager' => [
|
||||||
'insert_link' => "Inserisci collegamento elemento multimediale",
|
'insert_link' => "Inserisci collegamento elemento multimediale",
|
||||||
'insert_image' => "Inserisci immagine",
|
'insert_image' => "Inserisci immagine",
|
||||||
|
|
@ -44,28 +45,23 @@ return [
|
||||||
'invalid_video_empty_insert' => "Si prega di selezionare un file video da inserire.",
|
'invalid_video_empty_insert' => "Si prega di selezionare un file video da inserire.",
|
||||||
'invalid_audio_empty_insert' => "Si prega di selezionare un file audio da inserire.",
|
'invalid_audio_empty_insert' => "Si prega di selezionare un file audio da inserire.",
|
||||||
],
|
],
|
||||||
|
|
||||||
'alert' => [
|
'alert' => [
|
||||||
'confirm_button_text' => 'OK',
|
'confirm_button_text' => 'OK',
|
||||||
'cancel_button_text' => 'Annulla',
|
'cancel_button_text' => 'Annulla',
|
||||||
'widget_remove_confirm' => 'Rimuovere questo widget?',
|
|
||||||
],
|
],
|
||||||
|
|
||||||
'datepicker' => [
|
'datepicker' => [
|
||||||
'previousMonth' => 'Mese precedente',
|
'previousMonth' => 'Mese precedente',
|
||||||
'nextMonth' => 'Mese successivo',
|
'nextMonth' => 'Mese successivo',
|
||||||
'months' => ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
|
'months' => ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
|
||||||
'weekdays' => ['Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato'],
|
'weekdays' => ['Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato'],
|
||||||
'weekdaysShort' => ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'],
|
'weekdaysShort' => ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab']
|
||||||
],
|
|
||||||
'colorpicker' => [
|
|
||||||
'choose' => 'OK',
|
|
||||||
],
|
],
|
||||||
|
|
||||||
'filter' => [
|
'filter' => [
|
||||||
'group' => [
|
'group' => [
|
||||||
'all' => 'tutti',
|
'all' => 'tutti'
|
||||||
],
|
|
||||||
'scopes' => [
|
|
||||||
'apply_button_text' => 'Applica',
|
|
||||||
'clear_button_text' => 'Rimuovi',
|
|
||||||
],
|
],
|
||||||
'dates' => [
|
'dates' => [
|
||||||
'all' => 'tutte',
|
'all' => 'tutte',
|
||||||
|
|
@ -73,16 +69,10 @@ return [
|
||||||
'reset_button_text' => 'Reimposta',
|
'reset_button_text' => 'Reimposta',
|
||||||
'date_placeholder' => 'Data',
|
'date_placeholder' => 'Data',
|
||||||
'after_placeholder' => 'Dopo',
|
'after_placeholder' => 'Dopo',
|
||||||
'before_placeholder' => 'Prima',
|
'before_placeholder' => 'Prima'
|
||||||
],
|
]
|
||||||
'numbers' => [
|
|
||||||
'all' => 'tutti',
|
|
||||||
'filter_button_text' => 'Filtra',
|
|
||||||
'reset_button_text' => 'Reset',
|
|
||||||
'min_placeholder' => 'Min',
|
|
||||||
'max_placeholder' => 'Max',
|
|
||||||
],
|
|
||||||
],
|
],
|
||||||
|
|
||||||
'eventlog' => [
|
'eventlog' => [
|
||||||
'show_stacktrace' => 'Visualizza la traccia dello stack',
|
'show_stacktrace' => 'Visualizza la traccia dello stack',
|
||||||
'hide_stacktrace' => 'Nascondi la traccia dello stack',
|
'hide_stacktrace' => 'Nascondi la traccia dello stack',
|
||||||
|
|
@ -96,7 +86,7 @@ return [
|
||||||
'openWith' => 'Apri con',
|
'openWith' => 'Apri con',
|
||||||
'remember_choice' => 'Ricorda l\'opzione selezionata per questa sessione',
|
'remember_choice' => 'Ricorda l\'opzione selezionata per questa sessione',
|
||||||
'open' => 'Apri',
|
'open' => 'Apri',
|
||||||
'cancel' => 'Annulla',
|
'cancel' => 'Annulla'
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ return [
|
||||||
"exists" => "Il valore di :attribute non è valido.",
|
"exists" => "Il valore di :attribute non è valido.",
|
||||||
"image" => ":attribute deve essere un'immagine.",
|
"image" => ":attribute deve essere un'immagine.",
|
||||||
"in" => "Il valore di :attribute non è valido.",
|
"in" => "Il valore di :attribute non è valido.",
|
||||||
"integer" => ":attribute deve essere un numero intero.",
|
"integer" => ":attribute deve essere un numero interno.",
|
||||||
"ip" => ":attribute deve essere un indirizzo IP valido.",
|
"ip" => ":attribute deve essere un indirizzo IP valido.",
|
||||||
"max" => [
|
"max" => [
|
||||||
"numeric" => ":attribute non può essere maggiore di :max.",
|
"numeric" => ":attribute non può essere maggiore di :max.",
|
||||||
|
|
|
||||||
|
|
@ -331,8 +331,6 @@ return [
|
||||||
'core_downloading' => 'Bestanden aan het downloaden',
|
'core_downloading' => 'Bestanden aan het downloaden',
|
||||||
'core_extracting' => 'Bestanden aan het uitpakken',
|
'core_extracting' => 'Bestanden aan het uitpakken',
|
||||||
'core_set_build' => 'Bouwnummer bijwerken',
|
'core_set_build' => 'Bouwnummer bijwerken',
|
||||||
'update_warnings_title' => 'Enkele problemen zijn gedetecteerd en vereisen aandacht:',
|
|
||||||
'update_warnings_plugin_missing' => 'De :parent_code plugin vereist dat :code geinstalleerd is, alvorens deze zal werken',
|
|
||||||
'changelog' => 'Logboek van wijzigingen',
|
'changelog' => 'Logboek van wijzigingen',
|
||||||
'changelog_view_details' => 'Bekijk details',
|
'changelog_view_details' => 'Bekijk details',
|
||||||
'plugins' => 'Plugins',
|
'plugins' => 'Plugins',
|
||||||
|
|
@ -440,9 +438,8 @@ return [
|
||||||
'manage_mail_settings' => 'Beheer e-mailinstellingen',
|
'manage_mail_settings' => 'Beheer e-mailinstellingen',
|
||||||
'manage_other_administrators' => 'Beheer mede-beheerders',
|
'manage_other_administrators' => 'Beheer mede-beheerders',
|
||||||
'impersonate_users' => 'Inloggen als',
|
'impersonate_users' => 'Inloggen als',
|
||||||
'manage_preferences' => 'Beheer back-end voorkeuren',
|
'manage_preferences' => 'Beheer back-end instellingen',
|
||||||
'manage_editor' => 'Beheer code editor voorkeuren',
|
'manage_editor' => 'Beheer code editor instellingen',
|
||||||
'manage_own_editor' => 'Beheer persoonlijk code editor voorkeuren',
|
|
||||||
'view_the_dashboard' => 'Toon dashboard',
|
'view_the_dashboard' => 'Toon dashboard',
|
||||||
'manage_default_dashboard' => 'Beheer het standaard dashboard',
|
'manage_default_dashboard' => 'Beheer het standaard dashboard',
|
||||||
'manage_branding' => 'Back-end aanpassen',
|
'manage_branding' => 'Back-end aanpassen',
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,6 @@ return [
|
||||||
'boolean' => ':attribute moet ja of nee zijn.',
|
'boolean' => ':attribute moet ja of nee zijn.',
|
||||||
'confirmed' => ':attribute bevestiging komt niet overeen.',
|
'confirmed' => ':attribute bevestiging komt niet overeen.',
|
||||||
'date' => ':attribute moet een datum bevatten.',
|
'date' => ':attribute moet een datum bevatten.',
|
||||||
'date_equals' => ':attribute moet een datum zijn gelijk aan :date.',
|
|
||||||
'date_format' => ':attribute moet een geldig datum formaat bevatten.',
|
'date_format' => ':attribute moet een geldig datum formaat bevatten.',
|
||||||
'different' => ':attribute en :other moeten verschillend zijn.',
|
'different' => ':attribute en :other moeten verschillend zijn.',
|
||||||
'digits' => ':attribute moet bestaan uit :digits cijfers.',
|
'digits' => ':attribute moet bestaan uit :digits cijfers.',
|
||||||
|
|
@ -40,22 +39,9 @@ return [
|
||||||
'dimensions' => ':attribute heeft geen geldige afmetingen voor afbeeldingen.',
|
'dimensions' => ':attribute heeft geen geldige afmetingen voor afbeeldingen.',
|
||||||
'distinct' => ':attribute heeft een dubbele waarde.',
|
'distinct' => ':attribute heeft een dubbele waarde.',
|
||||||
'email' => ':attribute is geen geldig e-mailadres.',
|
'email' => ':attribute is geen geldig e-mailadres.',
|
||||||
'ends_with' => ':attribute moet eindigen op een van de volgende waarden: :values.',
|
|
||||||
'exists' => ':attribute bestaat niet.',
|
'exists' => ':attribute bestaat niet.',
|
||||||
'file' => ':attribute moet een bestand zijn.',
|
'file' => ':attribute moet een bestand zijn.',
|
||||||
'filled' => ':attribute is verplicht.',
|
'filled' => ':attribute is verplicht.',
|
||||||
'gt' => [
|
|
||||||
'numeric' => ':attribute moet groter zijn dan :value.',
|
|
||||||
'file' => ':attribute moet groter zijn dan :value kilobyte.',
|
|
||||||
'string' => ':attribute moet langer zijn dan :value karakters.',
|
|
||||||
'array' => ':attribute moet meer dan :value items bevatten.',
|
|
||||||
],
|
|
||||||
'gte' => [
|
|
||||||
'numeric' => ':attribute moet groter of gelijk zijn aan :value.',
|
|
||||||
'file' => ':attribute moet minstens :value kilobyte groot zijn.',
|
|
||||||
'string' => ':attribute moet minstens :value karakters lang zijn.',
|
|
||||||
'array' => ':attribute moet minstens :value items bevatten.',
|
|
||||||
],
|
|
||||||
'image' => ':attribute moet een afbeelding zijn.',
|
'image' => ':attribute moet een afbeelding zijn.',
|
||||||
'in' => ':attribute is ongeldig.',
|
'in' => ':attribute is ongeldig.',
|
||||||
'in_array' => ':attribute bestaat niet in :other.',
|
'in_array' => ':attribute bestaat niet in :other.',
|
||||||
|
|
@ -64,18 +50,6 @@ return [
|
||||||
'ipv4' => ':attribute moet een geldig IPv4-adres zijn.',
|
'ipv4' => ':attribute moet een geldig IPv4-adres zijn.',
|
||||||
'ipv6' => ':attribute moet een geldig IPv6-adres zijn.',
|
'ipv6' => ':attribute moet een geldig IPv6-adres zijn.',
|
||||||
'json' => ':attribute moet een geldige JSON-string zijn.',
|
'json' => ':attribute moet een geldige JSON-string zijn.',
|
||||||
'lt' => [
|
|
||||||
'numeric' => ':attribute moet kleiner zijn dan :value.',
|
|
||||||
'file' => ':attribute moet kleiner zijn dan :value kilobyte.',
|
|
||||||
'string' => ':attribute moet korter zijn dan :value karakters.',
|
|
||||||
'array' => ':attribute moet minder dan :value items bevatten.',
|
|
||||||
],
|
|
||||||
'lte' => [
|
|
||||||
'numeric' => ':attribute moet kleiner of gelijk zijn aan :value.',
|
|
||||||
'file' => ':attribute mag hoogstens :value kilobyte groot zijn.',
|
|
||||||
'string' => ':attribute mag hoogstens :value karakters lang zijn.',
|
|
||||||
'array' => ':attribute mag hoogstens :value items bevatten.',
|
|
||||||
],
|
|
||||||
'max' => [
|
'max' => [
|
||||||
'numeric' => ':attribute mag niet hoger dan :max zijn.',
|
'numeric' => ':attribute mag niet hoger dan :max zijn.',
|
||||||
'file' => ':attribute mag niet meer dan :max kilobytes zijn.',
|
'file' => ':attribute mag niet meer dan :max kilobytes zijn.',
|
||||||
|
|
@ -90,8 +64,7 @@ return [
|
||||||
'string' => ':attribute moet minimaal :min karakters zijn.',
|
'string' => ':attribute moet minimaal :min karakters zijn.',
|
||||||
'array' => ':attribute moet minimaal :min items bevatten.',
|
'array' => ':attribute moet minimaal :min items bevatten.',
|
||||||
],
|
],
|
||||||
'not_in' => 'De gekozen waarde van :attribute is ongeldig.',
|
'not_in' => 'Het formaat van :attribute is ongeldig.',
|
||||||
'not_regex' => 'Het formaat van :attribute is ongeldig.',
|
|
||||||
'numeric' => ':attribute moet een nummer zijn.',
|
'numeric' => ':attribute moet een nummer zijn.',
|
||||||
'present' => ':attribute moet bestaan.',
|
'present' => ':attribute moet bestaan.',
|
||||||
'regex' => ':attribute formaat is ongeldig.',
|
'regex' => ':attribute formaat is ongeldig.',
|
||||||
|
|
@ -109,13 +82,11 @@ return [
|
||||||
'string' => ':attribute moet :size karakters zijn.',
|
'string' => ':attribute moet :size karakters zijn.',
|
||||||
'array' => ':attribute moet :size items bevatten.',
|
'array' => ':attribute moet :size items bevatten.',
|
||||||
],
|
],
|
||||||
'starts_with' => ':attribute moet beginnen met een van de volgende waarden: :values.',
|
|
||||||
'string' => ':attribute moet een tekenreeks zijn.',
|
'string' => ':attribute moet een tekenreeks zijn.',
|
||||||
'timezone' => ':attribute moet een geldige tijdzone zijn.',
|
'timezone' => ':attribute moet een geldige tijdzone zijn.',
|
||||||
'unique' => ':attribute is al in gebruik.',
|
'unique' => ':attribute is al in gebruik.',
|
||||||
'uploaded' => 'Het uploaden van :attribute is mislukt.',
|
'uploaded' => 'Het uploaden van :attribute is mislukt.',
|
||||||
'url' => ':attribute is geen geldige URL.',
|
'url' => ':attribute is geen geldige URL.',
|
||||||
'uuid' => ':attribute moet een geldig UUID zijn.',
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ return [
|
||||||
'link' => 'Ссылка',
|
'link' => 'Ссылка',
|
||||||
'horizontalrule' => 'Вставить горизонтальную черту',
|
'horizontalrule' => 'Вставить горизонтальную черту',
|
||||||
'fullscreen' => 'Полный экран',
|
'fullscreen' => 'Полный экран',
|
||||||
'preview' => 'Предпросмотр',
|
'preview' => 'Предпросмотр'
|
||||||
],
|
],
|
||||||
'mediamanager' => [
|
'mediamanager' => [
|
||||||
'insert_link' => "Вставить медиа-ссылку",
|
'insert_link' => "Вставить медиа-ссылку",
|
||||||
|
|
@ -47,7 +47,7 @@ return [
|
||||||
'alert' => [
|
'alert' => [
|
||||||
'confirm_button_text' => 'Ок',
|
'confirm_button_text' => 'Ок',
|
||||||
'cancel_button_text' => 'Отмена',
|
'cancel_button_text' => 'Отмена',
|
||||||
'widget_remove_confirm' => 'Удалить этот виджет?',
|
'widget_remove_confirm' => 'Удалить этот виджет?'
|
||||||
],
|
],
|
||||||
'datepicker' => [
|
'datepicker' => [
|
||||||
'previousMonth' => 'Предыдущий месяц',
|
'previousMonth' => 'Предыдущий месяц',
|
||||||
|
|
@ -61,11 +61,11 @@ return [
|
||||||
],
|
],
|
||||||
'filter' => [
|
'filter' => [
|
||||||
'group' => [
|
'group' => [
|
||||||
'all' => 'все',
|
'all' => 'все'
|
||||||
],
|
],
|
||||||
'scopes' => [
|
'scopes' => [
|
||||||
'apply_button_text' => 'Применить',
|
'apply_button_text' => 'Применить',
|
||||||
'clear_button_text' => 'Очистить',
|
'clear_button_text' => 'Очистить'
|
||||||
],
|
],
|
||||||
'dates' => [
|
'dates' => [
|
||||||
'all' => 'все',
|
'all' => 'все',
|
||||||
|
|
@ -73,22 +73,22 @@ return [
|
||||||
'reset_button_text' => 'Сбросить',
|
'reset_button_text' => 'Сбросить',
|
||||||
'date_placeholder' => 'Дата',
|
'date_placeholder' => 'Дата',
|
||||||
'after_placeholder' => 'После',
|
'after_placeholder' => 'После',
|
||||||
'before_placeholder' => 'До',
|
'before_placeholder' => 'До'
|
||||||
],
|
],
|
||||||
'numbers' => [
|
'numbers' => [
|
||||||
'all' => 'все',
|
'all' => 'все',
|
||||||
'filter_button_text' => 'Фильтр',
|
'filter_button_text' => 'Фильтр',
|
||||||
'reset_button_text' => 'Сброс',
|
'reset_button_text' => 'Сброс',
|
||||||
'min_placeholder' => 'Min',
|
'min_placeholder' => 'Min',
|
||||||
'max_placeholder' => 'Max',
|
'max_placeholder' => 'Max'
|
||||||
],
|
]
|
||||||
],
|
],
|
||||||
'eventlog' => [
|
'eventlog' => [
|
||||||
'show_stacktrace' => 'Показать трассировку стека',
|
'show_stacktrace' => 'Показать трассировку стека',
|
||||||
'hide_stacktrace' => 'Скрыть трассировку стека',
|
'hide_stacktrace' => 'Скрыть трассировку стека',
|
||||||
'tabs' => [
|
'tabs' => [
|
||||||
'formatted' => 'Форматированный',
|
'formatted' => 'Форматированный',
|
||||||
'raw' => 'Исходный',
|
'raw' => 'Исходный'
|
||||||
],
|
],
|
||||||
'editor' => [
|
'editor' => [
|
||||||
'title' => 'Редактор исходного кода',
|
'title' => 'Редактор исходного кода',
|
||||||
|
|
@ -96,7 +96,7 @@ return [
|
||||||
'openWith' => 'Открыть с помощью',
|
'openWith' => 'Открыть с помощью',
|
||||||
'remember_choice' => 'Запомнить выбранный вариант для этой сессии',
|
'remember_choice' => 'Запомнить выбранный вариант для этой сессии',
|
||||||
'open' => 'Открыть',
|
'open' => 'Открыть',
|
||||||
'cancel' => 'Отмена',
|
'cancel' => 'Отмена'
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue