]> BookStack Code Mirror - bookstack/commitdiff
Merge pull request #3373 from evandroamaro/patch-1
authorDan Brown <redacted>
Fri, 29 Apr 2022 14:41:04 +0000 (15:41 +0100)
committerGitHub <redacted>
Fri, 29 Apr 2022 14:41:04 +0000 (15:41 +0100)
Tiny header

185 files changed:
.env.example.complete
app/Entities/Models/Deletion.php
app/Entities/Models/Page.php
app/Entities/Models/PageRevision.php
app/Entities/Repos/DeletionRepo.php [new file with mode: 0644]
app/Entities/Repos/PageRepo.php
app/Entities/Tools/Markdown/CustomDivConverter.php [new file with mode: 0644]
app/Entities/Tools/Markdown/CustomImageConverter.php [new file with mode: 0644]
app/Entities/Tools/Markdown/CustomParagraphConverter.php
app/Entities/Tools/Markdown/HtmlToMarkdown.php
app/Entities/Tools/Markdown/MarkdownToHtml.php [new file with mode: 0644]
app/Entities/Tools/Markdown/SpacedTagFallbackConverter.php [new file with mode: 0644]
app/Entities/Tools/PageContent.php
app/Entities/Tools/PageEditActivity.php
app/Entities/Tools/PageEditorData.php [new file with mode: 0644]
app/Http/Controllers/Api/AttachmentApiController.php
app/Http/Controllers/Api/RecycleBinApiController.php [new file with mode: 0644]
app/Http/Controllers/AttachmentController.php
app/Http/Controllers/Controller.php
app/Http/Controllers/PageController.php
app/Http/Controllers/RecycleBinController.php
app/Http/Controllers/SettingController.php
app/Http/Request.php
app/Providers/AppServiceProvider.php
app/Uploads/AttachmentService.php
composer.lock
database/migrations/2022_04_17_101741_add_editor_change_field_and_permission.php [new file with mode: 0644]
database/migrations/2022_04_25_140741_update_polymorphic_types.php [new file with mode: 0644]
dev/api/responses/recycle-bin-destroy.json [new file with mode: 0644]
dev/api/responses/recycle-bin-list.json [new file with mode: 0644]
dev/api/responses/recycle-bin-restore.json [new file with mode: 0644]
dev/build/esbuild.js [new file with mode: 0644]
package-lock.json
package.json
resources/icons/swap-horizontal.svg [new file with mode: 0644]
resources/js/components/auto-suggest.js
resources/js/components/code-editor.js
resources/js/components/confirm-dialog.js [new file with mode: 0644]
resources/js/components/index.js
resources/js/components/page-editor.js
resources/js/components/popup.js
resources/js/services/drawio.js
resources/lang/ar/entities.php
resources/lang/ar/settings.php
resources/lang/bg/entities.php
resources/lang/bg/settings.php
resources/lang/bs/entities.php
resources/lang/bs/settings.php
resources/lang/ca/entities.php
resources/lang/ca/settings.php
resources/lang/cs/entities.php
resources/lang/cs/settings.php
resources/lang/da/entities.php
resources/lang/da/settings.php
resources/lang/de/entities.php
resources/lang/de/settings.php
resources/lang/de_informal/entities.php
resources/lang/de_informal/settings.php
resources/lang/en/entities.php
resources/lang/en/settings.php
resources/lang/es/entities.php
resources/lang/es/settings.php
resources/lang/es_AR/entities.php
resources/lang/es_AR/settings.php
resources/lang/et/entities.php
resources/lang/et/settings.php
resources/lang/eu/editor.php
resources/lang/eu/entities.php
resources/lang/eu/errors.php
resources/lang/eu/settings.php
resources/lang/fa/entities.php
resources/lang/fa/settings.php
resources/lang/fr/entities.php
resources/lang/fr/settings.php
resources/lang/he/entities.php
resources/lang/he/settings.php
resources/lang/hr/entities.php
resources/lang/hr/settings.php
resources/lang/hu/entities.php
resources/lang/hu/settings.php
resources/lang/id/auth.php
resources/lang/id/editor.php
resources/lang/id/entities.php
resources/lang/id/settings.php
resources/lang/id/validation.php
resources/lang/it/entities.php
resources/lang/it/settings.php
resources/lang/ja/activities.php
resources/lang/ja/common.php
resources/lang/ja/editor.php
resources/lang/ja/entities.php
resources/lang/ja/settings.php
resources/lang/ko/entities.php
resources/lang/ko/settings.php
resources/lang/lt/entities.php
resources/lang/lt/settings.php
resources/lang/lv/entities.php
resources/lang/lv/settings.php
resources/lang/nb/entities.php
resources/lang/nb/settings.php
resources/lang/nl/entities.php
resources/lang/nl/settings.php
resources/lang/pl/entities.php
resources/lang/pl/settings.php
resources/lang/pt/activities.php
resources/lang/pt/common.php
resources/lang/pt/entities.php
resources/lang/pt/settings.php
resources/lang/pt_BR/entities.php
resources/lang/pt_BR/settings.php
resources/lang/ru/editor.php
resources/lang/ru/entities.php
resources/lang/ru/settings.php
resources/lang/ru/validation.php
resources/lang/sk/entities.php
resources/lang/sk/settings.php
resources/lang/sl/entities.php
resources/lang/sl/settings.php
resources/lang/sv/common.php
resources/lang/sv/entities.php
resources/lang/sv/settings.php
resources/lang/tr/activities.php
resources/lang/tr/auth.php
resources/lang/tr/common.php
resources/lang/tr/editor.php
resources/lang/tr/entities.php
resources/lang/tr/settings.php
resources/lang/tr/validation.php
resources/lang/uk/entities.php
resources/lang/uk/settings.php
resources/lang/uz/activities.php [new file with mode: 0644]
resources/lang/uz/auth.php [new file with mode: 0644]
resources/lang/uz/common.php [new file with mode: 0644]
resources/lang/uz/components.php [new file with mode: 0644]
resources/lang/uz/editor.php [new file with mode: 0644]
resources/lang/uz/entities.php [new file with mode: 0644]
resources/lang/uz/errors.php [new file with mode: 0644]
resources/lang/uz/pagination.php [new file with mode: 0644]
resources/lang/uz/passwords.php [new file with mode: 0644]
resources/lang/uz/settings.php [new file with mode: 0644]
resources/lang/uz/validation.php [new file with mode: 0644]
resources/lang/vi/entities.php
resources/lang/vi/settings.php
resources/lang/zh_CN/editor.php
resources/lang/zh_CN/entities.php
resources/lang/zh_CN/settings.php
resources/lang/zh_TW/auth.php
resources/lang/zh_TW/entities.php
resources/lang/zh_TW/settings.php
resources/sass/_components.scss
resources/sass/_lists.scss
resources/sass/_text.scss
resources/views/attachments/manager-list.blade.php
resources/views/comments/comment.blade.php
resources/views/common/confirm-dialog.blade.php [new file with mode: 0644]
resources/views/common/export-styles.blade.php
resources/views/common/header.blade.php
resources/views/entities/export-menu.blade.php
resources/views/entities/sort.blade.php
resources/views/home/default.blade.php
resources/views/mfa/parts/setup-method-row.blade.php
resources/views/pages/edit.blade.php
resources/views/pages/parts/editor-toolbar.blade.php [new file with mode: 0644]
resources/views/pages/parts/form.blade.php
resources/views/pages/parts/wysiwyg-editor.blade.php
resources/views/pages/revisions.blade.php
resources/views/settings/audit.blade.php
resources/views/settings/customization.blade.php
resources/views/settings/recycle-bin/index.blade.php
resources/views/settings/roles/parts/form.blade.php
routes/api.php
tests/Api/AttachmentsApiTest.php
tests/Api/BooksApiTest.php
tests/Api/ChaptersApiTest.php
tests/Api/PagesApiTest.php
tests/Api/RecycleBinApiTest.php [new file with mode: 0644]
tests/Api/ShelvesApiTest.php
tests/Entity/ExportTest.php
tests/Entity/MarkdownToHtmlTest.php [new file with mode: 0644]
tests/Entity/PageEditorTest.php
tests/Entity/PageRevisionTest.php
tests/Unit/UrlTest.php [deleted file]
tests/Uploads/AttachmentTest.php
tests/Uploads/DrawioTest.php
tests/UrlTest.php [new file with mode: 0644]

index e29087fab28ef2cfc7ee8ed95d04b3a539a28297..0c7f8f6a5f5167647a0358789358e354f6f38296 100644 (file)
@@ -274,7 +274,7 @@ AVATAR_URL=
 # Enable diagrams.net integration
 # Can simply be true/false to enable/disable the integration.
 # Alternatively, It can be URL to the diagrams.net instance you want to use.
-# For URLs, The following URL parameters should be included: embed=1&proto=json&spin=1
+# For URLs, The following URL parameters should be included: embed=1&proto=json&spin=1&configure=1
 DRAWIO=true
 
 # Default item listing view
index 181c9c5803d6441254bd89fc92e66cbddf27c4d0..25f0ea6db7f84478fe2e7d30fe45c1145ab5c55b 100644 (file)
@@ -10,10 +10,16 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Database\Eloquent\Relations\MorphTo;
 
 /**
+ * @property int       $id
+ * @property int       $deleted_by
+ * @property string    $deletable_type
+ * @property int       $deletable_id
  * @property Deletable $deletable
  */
 class Deletion extends Model implements Loggable
 {
+    protected $hidden = [];
+
     /**
      * Get the related deletable record.
      */
index c8217af576d84af0e1aa4aa4d98526d222c471ac..ed69bcf8b8569d2e92fe94444d541872003a849b 100644 (file)
@@ -22,6 +22,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @property bool         $template
  * @property bool         $draft
  * @property int          $revision_count
+ * @property string       $editor
  * @property Chapter      $chapter
  * @property Collection   $attachments
  * @property Collection   $revisions
index 800e5e7f2d8d0332bfcc868bbdcdcb8c872d5698..be2ac33a0958fc26dddfd12ec9795f8448818a7e 100644 (file)
@@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
  *
  * @property mixed  $id
  * @property int    $page_id
+ * @property string $name
  * @property string $slug
  * @property string $book_slug
  * @property int    $created_by
@@ -21,13 +22,14 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
  * @property string $summary
  * @property string $markdown
  * @property string $html
+ * @property string $text
  * @property int    $revision_number
  * @property Page   $page
  * @property-read ?User $createdBy
  */
 class PageRevision extends Model
 {
-    protected $fillable = ['name', 'html', 'text', 'markdown', 'summary'];
+    protected $fillable = ['name', 'text', 'summary'];
     protected $hidden = ['html', 'markdown', 'restricted', 'text'];
 
     /**
diff --git a/app/Entities/Repos/DeletionRepo.php b/app/Entities/Repos/DeletionRepo.php
new file mode 100644 (file)
index 0000000..5d53013
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+namespace BookStack\Entities\Repos;
+
+use BookStack\Actions\ActivityType;
+use BookStack\Entities\Models\Deletion;
+use BookStack\Entities\Tools\TrashCan;
+use BookStack\Facades\Activity;
+
+class DeletionRepo
+{
+    private TrashCan $trashCan;
+
+    public function __construct(TrashCan $trashCan)
+    {
+        $this->trashCan = $trashCan;
+    }
+
+    public function restore(int $id): int
+    {
+        /** @var Deletion $deletion */
+        $deletion = Deletion::query()->findOrFail($id);
+        Activity::add(ActivityType::RECYCLE_BIN_RESTORE, $deletion);
+
+        return $this->trashCan->restoreFromDeletion($deletion);
+    }
+
+    public function destroy(int $id): int
+    {
+        /** @var Deletion $deletion */
+        $deletion = Deletion::query()->findOrFail($id);
+        Activity::add(ActivityType::RECYCLE_BIN_DESTROY, $deletion);
+
+        return $this->trashCan->destroyFromDeletion($deletion);
+    }
+}
index 828c4572fd100f7355d02077477a85a8728bc216..c106d2fd30679d6f663cdd845ddbaf1b0aee4fe5 100644 (file)
@@ -10,6 +10,7 @@ use BookStack\Entities\Models\Page;
 use BookStack\Entities\Models\PageRevision;
 use BookStack\Entities\Tools\BookContents;
 use BookStack\Entities\Tools\PageContent;
+use BookStack\Entities\Tools\PageEditorData;
 use BookStack\Entities\Tools\TrashCan;
 use BookStack\Exceptions\MoveOperationException;
 use BookStack\Exceptions\NotFoundException;
@@ -217,11 +218,25 @@ class PageRepo
         }
 
         $pageContent = new PageContent($page);
-        if (!empty($input['markdown'] ?? '')) {
+        $currentEditor = $page->editor ?: PageEditorData::getSystemDefaultEditor();
+        $newEditor = $currentEditor;
+
+        $haveInput = isset($input['markdown']) || isset($input['html']);
+        $inputEmpty = empty($input['markdown']) && empty($input['html']);
+
+        if ($haveInput && $inputEmpty) {
+            $pageContent->setNewHTML('');
+        } elseif (!empty($input['markdown']) && is_string($input['markdown'])) {
+            $newEditor = 'markdown';
             $pageContent->setNewMarkdown($input['markdown']);
         } elseif (isset($input['html'])) {
+            $newEditor = 'wysiwyg';
             $pageContent->setNewHTML($input['html']);
         }
+
+        if ($newEditor !== $currentEditor && userCan('editor-change')) {
+            $page->editor = $newEditor;
+        }
     }
 
     /**
@@ -229,8 +244,12 @@ class PageRepo
      */
     protected function savePageRevision(Page $page, string $summary = null): PageRevision
     {
-        $revision = new PageRevision($page->getAttributes());
+        $revision = new PageRevision();
 
+        $revision->name = $page->name;
+        $revision->html = $page->html;
+        $revision->markdown = $page->markdown;
+        $revision->text = $page->text;
         $revision->page_id = $page->id;
         $revision->slug = $page->slug;
         $revision->book_slug = $page->book->slug;
@@ -260,10 +279,15 @@ class PageRepo
             return $page;
         }
 
-        // Otherwise save the data to a revision
+        // Otherwise, save the data to a revision
         $draft = $this->getPageRevisionToUpdate($page);
         $draft->fill($input);
-        if (setting('app-editor') !== 'markdown') {
+
+        if (!empty($input['markdown'])) {
+            $draft->markdown = $input['markdown'];
+            $draft->html = '';
+        } else {
+            $draft->html = $input['html'];
             $draft->markdown = '';
         }
 
diff --git a/app/Entities/Tools/Markdown/CustomDivConverter.php b/app/Entities/Tools/Markdown/CustomDivConverter.php
new file mode 100644 (file)
index 0000000..4860623
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+namespace BookStack\Entities\Tools\Markdown;
+
+use League\HTMLToMarkdown\Converter\DivConverter;
+use League\HTMLToMarkdown\ElementInterface;
+
+class CustomDivConverter extends DivConverter
+{
+    public function convert(ElementInterface $element): string
+    {
+        // Clean up draw.io diagrams
+        $drawIoDiagram = $element->getAttribute('drawio-diagram');
+        if ($drawIoDiagram) {
+            return "<div drawio-diagram=\"{$drawIoDiagram}\">{$element->getValue()}</div>\n\n";
+        }
+
+        return parent::convert($element);
+    }
+}
diff --git a/app/Entities/Tools/Markdown/CustomImageConverter.php b/app/Entities/Tools/Markdown/CustomImageConverter.php
new file mode 100644 (file)
index 0000000..6642b29
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+namespace BookStack\Entities\Tools\Markdown;
+
+use League\HTMLToMarkdown\Converter\ImageConverter;
+use League\HTMLToMarkdown\ElementInterface;
+
+class CustomImageConverter extends ImageConverter
+{
+    public function convert(ElementInterface $element): string
+    {
+        $parent = $element->getParent();
+
+        // Remain as HTML if within diagram block.
+        $withinDrawing = $parent && !empty($parent->getAttribute('drawio-diagram'));
+        if ($withinDrawing) {
+            $src = e($element->getAttribute('src'));
+            $alt = e($element->getAttribute('alt'));
+
+            return "<img src=\"{$src}\" alt=\"{$alt}\"/>";
+        }
+
+        return parent::convert($element);
+    }
+}
index bd493aa03670b50dbcb5027676762b47e6086b5b..db36042cd7176e93078957b4d2e1bf4d046faedb 100644 (file)
@@ -9,7 +9,7 @@ class CustomParagraphConverter extends ParagraphConverter
 {
     public function convert(ElementInterface $element): string
     {
-        $class = $element->getAttribute('class');
+        $class = e($element->getAttribute('class'));
         if (strpos($class, 'callout') !== false) {
             return "<{$element->getTagName()} class=\"{$class}\">{$element->getValue()}</{$element->getTagName()}>\n\n";
         }
index 51366705ca1a1043df00a690bb5f5a70293e794a..473435c7f0cc0371dd14e94d1ea4d5bc80d15ea1 100644 (file)
@@ -5,12 +5,10 @@ namespace BookStack\Entities\Tools\Markdown;
 use League\HTMLToMarkdown\Converter\BlockquoteConverter;
 use League\HTMLToMarkdown\Converter\CodeConverter;
 use League\HTMLToMarkdown\Converter\CommentConverter;
-use League\HTMLToMarkdown\Converter\DivConverter;
 use League\HTMLToMarkdown\Converter\EmphasisConverter;
 use League\HTMLToMarkdown\Converter\HardBreakConverter;
 use League\HTMLToMarkdown\Converter\HeaderConverter;
 use League\HTMLToMarkdown\Converter\HorizontalRuleConverter;
-use League\HTMLToMarkdown\Converter\ImageConverter;
 use League\HTMLToMarkdown\Converter\LinkConverter;
 use League\HTMLToMarkdown\Converter\ListBlockConverter;
 use League\HTMLToMarkdown\Converter\ListItemConverter;
@@ -21,7 +19,7 @@ use League\HTMLToMarkdown\HtmlConverter;
 
 class HtmlToMarkdown
 {
-    protected $html;
+    protected string $html;
 
     public function __construct(string $html)
     {
@@ -75,12 +73,12 @@ class HtmlToMarkdown
         $environment->addConverter(new BlockquoteConverter());
         $environment->addConverter(new CodeConverter());
         $environment->addConverter(new CommentConverter());
-        $environment->addConverter(new DivConverter());
+        $environment->addConverter(new CustomDivConverter());
         $environment->addConverter(new EmphasisConverter());
         $environment->addConverter(new HardBreakConverter());
         $environment->addConverter(new HeaderConverter());
         $environment->addConverter(new HorizontalRuleConverter());
-        $environment->addConverter(new ImageConverter());
+        $environment->addConverter(new CustomImageConverter());
         $environment->addConverter(new LinkConverter());
         $environment->addConverter(new ListBlockConverter());
         $environment->addConverter(new ListItemConverter());
@@ -88,6 +86,7 @@ class HtmlToMarkdown
         $environment->addConverter(new PreformattedConverter());
         $environment->addConverter(new TextConverter());
         $environment->addConverter(new CheckboxConverter());
+        $environment->addConverter(new SpacedTagFallbackConverter());
 
         return $environment;
     }
diff --git a/app/Entities/Tools/Markdown/MarkdownToHtml.php b/app/Entities/Tools/Markdown/MarkdownToHtml.php
new file mode 100644 (file)
index 0000000..f3cf7ab
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+namespace BookStack\Entities\Tools\Markdown;
+
+use BookStack\Facades\Theme;
+use BookStack\Theming\ThemeEvents;
+use League\CommonMark\Block\Element\ListItem;
+use League\CommonMark\CommonMarkConverter;
+use League\CommonMark\Environment;
+use League\CommonMark\Extension\Table\TableExtension;
+use League\CommonMark\Extension\TaskList\TaskListExtension;
+
+class MarkdownToHtml
+{
+    protected string $markdown;
+
+    public function __construct(string $markdown)
+    {
+        $this->markdown = $markdown;
+    }
+
+    public function convert(): string
+    {
+        $environment = Environment::createCommonMarkEnvironment();
+        $environment->addExtension(new TableExtension());
+        $environment->addExtension(new TaskListExtension());
+        $environment->addExtension(new CustomStrikeThroughExtension());
+        $environment = Theme::dispatch(ThemeEvents::COMMONMARK_ENVIRONMENT_CONFIGURE, $environment) ?? $environment;
+        $converter = new CommonMarkConverter([], $environment);
+
+        $environment->addBlockRenderer(ListItem::class, new CustomListItemRenderer(), 10);
+
+        return $converter->convertToHtml($this->markdown);
+    }
+}
diff --git a/app/Entities/Tools/Markdown/SpacedTagFallbackConverter.php b/app/Entities/Tools/Markdown/SpacedTagFallbackConverter.php
new file mode 100644 (file)
index 0000000..960bc4e
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+namespace BookStack\Entities\Tools\Markdown;
+
+use League\HTMLToMarkdown\Converter\ConverterInterface;
+use League\HTMLToMarkdown\ElementInterface;
+
+/**
+ * For certain defined tags, add additional spacing upon the retained HTML content
+ * to separate it out from anything that may be markdown soon afterwards or within.
+ */
+class SpacedTagFallbackConverter implements ConverterInterface
+{
+    public function convert(ElementInterface $element): string
+    {
+        return \html_entity_decode($element->getChildrenAsString()) . "\n\n";
+    }
+
+    public function getSupportedTags(): array
+    {
+        return ['summary', 'iframe'];
+    }
+}
index b1c750adbdd6a3a3645c75e91b0f44c9e940bc6c..ea6a185f161424f3cc85d0ef918860c980bc3227 100644 (file)
@@ -3,11 +3,8 @@
 namespace BookStack\Entities\Tools;
 
 use BookStack\Entities\Models\Page;
-use BookStack\Entities\Tools\Markdown\CustomListItemRenderer;
-use BookStack\Entities\Tools\Markdown\CustomStrikeThroughExtension;
+use BookStack\Entities\Tools\Markdown\MarkdownToHtml;
 use BookStack\Exceptions\ImageUploadException;
-use BookStack\Facades\Theme;
-use BookStack\Theming\ThemeEvents;
 use BookStack\Uploads\ImageRepo;
 use BookStack\Uploads\ImageService;
 use BookStack\Util\HtmlContentFilter;
@@ -17,15 +14,10 @@ use DOMNode;
 use DOMNodeList;
 use DOMXPath;
 use Illuminate\Support\Str;
-use League\CommonMark\Block\Element\ListItem;
-use League\CommonMark\CommonMarkConverter;
-use League\CommonMark\Environment;
-use League\CommonMark\Extension\Table\TableExtension;
-use League\CommonMark\Extension\TaskList\TaskListExtension;
 
 class PageContent
 {
-    protected $page;
+    protected Page $page;
 
     /**
      * PageContent constructor.
@@ -53,28 +45,11 @@ class PageContent
     {
         $markdown = $this->extractBase64ImagesFromMarkdown($markdown);
         $this->page->markdown = $markdown;
-        $html = $this->markdownToHtml($markdown);
+        $html = (new MarkdownToHtml($markdown))->convert();
         $this->page->html = $this->formatHtml($html);
         $this->page->text = $this->toPlainText();
     }
 
-    /**
-     * Convert the given Markdown content to a HTML string.
-     */
-    protected function markdownToHtml(string $markdown): string
-    {
-        $environment = Environment::createCommonMarkEnvironment();
-        $environment->addExtension(new TableExtension());
-        $environment->addExtension(new TaskListExtension());
-        $environment->addExtension(new CustomStrikeThroughExtension());
-        $environment = Theme::dispatch(ThemeEvents::COMMONMARK_ENVIRONMENT_CONFIGURE, $environment) ?? $environment;
-        $converter = new CommonMarkConverter([], $environment);
-
-        $environment->addBlockRenderer(ListItem::class, new CustomListItemRenderer(), 10);
-
-        return $converter->convertToHtml($markdown);
-    }
-
     /**
      * Convert all base64 image data to saved images.
      */
index 9981a6ed7ae2f6fa7742729f9d01ed34ddb0af68..2672de94145d7c57a1543eb4271602ed7fb80972 100644 (file)
@@ -9,7 +9,7 @@ use Illuminate\Database\Eloquent\Builder;
 
 class PageEditActivity
 {
-    protected $page;
+    protected Page $page;
 
     /**
      * PageEditActivity constructor.
diff --git a/app/Entities/Tools/PageEditorData.php b/app/Entities/Tools/PageEditorData.php
new file mode 100644 (file)
index 0000000..2342081
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+
+namespace BookStack\Entities\Tools;
+
+use BookStack\Entities\Models\Page;
+use BookStack\Entities\Repos\PageRepo;
+use BookStack\Entities\Tools\Markdown\HtmlToMarkdown;
+use BookStack\Entities\Tools\Markdown\MarkdownToHtml;
+
+class PageEditorData
+{
+    protected Page $page;
+    protected PageRepo $pageRepo;
+    protected string $requestedEditor;
+
+    protected array $viewData;
+    protected array $warnings;
+
+    public function __construct(Page $page, PageRepo $pageRepo, string $requestedEditor)
+    {
+        $this->page = $page;
+        $this->pageRepo = $pageRepo;
+        $this->requestedEditor = $requestedEditor;
+
+        $this->viewData = $this->build();
+    }
+
+    public function getViewData(): array
+    {
+        return $this->viewData;
+    }
+
+    public function getWarnings(): array
+    {
+        return $this->warnings;
+    }
+
+    protected function build(): array
+    {
+        $page = clone $this->page;
+        $isDraft = boolval($this->page->draft);
+        $templates = $this->pageRepo->getTemplates(10);
+        $draftsEnabled = auth()->check();
+
+        $isDraftRevision = false;
+        $this->warnings = [];
+        $editActivity = new PageEditActivity($page);
+
+        if ($editActivity->hasActiveEditing()) {
+            $this->warnings[] = $editActivity->activeEditingMessage();
+        }
+
+        // Check for a current draft version for this user
+        $userDraft = $this->pageRepo->getUserDraft($page);
+        if ($userDraft !== null) {
+            $page->forceFill($userDraft->only(['name', 'html', 'markdown']));
+            $isDraftRevision = true;
+            $this->warnings[] = $editActivity->getEditingActiveDraftMessage($userDraft);
+        }
+
+        $editorType = $this->getEditorType($page);
+        $this->updateContentForEditor($page, $editorType);
+
+        return [
+            'page'            => $page,
+            'book'            => $page->book,
+            'isDraft'         => $isDraft,
+            'isDraftRevision' => $isDraftRevision,
+            'draftsEnabled'   => $draftsEnabled,
+            'templates'       => $templates,
+            'editor'          => $editorType,
+        ];
+    }
+
+    protected function updateContentForEditor(Page $page, string $editorType): void
+    {
+        $isHtml = !empty($page->html) && empty($page->markdown);
+
+        // HTML to markdown-clean conversion
+        if ($editorType === 'markdown' && $isHtml && $this->requestedEditor === 'markdown-clean') {
+            $page->markdown = (new HtmlToMarkdown($page->html))->convert();
+        }
+
+        // Markdown to HTML conversion if we don't have HTML
+        if ($editorType === 'wysiwyg' && !$isHtml) {
+            $page->html = (new MarkdownToHtml($page->markdown))->convert();
+        }
+    }
+
+    /**
+     * Get the type of editor to show for editing the given page.
+     * Defaults based upon the current content of the page otherwise will fall back
+     * to system default but will take a requested type (if provided) if permissions allow.
+     */
+    protected function getEditorType(Page $page): string
+    {
+        $editorType = $page->editor ?: self::getSystemDefaultEditor();
+
+        // Use requested editor if valid and if we have permission
+        $requestedType = explode('-', $this->requestedEditor)[0];
+        if (($requestedType === 'markdown' || $requestedType === 'wysiwyg') && userCan('editor-change')) {
+            $editorType = $requestedType;
+        }
+
+        return $editorType;
+    }
+
+    /**
+     * Get the configured system default editor.
+     */
+    public static function getSystemDefaultEditor(): string
+    {
+        return setting('app-editor') === 'markdown' ? 'markdown' : 'wysiwyg';
+    }
+}
index fc5008e3c6d94baf77ad70167a567c54e1451bcf..7059ca28248456f8e1fc027fc7a39b4a37e13a56 100644 (file)
@@ -87,14 +87,33 @@ class AttachmentApiController extends ApiController
             'markdown' => $attachment->markdownLink(),
         ]);
 
-        if (!$attachment->external) {
-            $attachmentContents = $this->attachmentService->getAttachmentFromStorage($attachment);
-            $attachment->setAttribute('content', base64_encode($attachmentContents));
-        } else {
+        // Simply return a JSON response of the attachment for link-based attachments
+        if ($attachment->external) {
             $attachment->setAttribute('content', $attachment->path);
+
+            return response()->json($attachment);
         }
 
-        return response()->json($attachment);
+        // Build and split our core JSON, at point of content.
+        $splitter = 'CONTENT_SPLIT_LOCATION_' . time() . '_' . rand(1, 40000);
+        $attachment->setAttribute('content', $splitter);
+        $json = $attachment->toJson();
+        $jsonParts = explode($splitter, $json);
+        // Get a stream for the file data from storage
+        $stream = $this->attachmentService->streamAttachmentFromStorage($attachment);
+
+        return response()->stream(function () use ($jsonParts, $stream) {
+            // Output the pre-content JSON data
+            echo $jsonParts[0];
+
+            // Stream out our attachment data as base64 content
+            stream_filter_append($stream, 'convert.base64-encode', STREAM_FILTER_READ);
+            fpassthru($stream);
+            fclose($stream);
+
+            // Output our post-content JSON data
+            echo $jsonParts[1];
+        }, 200, ['Content-Type' => 'application/json']);
     }
 
     /**
diff --git a/app/Http/Controllers/Api/RecycleBinApiController.php b/app/Http/Controllers/Api/RecycleBinApiController.php
new file mode 100644 (file)
index 0000000..f327bae
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+namespace BookStack\Http\Controllers\Api;
+
+use BookStack\Entities\Models\Book;
+use BookStack\Entities\Models\BookChild;
+use BookStack\Entities\Models\Chapter;
+use BookStack\Entities\Models\Deletion;
+use BookStack\Entities\Repos\DeletionRepo;
+use Closure;
+use Illuminate\Database\Eloquent\Builder;
+
+class RecycleBinApiController extends ApiController
+{
+    public function __construct()
+    {
+        $this->middleware(function ($request, $next) {
+            $this->checkPermission('settings-manage');
+            $this->checkPermission('restrictions-manage-all');
+
+            return $next($request);
+        });
+    }
+
+    /**
+     * Get a top-level listing of the items in the recycle bin.
+     * The "deletable" property will reflect the main item deleted.
+     * For books and chapters, counts of child pages/chapters will
+     * be loaded within this "deletable" data.
+     * For chapters & pages, the parent item will be loaded within this "deletable" data.
+     * Requires permission to manage both system settings and permissions.
+     */
+    public function list()
+    {
+        return $this->apiListingResponse(Deletion::query()->with('deletable'), [
+            'id',
+            'deleted_by',
+            'created_at',
+            'updated_at',
+            'deletable_type',
+            'deletable_id',
+        ], [Closure::fromCallable([$this, 'listFormatter'])]);
+    }
+
+    /**
+     * Restore a single deletion from the recycle bin.
+     * Requires permission to manage both system settings and permissions.
+     */
+    public function restore(DeletionRepo $deletionRepo, string $deletionId)
+    {
+        $restoreCount = $deletionRepo->restore(intval($deletionId));
+
+        return response()->json(['restore_count' => $restoreCount]);
+    }
+
+    /**
+     * Remove a single deletion from the recycle bin.
+     * Use this endpoint carefully as it will entirely remove the underlying deleted items from the system.
+     * Requires permission to manage both system settings and permissions.
+     */
+    public function destroy(DeletionRepo $deletionRepo, string $deletionId)
+    {
+        $deleteCount = $deletionRepo->destroy(intval($deletionId));
+
+        return response()->json(['delete_count' => $deleteCount]);
+    }
+
+    /**
+     * Load some related details for the deletion listing.
+     */
+    protected function listFormatter(Deletion $deletion)
+    {
+        $deletable = $deletion->deletable;
+        $withTrashedQuery = fn (Builder $query) => $query->withTrashed();
+
+        if ($deletable instanceof BookChild) {
+            $parent = $deletable->getParent();
+            $parent->setAttribute('type', $parent->getType());
+            $deletable->setRelation('parent', $parent);
+        }
+
+        if ($deletable instanceof Book || $deletable instanceof Chapter) {
+            $countsToLoad = ['pages' => $withTrashedQuery];
+            if ($deletable instanceof Book) {
+                $countsToLoad['chapters'] = $withTrashedQuery;
+            }
+            $deletable->loadCount($countsToLoad);
+        }
+    }
+}
index 084f6f96ad8866469346c4d0469636820f799a9c..0a092b63ae11385e4d67dae6218109b2e2f659fa 100644 (file)
@@ -15,8 +15,8 @@ use Illuminate\Validation\ValidationException;
 
 class AttachmentController extends Controller
 {
-    protected $attachmentService;
-    protected $pageRepo;
+    protected AttachmentService $attachmentService;
+    protected PageRepo $pageRepo;
 
     /**
      * AttachmentController constructor.
@@ -230,13 +230,13 @@ class AttachmentController extends Controller
         }
 
         $fileName = $attachment->getFileName();
-        $attachmentContents = $this->attachmentService->getAttachmentFromStorage($attachment);
+        $attachmentStream = $this->attachmentService->streamAttachmentFromStorage($attachment);
 
         if ($request->get('open') === 'true') {
-            return $this->inlineDownloadResponse($attachmentContents, $fileName);
+            return $this->streamedInlineDownloadResponse($attachmentStream, $fileName);
         }
 
-        return $this->downloadResponse($attachmentContents, $fileName);
+        return $this->streamedDownloadResponse($attachmentStream, $fileName);
     }
 
     /**
index d616974c6fd797c6bc063ca5989501c0a0f4024f..c00ac938bdae2b56586d4d97bc74820cd5b7bbd5 100644 (file)
@@ -12,6 +12,7 @@ use Illuminate\Foundation\Validation\ValidatesRequests;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Response;
 use Illuminate\Routing\Controller as BaseController;
+use Symfony\Component\HttpFoundation\StreamedResponse;
 
 abstract class Controller extends BaseController
 {
@@ -115,7 +116,28 @@ abstract class Controller extends BaseController
     {
         return response()->make($content, 200, [
             'Content-Type'           => 'application/octet-stream',
-            'Content-Disposition'    => 'attachment; filename="' . $fileName . '"',
+            'Content-Disposition'    => 'attachment; filename="' . str_replace('"', '', $fileName) . '"',
+            'X-Content-Type-Options' => 'nosniff',
+        ]);
+    }
+
+    /**
+     * Create a response that forces a download, from a given stream of content.
+     */
+    protected function streamedDownloadResponse($stream, string $fileName): StreamedResponse
+    {
+        return response()->stream(function () use ($stream) {
+            // End & flush the output buffer otherwise we still seem to use memory.
+            // Ignore in testing since output buffers are used to gather a response.
+            if (!app()->runningUnitTests()) {
+                ob_end_clean();
+            }
+
+            fpassthru($stream);
+            fclose($stream);
+        }, 200, [
+            'Content-Type'           => 'application/octet-stream',
+            'Content-Disposition'    => 'attachment; filename="' . str_replace('"', '', $fileName) . '"',
             'X-Content-Type-Options' => 'nosniff',
         ]);
     }
@@ -130,7 +152,28 @@ abstract class Controller extends BaseController
 
         return response()->make($content, 200, [
             'Content-Type'           => $mime,
-            'Content-Disposition'    => 'inline; filename="' . $fileName . '"',
+            'Content-Disposition'    => 'inline; filename="' . str_replace('"', '', $fileName) . '"',
+            'X-Content-Type-Options' => 'nosniff',
+        ]);
+    }
+
+    /**
+     * Create a file download response that provides the file with a content-type
+     * correct for the file, in a way so the browser can show the content in browser,
+     * for a given content stream.
+     */
+    protected function streamedInlineDownloadResponse($stream, string $fileName): StreamedResponse
+    {
+        $sniffContent = fread($stream, 1000);
+        $mime = (new WebSafeMimeSniffer())->sniff($sniffContent);
+
+        return response()->stream(function () use ($sniffContent, $stream) {
+            echo $sniffContent;
+            fpassthru($stream);
+            fclose($stream);
+        }, 200, [
+            'Content-Type'           => $mime,
+            'Content-Disposition'    => 'inline; filename="' . str_replace('"', '', $fileName) . '"',
             'X-Content-Type-Options' => 'nosniff',
         ]);
     }
index eecb6a6e79c94d43b1f88287f3175c8c83854639..268dce0573a9c51a0beacb264c7dc9ca14435481 100644 (file)
@@ -10,6 +10,7 @@ use BookStack\Entities\Tools\Cloner;
 use BookStack\Entities\Tools\NextPreviousContentLocator;
 use BookStack\Entities\Tools\PageContent;
 use BookStack\Entities\Tools\PageEditActivity;
+use BookStack\Entities\Tools\PageEditorData;
 use BookStack\Entities\Tools\PermissionsUpdater;
 use BookStack\Exceptions\NotFoundException;
 use BookStack\Exceptions\PermissionsException;
@@ -21,7 +22,7 @@ use Throwable;
 
 class PageController extends Controller
 {
-    protected $pageRepo;
+    protected PageRepo $pageRepo;
 
     /**
      * PageController constructor.
@@ -82,22 +83,15 @@ class PageController extends Controller
      *
      * @throws NotFoundException
      */
-    public function editDraft(string $bookSlug, int $pageId)
+    public function editDraft(Request $request, string $bookSlug, int $pageId)
     {
         $draft = $this->pageRepo->getById($pageId);
         $this->checkOwnablePermission('page-create', $draft->getParent());
-        $this->setPageTitle(trans('entities.pages_edit_draft'));
 
-        $draftsEnabled = $this->isSignedIn();
-        $templates = $this->pageRepo->getTemplates(10);
+        $editorData = new PageEditorData($draft, $this->pageRepo, $request->query('editor', ''));
+        $this->setPageTitle(trans('entities.pages_edit_draft'));
 
-        return view('pages.edit', [
-            'page'          => $draft,
-            'book'          => $draft->book,
-            'isDraft'       => true,
-            'draftsEnabled' => $draftsEnabled,
-            'templates'     => $templates,
-        ]);
+        return view('pages.edit', $editorData->getViewData());
     }
 
     /**
@@ -188,43 +182,19 @@ class PageController extends Controller
      *
      * @throws NotFoundException
      */
-    public function edit(string $bookSlug, string $pageSlug)
+    public function edit(Request $request, string $bookSlug, string $pageSlug)
     {
         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
         $this->checkOwnablePermission('page-update', $page);
 
-        $page->isDraft = false;
-        $editActivity = new PageEditActivity($page);
-
-        // Check for active editing
-        $warnings = [];
-        if ($editActivity->hasActiveEditing()) {
-            $warnings[] = $editActivity->activeEditingMessage();
+        $editorData = new PageEditorData($page, $this->pageRepo, $request->query('editor', ''));
+        if ($editorData->getWarnings()) {
+            $this->showWarningNotification(implode("\n", $editorData->getWarnings()));
         }
 
-        // Check for a current draft version for this user
-        $userDraft = $this->pageRepo->getUserDraft($page);
-        if ($userDraft !== null) {
-            $page->forceFill($userDraft->only(['name', 'html', 'markdown']));
-            $page->isDraft = true;
-            $warnings[] = $editActivity->getEditingActiveDraftMessage($userDraft);
-        }
-
-        if (count($warnings) > 0) {
-            $this->showWarningNotification(implode("\n", $warnings));
-        }
-
-        $templates = $this->pageRepo->getTemplates(10);
-        $draftsEnabled = $this->isSignedIn();
         $this->setPageTitle(trans('entities.pages_editing_named', ['pageName' => $page->getShortName()]));
 
-        return view('pages.edit', [
-            'page'          => $page,
-            'book'          => $page->book,
-            'current'       => $page,
-            'draftsEnabled' => $draftsEnabled,
-            'templates'     => $templates,
-        ]);
+        return view('pages.edit', $editorData->getViewData());
     }
 
     /**
index 1cffb161cc8a3f94e68d8d6eaeb72ab2e10d7730..82e3f660bddb92475ee5f79f9cdcbd993b1550f3 100644 (file)
@@ -5,6 +5,7 @@ namespace BookStack\Http\Controllers;
 use BookStack\Actions\ActivityType;
 use BookStack\Entities\Models\Deletion;
 use BookStack\Entities\Models\Entity;
+use BookStack\Entities\Repos\DeletionRepo;
 use BookStack\Entities\Tools\TrashCan;
 
 class RecycleBinController extends Controller
@@ -73,12 +74,9 @@ class RecycleBinController extends Controller
      *
      * @throws \Exception
      */
-    public function restore(string $id)
+    public function restore(DeletionRepo $deletionRepo, string $id)
     {
-        /** @var Deletion $deletion */
-        $deletion = Deletion::query()->findOrFail($id);
-        $this->logActivity(ActivityType::RECYCLE_BIN_RESTORE, $deletion);
-        $restoreCount = (new TrashCan())->restoreFromDeletion($deletion);
+        $restoreCount = $deletionRepo->restore((int) $id);
 
         $this->showSuccessNotification(trans('settings.recycle_bin_restore_notification', ['count' => $restoreCount]));
 
@@ -103,12 +101,9 @@ class RecycleBinController extends Controller
      *
      * @throws \Exception
      */
-    public function destroy(string $id)
+    public function destroy(DeletionRepo $deletionRepo, string $id)
     {
-        /** @var Deletion $deletion */
-        $deletion = Deletion::query()->findOrFail($id);
-        $this->logActivity(ActivityType::RECYCLE_BIN_DESTROY, $deletion);
-        $deleteCount = (new TrashCan())->destroyFromDeletion($deletion);
+        $deleteCount = $deletionRepo->destroy((int) $id);
 
         $this->showSuccessNotification(trans('settings.recycle_bin_destroy_notification', ['count' => $deleteCount]));
 
index 2e46bbe409951ab082a0d47e2dd70132b51b1a65..9e9e6c6909ec0613fbfccee497d93a009317abf9 100644 (file)
@@ -19,7 +19,7 @@ class SettingController extends Controller
     }
 
     /**
-     * Handle requests to the settings index path
+     * Handle requests to the settings index path.
      */
     public function index()
     {
index c5b38f1c1bbfe1f391469d791d144ed400e1ce38..13892603db8768df2f1bcfa012d88bc827e75959 100644 (file)
@@ -8,20 +8,36 @@ class Request extends LaravelRequest
 {
     /**
      * Override the default request methods to get the scheme and host
-     * to set the custom APP_URL, if set.
+     * to directly use the custom APP_URL, if set.
      *
-     * @return \Illuminate\Config\Repository|mixed|string
+     * @return string
      */
     public function getSchemeAndHttpHost()
     {
-        $base = config('app.url', null);
+        $appUrl = config('app.url', null);
 
-        if ($base) {
-            $base = trim($base, '/');
-        } else {
-            $base = $this->getScheme() . '://' . $this->getHttpHost();
+        if ($appUrl) {
+            return implode('/', array_slice(explode('/', $appUrl), 0, 3));
         }
 
-        return $base;
+        return parent::getSchemeAndHttpHost();
+    }
+
+    /**
+     * Override the default request methods to get the base URL
+     * to directly use the custom APP_URL, if set.
+     * The base URL never ends with a / but should start with one if not empty.
+     *
+     * @return string
+     */
+    public function getBaseUrl()
+    {
+        $appUrl = config('app.url', null);
+
+        if ($appUrl) {
+            return '/' . rtrim(implode('/', array_slice(explode('/', $appUrl), 3)), '/');
+        }
+
+        return parent::getBaseUrl();
     }
 }
index fc712632e9b876117f605d36d5bd0971f4290468..3c1212e3274d5b23a42da1f8d9df26a1630bcdc8 100644 (file)
@@ -51,12 +51,12 @@ class AppServiceProvider extends ServiceProvider
         // Allow longer string lengths after upgrade to utf8mb4
         Schema::defaultStringLength(191);
 
-        // Set morph-map due to namespace changes
-        Relation::morphMap([
-            'BookStack\\Bookshelf' => Bookshelf::class,
-            'BookStack\\Book'      => Book::class,
-            'BookStack\\Chapter'   => Chapter::class,
-            'BookStack\\Page'      => Page::class,
+        // Set morph-map for our relations to friendlier aliases
+        Relation::enforceMorphMap([
+            'bookshelf' => Bookshelf::class,
+            'book'      => Book::class,
+            'chapter'   => Chapter::class,
+            'page'      => Page::class,
         ]);
 
         // View Composers
index 7974d7ae926b1472f61f567811e527acc254e688..9d1f96ae42f99178f6b3fd10406a4572805b5943 100644 (file)
@@ -14,7 +14,7 @@ use Symfony\Component\HttpFoundation\File\UploadedFile;
 
 class AttachmentService
 {
-    protected $fileSystem;
+    protected FilesystemManager $fileSystem;
 
     /**
      * AttachmentService constructor.
@@ -73,6 +73,18 @@ class AttachmentService
         return $this->getStorageDisk()->get($this->adjustPathForStorageDisk($attachment->path));
     }
 
+    /**
+     * Stream an attachment from storage.
+     *
+     * @throws FileNotFoundException
+     *
+     * @return resource|null
+     */
+    public function streamAttachmentFromStorage(Attachment $attachment)
+    {
+        return $this->getStorageDisk()->readStream($this->adjustPathForStorageDisk($attachment->path));
+    }
+
     /**
      * Store a new attachment upon user upload.
      *
@@ -211,8 +223,6 @@ class AttachmentService
      */
     protected function putFileInStorage(UploadedFile $uploadedFile): string
     {
-        $attachmentData = file_get_contents($uploadedFile->getRealPath());
-
         $storage = $this->getStorageDisk();
         $basePath = 'uploads/files/' . date('Y-m-M') . '/';
 
@@ -221,10 +231,11 @@ class AttachmentService
             $uploadFileName = Str::random(3) . $uploadFileName;
         }
 
+        $attachmentStream = fopen($uploadedFile->getRealPath(), 'r');
         $attachmentPath = $basePath . $uploadFileName;
 
         try {
-            $storage->put($this->adjustPathForStorageDisk($attachmentPath), $attachmentData);
+            $storage->writeStream($this->adjustPathForStorageDisk($attachmentPath), $attachmentStream);
         } catch (Exception $e) {
             Log::error('Error when attempting file upload:' . $e->getMessage());
 
index 5e8a84ffeb2cf9dac6ea35788f1a22019d9f57e5..4b0cd13d369f907cab3a8ec788b443bcf60b778c 100644 (file)
         },
         {
             "name": "aws/aws-sdk-php",
-            "version": "3.217.0",
+            "version": "3.222.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/aws/aws-sdk-php.git",
-                "reference": "a8cca383b13fe6cde479a4745b4d3dfe893fdc69"
+                "reference": "632621d97180e82d3adc1245a7b272774c30dbf5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a8cca383b13fe6cde479a4745b4d3dfe893fdc69",
-                "reference": "a8cca383b13fe6cde479a4745b4d3dfe893fdc69",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/632621d97180e82d3adc1245a7b272774c30dbf5",
+                "reference": "632621d97180e82d3adc1245a7b272774c30dbf5",
                 "shasum": ""
             },
             "require": {
@@ -75,9 +75,9 @@
                 "ext-json": "*",
                 "ext-pcre": "*",
                 "ext-simplexml": "*",
-                "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0",
+                "guzzlehttp/guzzle": "^5.3.3 || ^6.2.1 || ^7.0",
                 "guzzlehttp/promises": "^1.4.0",
-                "guzzlehttp/psr7": "^1.7.0|^2.0",
+                "guzzlehttp/psr7": "^1.7.0 || ^2.1.1",
                 "mtdowling/jmespath.php": "^2.6",
                 "php": ">=5.5"
             },
@@ -92,7 +92,7 @@
                 "ext-sockets": "*",
                 "nette/neon": "^2.3",
                 "paragonie/random_compat": ">= 2",
-                "phpunit/phpunit": "^4.8.35|^5.4.3",
+                "phpunit/phpunit": "^4.8.35 || ^5.6.3",
                 "psr/cache": "^1.0",
                 "psr/simple-cache": "^1.0",
                 "sebastian/comparator": "^1.2.3"
             "support": {
                 "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
                 "issues": "https://github.com/aws/aws-sdk-php/issues",
-                "source": "https://github.com/aws/aws-sdk-php/tree/3.217.0"
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.222.1"
             },
-            "time": "2022-03-30T18:18:30+00:00"
+            "time": "2022-04-28T18:17:24+00:00"
         },
         {
             "name": "bacon/bacon-qr-code",
         },
         {
             "name": "doctrine/dbal",
-            "version": "3.3.4",
+            "version": "3.3.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/dbal.git",
-                "reference": "83f779beaea1893c0bece093ab2104c6d15a7f26"
+                "reference": "719663b15983278227669c8595151586a2ff3327"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/dbal/zipball/83f779beaea1893c0bece093ab2104c6d15a7f26",
-                "reference": "83f779beaea1893c0bece093ab2104c6d15a7f26",
+                "url": "https://api.github.com/repos/doctrine/dbal/zipball/719663b15983278227669c8595151586a2ff3327",
+                "reference": "719663b15983278227669c8595151586a2ff3327",
                 "shasum": ""
             },
             "require": {
             "require-dev": {
                 "doctrine/coding-standard": "9.0.0",
                 "jetbrains/phpstorm-stubs": "2021.1",
-                "phpstan/phpstan": "1.4.6",
+                "phpstan/phpstan": "1.5.3",
                 "phpstan/phpstan-strict-rules": "^1.1",
                 "phpunit/phpunit": "9.5.16",
                 "psalm/plugin-phpunit": "0.16.1",
             ],
             "support": {
                 "issues": "https://github.com/doctrine/dbal/issues",
-                "source": "https://github.com/doctrine/dbal/tree/3.3.4"
+                "source": "https://github.com/doctrine/dbal/tree/3.3.5"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-20T18:37:29+00:00"
+            "time": "2022-04-05T09:50:18+00:00"
         },
         {
             "name": "doctrine/deprecations",
         },
         {
             "name": "dompdf/dompdf",
-            "version": "v1.2.1",
+            "version": "v1.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/dompdf/dompdf.git",
-                "reference": "c6dfd9bb8b0040609f04754f729d4cb3016e0575"
+                "reference": "5031045d9640b38cfc14aac9667470df09c9e090"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/c6dfd9bb8b0040609f04754f729d4cb3016e0575",
-                "reference": "c6dfd9bb8b0040609f04754f729d4cb3016e0575",
+                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/5031045d9640b38cfc14aac9667470df09c9e090",
+                "reference": "5031045d9640b38cfc14aac9667470df09c9e090",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.1 || ^8.0"
             },
             "require-dev": {
+                "ext-json": "*",
+                "ext-zip": "*",
                 "mockery/mockery": "^1.3",
                 "phpunit/phpunit": "^7.5 || ^8 || ^9",
                 "squizlabs/php_codesniffer": "^3.5"
             "homepage": "https://github.com/dompdf/dompdf",
             "support": {
                 "issues": "https://github.com/dompdf/dompdf/issues",
-                "source": "https://github.com/dompdf/dompdf/tree/v1.2.1"
+                "source": "https://github.com/dompdf/dompdf/tree/v1.2.2"
             },
-            "time": "2022-03-24T12:57:42+00:00"
+            "time": "2022-04-27T13:50:54+00:00"
         },
         {
             "name": "dragonmantank/cron-expression",
         },
         {
             "name": "laravel/framework",
-            "version": "v8.83.6",
+            "version": "v8.83.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/framework.git",
-                "reference": "dffcec0cb686eafaa3b8f33db11da2cd9d69af1c"
+                "reference": "148ae59b7da6c3db6736374d357c5aaef9506fb7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/framework/zipball/dffcec0cb686eafaa3b8f33db11da2cd9d69af1c",
-                "reference": "dffcec0cb686eafaa3b8f33db11da2cd9d69af1c",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/148ae59b7da6c3db6736374d357c5aaef9506fb7",
+                "reference": "148ae59b7da6c3db6736374d357c5aaef9506fb7",
                 "shasum": ""
             },
             "require": {
                 "issues": "https://github.com/laravel/framework/issues",
                 "source": "https://github.com/laravel/framework"
             },
-            "time": "2022-03-29T14:41:02+00:00"
+            "time": "2022-04-27T14:07:37+00:00"
         },
         {
             "name": "laravel/serializable-closure",
         },
         {
             "name": "league/mime-type-detection",
-            "version": "1.9.0",
+            "version": "1.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/mime-type-detection.git",
-                "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69"
+                "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/aa70e813a6ad3d1558fc927863d47309b4c23e69",
-                "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69",
+                "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
+                "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
                 "shasum": ""
             },
             "require": {
             "description": "Mime-type detection for Flysystem",
             "support": {
                 "issues": "https://github.com/thephpleague/mime-type-detection/issues",
-                "source": "https://github.com/thephpleague/mime-type-detection/tree/1.9.0"
+                "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-11-21T11:48:40+00:00"
+            "time": "2022-04-17T13:12:02+00:00"
         },
         {
             "name": "league/oauth1-client",
-            "version": "v1.10.0",
+            "version": "v1.10.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/oauth1-client.git",
-                "reference": "88dd16b0cff68eb9167bfc849707d2c40ad91ddc"
+                "reference": "d6365b901b5c287dd41f143033315e2f777e1167"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/88dd16b0cff68eb9167bfc849707d2c40ad91ddc",
-                "reference": "88dd16b0cff68eb9167bfc849707d2c40ad91ddc",
+                "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/d6365b901b5c287dd41f143033315e2f777e1167",
+                "reference": "d6365b901b5c287dd41f143033315e2f777e1167",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/thephpleague/oauth1-client/issues",
-                "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.0"
+                "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.1"
             },
-            "time": "2021-08-15T23:05:49+00:00"
+            "time": "2022-04-15T14:02:14+00:00"
         },
         {
             "name": "league/oauth2-client",
         },
         {
             "name": "monolog/monolog",
-            "version": "2.4.0",
+            "version": "2.5.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Seldaek/monolog.git",
-                "reference": "d7fd7450628561ba697b7097d86db72662f54aef"
+                "reference": "4192345e260f1d51b365536199744b987e160edc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/d7fd7450628561ba697b7097d86db72662f54aef",
-                "reference": "d7fd7450628561ba697b7097d86db72662f54aef",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4192345e260f1d51b365536199744b987e160edc",
+                "reference": "4192345e260f1d51b365536199744b987e160edc",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/Seldaek/monolog/issues",
-                "source": "https://github.com/Seldaek/monolog/tree/2.4.0"
+                "source": "https://github.com/Seldaek/monolog/tree/2.5.0"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-14T12:44:37+00:00"
+            "time": "2022-04-08T15:43:54+00:00"
         },
         {
             "name": "mtdowling/jmespath.php",
         },
         {
             "name": "phpseclib/phpseclib",
-            "version": "3.0.13",
+            "version": "3.0.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpseclib/phpseclib.git",
-                "reference": "1443ab79364eea48665fa8c09ac67f37d1025f7e"
+                "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/1443ab79364eea48665fa8c09ac67f37d1025f7e",
-                "reference": "1443ab79364eea48665fa8c09ac67f37d1025f7e",
+                "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2f0b7af658cbea265cbb4a791d6c29a6613f98ef",
+                "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.6.1"
             },
             "require-dev": {
-                "phing/phing": "~2.7",
-                "phpunit/phpunit": "^5.7|^6.0|^9.4",
-                "squizlabs/php_codesniffer": "~2.0"
+                "phpunit/phpunit": "*"
             },
             "suggest": {
                 "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
             ],
             "support": {
                 "issues": "https://github.com/phpseclib/phpseclib/issues",
-                "source": "https://github.com/phpseclib/phpseclib/tree/3.0.13"
+                "source": "https://github.com/phpseclib/phpseclib/tree/3.0.14"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-30T08:50:05+00:00"
+            "time": "2022-04-04T05:15:45+00:00"
         },
         {
             "name": "pragmarx/google2fa",
         },
         {
             "name": "symfony/console",
-            "version": "v5.4.5",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad"
+                "reference": "ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/d8111acc99876953f52fe16d4c50eb60940d49ad",
-                "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad",
+                "url": "https://api.github.com/repos/symfony/console/zipball/ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b",
+                "reference": "ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b",
                 "shasum": ""
             },
             "require": {
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v5.4.5"
+                "source": "https://github.com/symfony/console/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-02-24T12:45:35+00:00"
+            "time": "2022-04-12T16:02:29+00:00"
         },
         {
             "name": "symfony/css-selector",
         },
         {
             "name": "symfony/deprecation-contracts",
-            "version": "v2.5.0",
+            "version": "v2.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/deprecation-contracts.git",
-                "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8"
+                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8",
-                "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
                 "shasum": ""
             },
             "require": {
             "description": "A generic function and convention to trigger deprecation notices",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0"
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-07-12T14:48:14+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/error-handler",
-            "version": "v5.4.3",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/error-handler.git",
-                "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5"
+                "reference": "c1fcde614dfe99d62a83b796a53b8bad358b266a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/error-handler/zipball/c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5",
-                "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1fcde614dfe99d62a83b796a53b8bad358b266a",
+                "reference": "c1fcde614dfe99d62a83b796a53b8bad358b266a",
                 "shasum": ""
             },
             "require": {
             "description": "Provides tools to manage errors and ease debugging PHP code",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/error-handler/tree/v5.4.3"
+                "source": "https://github.com/symfony/error-handler/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-02T09:53:40+00:00"
+            "time": "2022-04-12T15:48:08+00:00"
         },
         {
             "name": "symfony/event-dispatcher",
         },
         {
             "name": "symfony/event-dispatcher-contracts",
-            "version": "v2.5.0",
+            "version": "v2.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher-contracts.git",
-                "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a"
+                "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a",
-                "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1",
+                "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1",
                 "shasum": ""
             },
             "require": {
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0"
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.1"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-07-12T14:48:14+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/finder",
-            "version": "v5.4.3",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d"
+                "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d",
-                "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9",
+                "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9",
                 "shasum": ""
             },
             "require": {
             "description": "Finds files and directories via an intuitive fluent interface",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/finder/tree/v5.4.3"
+                "source": "https://github.com/symfony/finder/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-26T16:34:36+00:00"
+            "time": "2022-04-15T08:07:45+00:00"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v5.4.6",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465"
+                "reference": "ff2818d1c3d49860bcae1f2cbb5eb00fcd3bf9e2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/34e89bc147633c0f9dd6caaaf56da3b806a21465",
-                "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ff2818d1c3d49860bcae1f2cbb5eb00fcd3bf9e2",
+                "reference": "ff2818d1c3d49860bcae1f2cbb5eb00fcd3bf9e2",
                 "shasum": ""
             },
             "require": {
             "description": "Defines an object-oriented layer for the HTTP specification",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-foundation/tree/v5.4.6"
+                "source": "https://github.com/symfony/http-foundation/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-05T21:03:43+00:00"
+            "time": "2022-04-22T08:14:12+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v5.4.6",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "d41f29ae9af1b5f40c7ebcddf09082953229411d"
+                "reference": "cf7e61106abfc19b305ca0aedc41724ced89a02a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d41f29ae9af1b5f40c7ebcddf09082953229411d",
-                "reference": "d41f29ae9af1b5f40c7ebcddf09082953229411d",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cf7e61106abfc19b305ca0aedc41724ced89a02a",
+                "reference": "cf7e61106abfc19b305ca0aedc41724ced89a02a",
                 "shasum": ""
             },
             "require": {
             "description": "Provides a structured process for converting a Request into a Response",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-kernel/tree/v5.4.6"
+                "source": "https://github.com/symfony/http-kernel/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-05T21:14:51+00:00"
+            "time": "2022-04-27T17:22:21+00:00"
         },
         {
             "name": "symfony/mime",
-            "version": "v5.4.3",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f"
+                "reference": "af49bc163ec3272f677bde3bc44c0d766c1fd662"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/e1503cfb5c9a225350f549d3bb99296f4abfb80f",
-                "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/af49bc163ec3272f677bde3bc44c0d766c1fd662",
+                "reference": "af49bc163ec3272f677bde3bc44c0d766c1fd662",
                 "shasum": ""
             },
             "require": {
                 "mime-type"
             ],
             "support": {
-                "source": "https://github.com/symfony/mime/tree/v5.4.3"
+                "source": "https://github.com/symfony/mime/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-02T09:53:40+00:00"
+            "time": "2022-04-12T15:48:08+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
         },
         {
             "name": "symfony/process",
-            "version": "v5.4.5",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "95440409896f90a5f85db07a32b517ecec17fa4c"
+                "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/95440409896f90a5f85db07a32b517ecec17fa4c",
-                "reference": "95440409896f90a5f85db07a32b517ecec17fa4c",
+                "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
+                "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
                 "shasum": ""
             },
             "require": {
             "description": "Executes commands in sub-processes",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/process/tree/v5.4.5"
+                "source": "https://github.com/symfony/process/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-30T18:16:22+00:00"
+            "time": "2022-04-08T05:07:18+00:00"
         },
         {
             "name": "symfony/routing",
-            "version": "v5.4.3",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "44b29c7a94e867ccde1da604792f11a469958981"
+                "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/44b29c7a94e867ccde1da604792f11a469958981",
-                "reference": "44b29c7a94e867ccde1da604792f11a469958981",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/e07817bb6244ea33ef5ad31abc4a9288bef3f2f7",
+                "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7",
                 "shasum": ""
             },
             "require": {
                 "url"
             ],
             "support": {
-                "source": "https://github.com/symfony/routing/tree/v5.4.3"
+                "source": "https://github.com/symfony/routing/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-02T09:53:40+00:00"
+            "time": "2022-04-18T21:45:37+00:00"
         },
         {
             "name": "symfony/service-contracts",
-            "version": "v2.5.0",
+            "version": "v2.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/service-contracts.git",
-                "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc"
+                "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc",
-                "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
+                "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
                 "shasum": ""
             },
             "require": {
                 "php": ">=7.2.5",
                 "psr/container": "^1.1",
-                "symfony/deprecation-contracts": "^2.1"
+                "symfony/deprecation-contracts": "^2.1|^3"
             },
             "conflict": {
                 "ext-psr": "<1.1|>=2"
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/service-contracts/tree/v2.5.0"
+                "source": "https://github.com/symfony/service-contracts/tree/v2.5.1"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-11-04T16:48:04+00:00"
+            "time": "2022-03-13T20:07:29+00:00"
         },
         {
             "name": "symfony/string",
-            "version": "v5.4.3",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/string.git",
-                "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10"
+                "reference": "3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10",
-                "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10",
+                "url": "https://api.github.com/repos/symfony/string/zipball/3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8",
+                "reference": "3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8",
                 "shasum": ""
             },
             "require": {
                 "utf8"
             ],
             "support": {
-                "source": "https://github.com/symfony/string/tree/v5.4.3"
+                "source": "https://github.com/symfony/string/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-01-02T09:53:40+00:00"
+            "time": "2022-04-19T10:40:37+00:00"
         },
         {
             "name": "symfony/translation",
-            "version": "v5.4.6",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "a7ca9fdfffb0174209440c2ffa1dee228e15d95b"
+                "reference": "f5c0f6d1f20993b2606f3a5f36b1dc8c1899170b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/a7ca9fdfffb0174209440c2ffa1dee228e15d95b",
-                "reference": "a7ca9fdfffb0174209440c2ffa1dee228e15d95b",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/f5c0f6d1f20993b2606f3a5f36b1dc8c1899170b",
+                "reference": "f5c0f6d1f20993b2606f3a5f36b1dc8c1899170b",
                 "shasum": ""
             },
             "require": {
             "description": "Provides tools to internationalize your application",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/translation/tree/v5.4.6"
+                "source": "https://github.com/symfony/translation/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-02T12:56:28+00:00"
+            "time": "2022-04-22T08:14:12+00:00"
         },
         {
             "name": "symfony/translation-contracts",
-            "version": "v2.5.0",
+            "version": "v2.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation-contracts.git",
-                "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e"
+                "reference": "1211df0afa701e45a04253110e959d4af4ef0f07"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/d28150f0f44ce854e942b671fc2620a98aae1b1e",
-                "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e",
+                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1211df0afa701e45a04253110e959d4af4ef0f07",
+                "reference": "1211df0afa701e45a04253110e959d4af4ef0f07",
                 "shasum": ""
             },
             "require": {
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/translation-contracts/tree/v2.5.0"
+                "source": "https://github.com/symfony/translation-contracts/tree/v2.5.1"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-08-17T14:20:01+00:00"
+            "time": "2022-01-02T09:53:40+00:00"
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v5.4.6",
+            "version": "v5.4.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0"
+                "reference": "cdcadd343d31ad16fc5e006b0de81ea307435053"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/294e9da6e2e0dd404e983daa5aa74253d92c05d0",
-                "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cdcadd343d31ad16fc5e006b0de81ea307435053",
+                "reference": "cdcadd343d31ad16fc5e006b0de81ea307435053",
                 "shasum": ""
             },
             "require": {
                 "dump"
             ],
             "support": {
-                "source": "https://github.com/symfony/var-dumper/tree/v5.4.6"
+                "source": "https://github.com/symfony/var-dumper/tree/v5.4.8"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-02T12:42:23+00:00"
+            "time": "2022-04-26T13:19:20+00:00"
         },
         {
             "name": "tijsverkoyen/css-to-inline-styles",
         },
         {
             "name": "composer/composer",
-            "version": "2.3.1",
+            "version": "2.3.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/composer.git",
-                "reference": "d6c572e5f5d6d1a27bb7a1fbd1c74f777a26d436"
+                "reference": "50c47b1f907cfcdb8f072b88164d22b527557ae1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/composer/zipball/d6c572e5f5d6d1a27bb7a1fbd1c74f777a26d436",
-                "reference": "d6c572e5f5d6d1a27bb7a1fbd1c74f777a26d436",
+                "url": "https://api.github.com/repos/composer/composer/zipball/50c47b1f907cfcdb8f072b88164d22b527557ae1",
+                "reference": "50c47b1f907cfcdb8f072b88164d22b527557ae1",
                 "shasum": ""
             },
             "require": {
             "support": {
                 "irc": "ircs://irc.libera.chat:6697/composer",
                 "issues": "https://github.com/composer/composer/issues",
-                "source": "https://github.com/composer/composer/tree/2.3.1"
+                "source": "https://github.com/composer/composer/tree/2.3.5"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-30T13:41:28+00:00"
+            "time": "2022-04-13T14:43:00+00:00"
         },
         {
             "name": "composer/metadata-minifier",
         },
         {
             "name": "composer/semver",
-            "version": "3.3.1",
+            "version": "3.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/semver.git",
-                "reference": "5d8e574bb0e69188786b8ef77d43341222a41a71"
+                "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/semver/zipball/5d8e574bb0e69188786b8ef77d43341222a41a71",
-                "reference": "5d8e574bb0e69188786b8ef77d43341222a41a71",
+                "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
+                "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
                 "shasum": ""
             },
             "require": {
             "support": {
                 "irc": "irc://irc.freenode.org/composer",
                 "issues": "https://github.com/composer/semver/issues",
-                "source": "https://github.com/composer/semver/tree/3.3.1"
+                "source": "https://github.com/composer/semver/tree/3.3.2"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-16T11:22:07+00:00"
+            "time": "2022-04-01T19:23:25+00:00"
         },
         {
             "name": "composer/spdx-licenses",
         },
         {
             "name": "itsgoingd/clockwork",
-            "version": "v5.1.5",
+            "version": "v5.1.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/itsgoingd/clockwork.git",
-                "reference": "6a7b3942224fa53cf3704d9adba636e1f3dfeb9a"
+                "reference": "9df41432da1d8cb39c7fda383ddcc02231c83ff3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/6a7b3942224fa53cf3704d9adba636e1f3dfeb9a",
-                "reference": "6a7b3942224fa53cf3704d9adba636e1f3dfeb9a",
+                "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/9df41432da1d8cb39c7fda383ddcc02231c83ff3",
+                "reference": "9df41432da1d8cb39c7fda383ddcc02231c83ff3",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/itsgoingd/clockwork/issues",
-                "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.5"
+                "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.6"
             },
             "funding": [
                 {
                     "type": "github"
                 }
             ],
-            "time": "2022-02-13T22:57:42+00:00"
+            "time": "2022-04-12T21:35:47+00:00"
         },
         {
             "name": "justinrainbow/json-schema",
-            "version": "5.2.11",
+            "version": "5.2.12",
             "source": {
                 "type": "git",
                 "url": "https://github.com/justinrainbow/json-schema.git",
-                "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa"
+                "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa",
-                "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa",
+                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60",
+                "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/justinrainbow/json-schema/issues",
-                "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11"
+                "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12"
             },
-            "time": "2021-07-22T09:24:00+00:00"
+            "time": "2022-04-13T08:02:27+00:00"
         },
         {
             "name": "mockery/mockery",
         },
         {
             "name": "phpstan/phpstan",
-            "version": "1.5.2",
+            "version": "1.6.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpstan/phpstan.git",
-                "reference": "f32e95f571c9587b4e14be05253ae56fedd00b2c"
+                "reference": "6128620b98292e0b69ea6d799871d77163681c8e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f32e95f571c9587b4e14be05253ae56fedd00b2c",
-                "reference": "f32e95f571c9587b4e14be05253ae56fedd00b2c",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6128620b98292e0b69ea6d799871d77163681c8e",
+                "reference": "6128620b98292e0b69ea6d799871d77163681c8e",
                 "shasum": ""
             },
             "require": {
             "description": "PHPStan - PHP Static Analysis Tool",
             "support": {
                 "issues": "https://github.com/phpstan/phpstan/issues",
-                "source": "https://github.com/phpstan/phpstan/tree/1.5.2"
+                "source": "https://github.com/phpstan/phpstan/tree/1.6.3"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-29T07:34:36+00:00"
+            "time": "2022-04-28T11:27:53+00:00"
         },
         {
             "name": "phpunit/php-code-coverage",
         },
         {
             "name": "phpunit/phpunit",
-            "version": "9.5.19",
+            "version": "9.5.20",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "35ea4b7f3acabb26f4bb640f8c30866c401da807"
+                "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/35ea4b7f3acabb26f4bb640f8c30866c401da807",
-                "reference": "35ea4b7f3acabb26f4bb640f8c30866c401da807",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba",
+                "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
-                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.19"
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20"
             },
             "funding": [
                 {
                     "type": "github"
                 }
             ],
-            "time": "2022-03-15T09:57:31+00:00"
+            "time": "2022-04-01T12:37:26+00:00"
         },
         {
             "name": "react/promise",
         },
         {
             "name": "sebastian/environment",
-            "version": "5.1.3",
+            "version": "5.1.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+                "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
-                "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+                "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
                 "shasum": ""
             },
             "require": {
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/environment/issues",
-                "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
+                "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
             },
             "funding": [
                 {
                     "type": "github"
                 }
             ],
-            "time": "2020-09-28T05:52:38+00:00"
+            "time": "2022-04-03T09:37:03+00:00"
         },
         {
             "name": "sebastian/exporter",
         },
         {
             "name": "seld/jsonlint",
-            "version": "1.8.3",
+            "version": "1.9.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Seldaek/jsonlint.git",
-                "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57"
+                "reference": "4211420d25eba80712bff236a98960ef68b866b7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
-                "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
+                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7",
+                "reference": "4211420d25eba80712bff236a98960ef68b866b7",
                 "shasum": ""
             },
             "require": {
                 "php": "^5.3 || ^7.0 || ^8.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+                "phpstan/phpstan": "^1.5",
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13"
             },
             "bin": [
                 "bin/jsonlint"
             ],
             "support": {
                 "issues": "https://github.com/Seldaek/jsonlint/issues",
-                "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3"
+                "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-11-11T09:19:24+00:00"
+            "time": "2022-04-01T13:37:23+00:00"
         },
         {
             "name": "seld/phar-utils",
         },
         {
             "name": "symfony/filesystem",
-            "version": "v5.4.6",
+            "version": "v5.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "d53a45039974952af7f7ebc461ccdd4295e29440"
+                "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/d53a45039974952af7f7ebc461ccdd4295e29440",
-                "reference": "d53a45039974952af7f7ebc461ccdd4295e29440",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/3a4442138d80c9f7b600fb297534ac718b61d37f",
+                "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f",
                 "shasum": ""
             },
             "require": {
             "description": "Provides basic utilities for the filesystem",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/filesystem/tree/v5.4.6"
+                "source": "https://github.com/symfony/filesystem/tree/v5.4.7"
             },
             "funding": [
                 {
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-02T12:42:23+00:00"
+            "time": "2022-04-01T12:33:59+00:00"
         },
         {
             "name": "theseer/tokenizer",
diff --git a/database/migrations/2022_04_17_101741_add_editor_change_field_and_permission.php b/database/migrations/2022_04_17_101741_add_editor_change_field_and_permission.php
new file mode 100644 (file)
index 0000000..a562a48
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+
+use Carbon\Carbon;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Schema;
+
+class AddEditorChangeFieldAndPermission extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        // Add the new 'editor' column to the pages table
+        Schema::table('pages', function (Blueprint $table) {
+            $table->string('editor', 50)->default('');
+        });
+
+        // Populate the new 'editor' column
+        // We set it to 'markdown' for pages currently with markdown content
+        DB::table('pages')->where('markdown', '!=', '')->update(['editor' => 'markdown']);
+        // We set it to 'wysiwyg' where we have HTML but no markdown
+        DB::table('pages')->where('markdown', '=', '')
+            ->where('html', '!=', '')
+            ->update(['editor' => 'wysiwyg']);
+
+        // Give the admin user permission to change the editor
+        $adminRoleId = DB::table('roles')->where('system_name', '=', 'admin')->first()->id;
+
+        $permissionId = DB::table('role_permissions')->insertGetId([
+            'name'         => 'editor-change',
+            'display_name' => 'Change page editor',
+            'created_at'   => Carbon::now()->toDateTimeString(),
+            'updated_at'   => Carbon::now()->toDateTimeString(),
+        ]);
+
+        DB::table('permission_role')->insert([
+            'role_id'       => $adminRoleId,
+            'permission_id' => $permissionId,
+        ]);
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        // Drop the new column from the pages table
+        Schema::table('pages', function (Blueprint $table) {
+            $table->dropColumn('editor');
+        });
+
+        // Remove traces of the role permission
+        DB::table('role_permissions')->where('name', '=', 'editor-change')->delete();
+    }
+}
diff --git a/database/migrations/2022_04_25_140741_update_polymorphic_types.php b/database/migrations/2022_04_25_140741_update_polymorphic_types.php
new file mode 100644 (file)
index 0000000..9f312bf
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Support\Facades\DB;
+
+class UpdatePolymorphicTypes extends Migration
+{
+    /**
+     * Mapping of old polymorphic types to new simpler values.
+     */
+    protected $changeMap = [
+        'BookStack\\Bookshelf' => 'bookshelf',
+        'BookStack\\Book'      => 'book',
+        'BookStack\\Chapter'   => 'chapter',
+        'BookStack\\Page'      => 'page',
+    ];
+
+    /**
+     * Mapping of tables and columns that contain polymorphic types.
+     */
+    protected $columnsByTable = [
+        'activities'         => 'entity_type',
+        'comments'           => 'entity_type',
+        'deletions'          => 'deletable_type',
+        'entity_permissions' => 'restrictable_type',
+        'favourites'         => 'favouritable_type',
+        'joint_permissions'  => 'entity_type',
+        'search_terms'       => 'entity_type',
+        'tags'               => 'entity_type',
+        'views'              => 'viewable_type',
+    ];
+
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        foreach ($this->columnsByTable as $table => $column) {
+            foreach ($this->changeMap as $oldVal => $newVal) {
+                DB::table($table)
+                    ->where([$column => $oldVal])
+                    ->update([$column => $newVal]);
+            }
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        foreach ($this->columnsByTable as $table => $column) {
+            foreach ($this->changeMap as $oldVal => $newVal) {
+                DB::table($table)
+                    ->where([$column => $newVal])
+                    ->update([$column => $oldVal]);
+            }
+        }
+    }
+}
diff --git a/dev/api/responses/recycle-bin-destroy.json b/dev/api/responses/recycle-bin-destroy.json
new file mode 100644 (file)
index 0000000..21cfc40
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "delete_count": 2
+}
\ No newline at end of file
diff --git a/dev/api/responses/recycle-bin-list.json b/dev/api/responses/recycle-bin-list.json
new file mode 100644 (file)
index 0000000..8530708
--- /dev/null
@@ -0,0 +1,64 @@
+{
+  "data": [
+    {
+      "id": 18,
+      "deleted_by": 1,
+      "created_at": "2022-04-20T12:57:46.000000Z",
+      "updated_at": "2022-04-20T12:57:46.000000Z",
+      "deletable_type": "page",
+      "deletable_id": 2582,
+      "deletable": {
+        "id": 2582,
+        "book_id": 25,
+        "chapter_id": 0,
+        "name": "A Wonderful Page",
+        "slug": "a-wonderful-page",
+        "priority": 9,
+        "created_at": "2022-02-08T00:44:45.000000Z",
+        "updated_at": "2022-04-20T12:57:46.000000Z",
+        "created_by": 1,
+        "updated_by": 1,
+        "draft": false,
+        "revision_count": 1,
+        "template": false,
+        "owned_by": 1,
+        "editor": "wysiwyg",
+        "book_slug": "a-great-book",
+        "parent": {
+          "id": 25,
+          "name": "A Great Book",
+          "slug": "a-great-book",
+          "description": "",
+          "created_at": "2022-01-24T16:14:28.000000Z",
+          "updated_at": "2022-03-06T15:14:50.000000Z",
+          "created_by": 1,
+          "updated_by": 1,
+          "owned_by": 1,
+          "type": "book"
+        }
+      }
+    },
+    {
+      "id": 19,
+      "deleted_by": 1,
+      "created_at": "2022-04-25T16:07:46.000000Z",
+      "updated_at": "2022-04-25T16:07:46.000000Z",
+      "deletable_type": "book",
+      "deletable_id": 13,
+      "deletable": {
+        "id": 13,
+        "name": "A Big Book!",
+        "slug": "a-big-book",
+        "description": "This is a very large book with loads of cool stuff in it!",
+        "created_at": "2021-11-08T11:26:43.000000Z",
+        "updated_at": "2022-04-25T16:07:47.000000Z",
+        "created_by": 27,
+        "updated_by": 1,
+        "owned_by": 1,
+        "pages_count": 208,
+        "chapters_count": 50
+      }
+    }
+  ],
+  "total": 2
+}
\ No newline at end of file
diff --git a/dev/api/responses/recycle-bin-restore.json b/dev/api/responses/recycle-bin-restore.json
new file mode 100644 (file)
index 0000000..ac5c948
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "restore_count": 2
+}
\ No newline at end of file
diff --git a/dev/build/esbuild.js b/dev/build/esbuild.js
new file mode 100644 (file)
index 0000000..4635703
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/env node
+
+const esbuild = require('esbuild');
+const fs = require('fs');
+const path = require('path');
+
+// Check if we're building for production
+// (Set via passing `production` as first argument)
+const isProd = process.argv[2] === 'production';
+
+// Gather our input files
+const jsInDir = path.join(__dirname, '../../resources/js');
+const jsInDirFiles = fs.readdirSync(jsInDir, 'utf8');
+const entryFiles = jsInDirFiles
+    .filter(f => f.endsWith('.js') || f.endsWith('.mjs'))
+    .map(f => path.join(jsInDir, f));
+
+// Locate our output directory
+const outDir = path.join(__dirname, '../../public/dist');
+
+// Build via esbuild
+esbuild.build({
+    bundle: true,
+    entryPoints: entryFiles,
+    outdir: outDir,
+    sourcemap: true,
+    target: 'es2020',
+    mainFields: ['module', 'main'],
+    format: 'esm',
+    minify: isProd,
+    logLevel: "info",
+}).catch(() => process.exit(1));
\ No newline at end of file
index dd4f0228d5fbce6f28753747003674bb921379eb..7f0df22827f0d874439831c512f6a3c66ba13b0a 100644 (file)
       },
       "devDependencies": {
         "chokidar-cli": "^3.0",
-        "esbuild": "0.14.27",
+        "esbuild": "0.14.36",
         "livereload": "^0.9.3",
         "npm-run-all": "^4.1.5",
         "punycode": "^2.1.1",
-        "sass": "^1.49.9"
+        "sass": "^1.50.0"
       }
     },
     "node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
       "dev": true,
       "engines": {
         "node": ">=6"
       }
     },
     "node_modules/esbuild": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.27.tgz",
-      "integrity": "sha512-MZQt5SywZS3hA9fXnMhR22dv0oPGh6QtjJRIYbgL1AeqAoQZE+Qn5ppGYQAoHv/vq827flj4tIJ79Mrdiwk46Q==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.36.tgz",
+      "integrity": "sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw==",
       "dev": true,
       "hasInstallScript": true,
       "bin": {
         "node": ">=12"
       },
       "optionalDependencies": {
-        "esbuild-android-64": "0.14.27",
-        "esbuild-android-arm64": "0.14.27",
-        "esbuild-darwin-64": "0.14.27",
-        "esbuild-darwin-arm64": "0.14.27",
-        "esbuild-freebsd-64": "0.14.27",
-        "esbuild-freebsd-arm64": "0.14.27",
-        "esbuild-linux-32": "0.14.27",
-        "esbuild-linux-64": "0.14.27",
-        "esbuild-linux-arm": "0.14.27",
-        "esbuild-linux-arm64": "0.14.27",
-        "esbuild-linux-mips64le": "0.14.27",
-        "esbuild-linux-ppc64le": "0.14.27",
-        "esbuild-linux-riscv64": "0.14.27",
-        "esbuild-linux-s390x": "0.14.27",
-        "esbuild-netbsd-64": "0.14.27",
-        "esbuild-openbsd-64": "0.14.27",
-        "esbuild-sunos-64": "0.14.27",
-        "esbuild-windows-32": "0.14.27",
-        "esbuild-windows-64": "0.14.27",
-        "esbuild-windows-arm64": "0.14.27"
+        "esbuild-android-64": "0.14.36",
+        "esbuild-android-arm64": "0.14.36",
+        "esbuild-darwin-64": "0.14.36",
+        "esbuild-darwin-arm64": "0.14.36",
+        "esbuild-freebsd-64": "0.14.36",
+        "esbuild-freebsd-arm64": "0.14.36",
+        "esbuild-linux-32": "0.14.36",
+        "esbuild-linux-64": "0.14.36",
+        "esbuild-linux-arm": "0.14.36",
+        "esbuild-linux-arm64": "0.14.36",
+        "esbuild-linux-mips64le": "0.14.36",
+        "esbuild-linux-ppc64le": "0.14.36",
+        "esbuild-linux-riscv64": "0.14.36",
+        "esbuild-linux-s390x": "0.14.36",
+        "esbuild-netbsd-64": "0.14.36",
+        "esbuild-openbsd-64": "0.14.36",
+        "esbuild-sunos-64": "0.14.36",
+        "esbuild-windows-32": "0.14.36",
+        "esbuild-windows-64": "0.14.36",
+        "esbuild-windows-arm64": "0.14.36"
       }
     },
     "node_modules/esbuild-android-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.27.tgz",
-      "integrity": "sha512-LuEd4uPuj/16Y8j6kqy3Z2E9vNY9logfq8Tq+oTE2PZVuNs3M1kj5Qd4O95ee66yDGb3isaOCV7sOLDwtMfGaQ==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.36.tgz",
+      "integrity": "sha512-jwpBhF1jmo0tVCYC/ORzVN+hyVcNZUWuozGcLHfod0RJCedTDTvR4nwlTXdx1gtncDqjk33itjO+27OZHbiavw==",
       "cpu": [
         "x64"
       ],
       }
     },
     "node_modules/esbuild-android-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.27.tgz",
-      "integrity": "sha512-E8Ktwwa6vX8q7QeJmg8yepBYXaee50OdQS3BFtEHKrzbV45H4foMOeEE7uqdjGQZFBap5VAqo7pvjlyA92wznQ==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.36.tgz",
+      "integrity": "sha512-/hYkyFe7x7Yapmfv4X/tBmyKnggUmdQmlvZ8ZlBnV4+PjisrEhAvC3yWpURuD9XoB8Wa1d5dGkTsF53pIvpjsg==",
       "cpu": [
         "arm64"
       ],
       }
     },
     "node_modules/esbuild-darwin-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.27.tgz",
-      "integrity": "sha512-czw/kXl/1ZdenPWfw9jDc5iuIYxqUxgQ/Q+hRd4/3udyGGVI31r29LCViN2bAJgGvQkqyLGVcG03PJPEXQ5i2g==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.36.tgz",
+      "integrity": "sha512-kkl6qmV0dTpyIMKagluzYqlc1vO0ecgpviK/7jwPbRDEv5fejRTaBBEE2KxEQbTHcLhiiDbhG7d5UybZWo/1zQ==",
       "cpu": [
         "x64"
       ],
       }
     },
     "node_modules/esbuild-darwin-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.27.tgz",
-      "integrity": "sha512-BEsv2U2U4o672oV8+xpXNxN9bgqRCtddQC6WBh4YhXKDcSZcdNh7+6nS+DM2vu7qWIWNA4JbRG24LUUYXysimQ==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz",
+      "integrity": "sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw==",
       "cpu": [
         "arm64"
       ],
       }
     },
     "node_modules/esbuild-freebsd-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.27.tgz",
-      "integrity": "sha512-7FeiFPGBo+ga+kOkDxtPmdPZdayrSzsV9pmfHxcyLKxu+3oTcajeZlOO1y9HW+t5aFZPiv7czOHM4KNd0tNwCA==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.36.tgz",
+      "integrity": "sha512-Hn8AYuxXXRptybPqoMkga4HRFE7/XmhtlQjXFHoAIhKUPPMeJH35GYEUWGbjteai9FLFvBAjEAlwEtSGxnqWww==",
       "cpu": [
         "x64"
       ],
       }
     },
     "node_modules/esbuild-freebsd-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.27.tgz",
-      "integrity": "sha512-8CK3++foRZJluOWXpllG5zwAVlxtv36NpHfsbWS7TYlD8S+QruXltKlXToc/5ZNzBK++l6rvRKELu/puCLc7jA==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.36.tgz",
+      "integrity": "sha512-S3C0attylLLRiCcHiJd036eDEMOY32+h8P+jJ3kTcfhJANNjP0TNBNL30TZmEdOSx/820HJFgRrqpNAvTbjnDA==",
       "cpu": [
         "arm64"
       ],
       }
     },
     "node_modules/esbuild-linux-32": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.27.tgz",
-      "integrity": "sha512-qhNYIcT+EsYSBClZ5QhLzFzV5iVsP1YsITqblSaztr3+ZJUI+GoK8aXHyzKd7/CKKuK93cxEMJPpfi1dfsOfdw==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.36.tgz",
+      "integrity": "sha512-Eh9OkyTrEZn9WGO4xkI3OPPpUX7p/3QYvdG0lL4rfr73Ap2HAr6D9lP59VMF64Ex01LhHSXwIsFG/8AQjh6eNw==",
       "cpu": [
         "ia32"
       ],
       }
     },
     "node_modules/esbuild-linux-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.27.tgz",
-      "integrity": "sha512-ESjck9+EsHoTaKWlFKJpPZRN26uiav5gkI16RuI8WBxUdLrrAlYuYSndxxKgEn1csd968BX/8yQZATYf/9+/qg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.36.tgz",
+      "integrity": "sha512-vFVFS5ve7PuwlfgoWNyRccGDi2QTNkQo/2k5U5ttVD0jRFaMlc8UQee708fOZA6zTCDy5RWsT5MJw3sl2X6KDg==",
       "cpu": [
         "x64"
       ],
       }
     },
     "node_modules/esbuild-linux-arm": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.27.tgz",
-      "integrity": "sha512-JnnmgUBdqLQO9hoNZQqNHFWlNpSX82vzB3rYuCJMhtkuaWQEmQz6Lec1UIxJdC38ifEghNTBsF9bbe8dFilnCw==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.36.tgz",
+      "integrity": "sha512-NhgU4n+NCsYgt7Hy61PCquEz5aevI6VjQvxwBxtxrooXsxt5b2xtOUXYZe04JxqQo+XZk3d1gcr7pbV9MAQ/Lg==",
       "cpu": [
         "arm"
       ],
       }
     },
     "node_modules/esbuild-linux-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.27.tgz",
-      "integrity": "sha512-no6Mi17eV2tHlJnqBHRLekpZ2/VYx+NfGxKcBE/2xOMYwctsanCaXxw4zapvNrGE9X38vefVXLz6YCF8b1EHiQ==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.36.tgz",
+      "integrity": "sha512-24Vq1M7FdpSmaTYuu1w0Hdhiqkbto1I5Pjyi+4Cdw5fJKGlwQuw+hWynTcRI/cOZxBcBpP21gND7W27gHAiftw==",
       "cpu": [
         "arm64"
       ],
       }
     },
     "node_modules/esbuild-linux-mips64le": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.27.tgz",
-      "integrity": "sha512-NolWP2uOvIJpbwpsDbwfeExZOY1bZNlWE/kVfkzLMsSgqeVcl5YMen/cedRe9mKnpfLli+i0uSp7N+fkKNU27A==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.36.tgz",
+      "integrity": "sha512-hZUeTXvppJN+5rEz2EjsOFM9F1bZt7/d2FUM1lmQo//rXh1RTFYzhC0txn7WV0/jCC7SvrGRaRz0NMsRPf8SIA==",
       "cpu": [
         "mips64el"
       ],
       }
     },
     "node_modules/esbuild-linux-ppc64le": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.27.tgz",
-      "integrity": "sha512-/7dTjDvXMdRKmsSxKXeWyonuGgblnYDn0MI1xDC7J1VQXny8k1qgNp6VmrlsawwnsymSUUiThhkJsI+rx0taNA==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.36.tgz",
+      "integrity": "sha512-1Bg3QgzZjO+QtPhP9VeIBhAduHEc2kzU43MzBnMwpLSZ890azr4/A9Dganun8nsqD/1TBcqhId0z4mFDO8FAvg==",
       "cpu": [
         "ppc64"
       ],
       }
     },
     "node_modules/esbuild-linux-riscv64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.27.tgz",
-      "integrity": "sha512-D+aFiUzOJG13RhrSmZgrcFaF4UUHpqj7XSKrIiCXIj1dkIkFqdrmqMSOtSs78dOtObWiOrFCDDzB24UyeEiNGg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.36.tgz",
+      "integrity": "sha512-dOE5pt3cOdqEhaufDRzNCHf5BSwxgygVak9UR7PH7KPVHwSTDAZHDoEjblxLqjJYpc5XaU9+gKJ9F8mp9r5I4A==",
       "cpu": [
         "riscv64"
       ],
       }
     },
     "node_modules/esbuild-linux-s390x": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.27.tgz",
-      "integrity": "sha512-CD/D4tj0U4UQjELkdNlZhQ8nDHU5rBn6NGp47Hiz0Y7/akAY5i0oGadhEIg0WCY/HYVXFb3CsSPPwaKcTOW3bg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.36.tgz",
+      "integrity": "sha512-g4FMdh//BBGTfVHjF6MO7Cz8gqRoDPzXWxRvWkJoGroKA18G9m0wddvPbEqcQf5Tbt2vSc1CIgag7cXwTmoTXg==",
       "cpu": [
         "s390x"
       ],
       }
     },
     "node_modules/esbuild-netbsd-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.27.tgz",
-      "integrity": "sha512-h3mAld69SrO1VoaMpYl3a5FNdGRE/Nqc+E8VtHOag4tyBwhCQXxtvDDOAKOUQexBGca0IuR6UayQ4ntSX5ij1Q==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.36.tgz",
+      "integrity": "sha512-UB2bVImxkWk4vjnP62ehFNZ73lQY1xcnL5ZNYF3x0AG+j8HgdkNF05v67YJdCIuUJpBuTyCK8LORCYo9onSW+A==",
       "cpu": [
         "x64"
       ],
       }
     },
     "node_modules/esbuild-openbsd-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.27.tgz",
-      "integrity": "sha512-xwSje6qIZaDHXWoPpIgvL+7fC6WeubHHv18tusLYMwL+Z6bEa4Pbfs5IWDtQdHkArtfxEkIZz77944z8MgDxGw==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.36.tgz",
+      "integrity": "sha512-NvGB2Chf8GxuleXRGk8e9zD3aSdRO5kLt9coTQbCg7WMGXeX471sBgh4kSg8pjx0yTXRt0MlrUDnjVYnetyivg==",
       "cpu": [
         "x64"
       ],
       }
     },
     "node_modules/esbuild-sunos-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.27.tgz",
-      "integrity": "sha512-/nBVpWIDjYiyMhuqIqbXXsxBc58cBVH9uztAOIfWShStxq9BNBik92oPQPJ57nzWXRNKQUEFWr4Q98utDWz7jg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.36.tgz",
+      "integrity": "sha512-VkUZS5ftTSjhRjuRLp+v78auMO3PZBXu6xl4ajomGenEm2/rGuWlhFSjB7YbBNErOchj51Jb2OK8lKAo8qdmsQ==",
       "cpu": [
         "x64"
       ],
       }
     },
     "node_modules/esbuild-windows-32": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.27.tgz",
-      "integrity": "sha512-Q9/zEjhZJ4trtWhFWIZvS/7RUzzi8rvkoaS9oiizkHTTKd8UxFwn/Mm2OywsAfYymgUYm8+y2b+BKTNEFxUekw==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.36.tgz",
+      "integrity": "sha512-bIar+A6hdytJjZrDxfMBUSEHHLfx3ynoEZXx/39nxy86pX/w249WZm8Bm0dtOAByAf4Z6qV0LsnTIJHiIqbw0w==",
       "cpu": [
         "ia32"
       ],
       }
     },
     "node_modules/esbuild-windows-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.27.tgz",
-      "integrity": "sha512-b3y3vTSl5aEhWHK66ngtiS/c6byLf6y/ZBvODH1YkBM+MGtVL6jN38FdHUsZasCz9gFwYs/lJMVY9u7GL6wfYg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.36.tgz",
+      "integrity": "sha512-+p4MuRZekVChAeueT1Y9LGkxrT5x7YYJxYE8ZOTcEfeUUN43vktSn6hUNsvxzzATrSgq5QqRdllkVBxWZg7KqQ==",
       "cpu": [
         "x64"
       ],
       }
     },
     "node_modules/esbuild-windows-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.27.tgz",
-      "integrity": "sha512-I/reTxr6TFMcR5qbIkwRGvldMIaiBu2+MP0LlD7sOlNXrfqIl9uNjsuxFPGEG4IRomjfQ5q8WT+xlF/ySVkqKg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.36.tgz",
+      "integrity": "sha512-fBB4WlDqV1m18EF/aheGYQkQZHfPHiHJSBYzXIo8yKehek+0BtBwo/4PNwKGJ5T0YK0oc8pBKjgwPbzSrPLb+Q==",
       "cpu": [
         "arm64"
       ],
       }
     },
     "node_modules/sass": {
-      "version": "1.49.9",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz",
-      "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==",
+      "version": "1.50.0",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.0.tgz",
+      "integrity": "sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ==",
       "dev": true,
       "dependencies": {
         "chokidar": ">=3.0.0 <4.0.0",
   },
   "dependencies": {
     "ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
       "dev": true
     },
     "ansi-styles": {
       }
     },
     "esbuild": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.27.tgz",
-      "integrity": "sha512-MZQt5SywZS3hA9fXnMhR22dv0oPGh6QtjJRIYbgL1AeqAoQZE+Qn5ppGYQAoHv/vq827flj4tIJ79Mrdiwk46Q==",
-      "dev": true,
-      "requires": {
-        "esbuild-android-64": "0.14.27",
-        "esbuild-android-arm64": "0.14.27",
-        "esbuild-darwin-64": "0.14.27",
-        "esbuild-darwin-arm64": "0.14.27",
-        "esbuild-freebsd-64": "0.14.27",
-        "esbuild-freebsd-arm64": "0.14.27",
-        "esbuild-linux-32": "0.14.27",
-        "esbuild-linux-64": "0.14.27",
-        "esbuild-linux-arm": "0.14.27",
-        "esbuild-linux-arm64": "0.14.27",
-        "esbuild-linux-mips64le": "0.14.27",
-        "esbuild-linux-ppc64le": "0.14.27",
-        "esbuild-linux-riscv64": "0.14.27",
-        "esbuild-linux-s390x": "0.14.27",
-        "esbuild-netbsd-64": "0.14.27",
-        "esbuild-openbsd-64": "0.14.27",
-        "esbuild-sunos-64": "0.14.27",
-        "esbuild-windows-32": "0.14.27",
-        "esbuild-windows-64": "0.14.27",
-        "esbuild-windows-arm64": "0.14.27"
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.36.tgz",
+      "integrity": "sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw==",
+      "dev": true,
+      "requires": {
+        "esbuild-android-64": "0.14.36",
+        "esbuild-android-arm64": "0.14.36",
+        "esbuild-darwin-64": "0.14.36",
+        "esbuild-darwin-arm64": "0.14.36",
+        "esbuild-freebsd-64": "0.14.36",
+        "esbuild-freebsd-arm64": "0.14.36",
+        "esbuild-linux-32": "0.14.36",
+        "esbuild-linux-64": "0.14.36",
+        "esbuild-linux-arm": "0.14.36",
+        "esbuild-linux-arm64": "0.14.36",
+        "esbuild-linux-mips64le": "0.14.36",
+        "esbuild-linux-ppc64le": "0.14.36",
+        "esbuild-linux-riscv64": "0.14.36",
+        "esbuild-linux-s390x": "0.14.36",
+        "esbuild-netbsd-64": "0.14.36",
+        "esbuild-openbsd-64": "0.14.36",
+        "esbuild-sunos-64": "0.14.36",
+        "esbuild-windows-32": "0.14.36",
+        "esbuild-windows-64": "0.14.36",
+        "esbuild-windows-arm64": "0.14.36"
       }
     },
     "esbuild-android-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.27.tgz",
-      "integrity": "sha512-LuEd4uPuj/16Y8j6kqy3Z2E9vNY9logfq8Tq+oTE2PZVuNs3M1kj5Qd4O95ee66yDGb3isaOCV7sOLDwtMfGaQ==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.36.tgz",
+      "integrity": "sha512-jwpBhF1jmo0tVCYC/ORzVN+hyVcNZUWuozGcLHfod0RJCedTDTvR4nwlTXdx1gtncDqjk33itjO+27OZHbiavw==",
       "dev": true,
       "optional": true
     },
     "esbuild-android-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.27.tgz",
-      "integrity": "sha512-E8Ktwwa6vX8q7QeJmg8yepBYXaee50OdQS3BFtEHKrzbV45H4foMOeEE7uqdjGQZFBap5VAqo7pvjlyA92wznQ==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.36.tgz",
+      "integrity": "sha512-/hYkyFe7x7Yapmfv4X/tBmyKnggUmdQmlvZ8ZlBnV4+PjisrEhAvC3yWpURuD9XoB8Wa1d5dGkTsF53pIvpjsg==",
       "dev": true,
       "optional": true
     },
     "esbuild-darwin-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.27.tgz",
-      "integrity": "sha512-czw/kXl/1ZdenPWfw9jDc5iuIYxqUxgQ/Q+hRd4/3udyGGVI31r29LCViN2bAJgGvQkqyLGVcG03PJPEXQ5i2g==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.36.tgz",
+      "integrity": "sha512-kkl6qmV0dTpyIMKagluzYqlc1vO0ecgpviK/7jwPbRDEv5fejRTaBBEE2KxEQbTHcLhiiDbhG7d5UybZWo/1zQ==",
       "dev": true,
       "optional": true
     },
     "esbuild-darwin-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.27.tgz",
-      "integrity": "sha512-BEsv2U2U4o672oV8+xpXNxN9bgqRCtddQC6WBh4YhXKDcSZcdNh7+6nS+DM2vu7qWIWNA4JbRG24LUUYXysimQ==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz",
+      "integrity": "sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw==",
       "dev": true,
       "optional": true
     },
     "esbuild-freebsd-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.27.tgz",
-      "integrity": "sha512-7FeiFPGBo+ga+kOkDxtPmdPZdayrSzsV9pmfHxcyLKxu+3oTcajeZlOO1y9HW+t5aFZPiv7czOHM4KNd0tNwCA==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.36.tgz",
+      "integrity": "sha512-Hn8AYuxXXRptybPqoMkga4HRFE7/XmhtlQjXFHoAIhKUPPMeJH35GYEUWGbjteai9FLFvBAjEAlwEtSGxnqWww==",
       "dev": true,
       "optional": true
     },
     "esbuild-freebsd-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.27.tgz",
-      "integrity": "sha512-8CK3++foRZJluOWXpllG5zwAVlxtv36NpHfsbWS7TYlD8S+QruXltKlXToc/5ZNzBK++l6rvRKELu/puCLc7jA==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.36.tgz",
+      "integrity": "sha512-S3C0attylLLRiCcHiJd036eDEMOY32+h8P+jJ3kTcfhJANNjP0TNBNL30TZmEdOSx/820HJFgRrqpNAvTbjnDA==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-32": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.27.tgz",
-      "integrity": "sha512-qhNYIcT+EsYSBClZ5QhLzFzV5iVsP1YsITqblSaztr3+ZJUI+GoK8aXHyzKd7/CKKuK93cxEMJPpfi1dfsOfdw==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.36.tgz",
+      "integrity": "sha512-Eh9OkyTrEZn9WGO4xkI3OPPpUX7p/3QYvdG0lL4rfr73Ap2HAr6D9lP59VMF64Ex01LhHSXwIsFG/8AQjh6eNw==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.27.tgz",
-      "integrity": "sha512-ESjck9+EsHoTaKWlFKJpPZRN26uiav5gkI16RuI8WBxUdLrrAlYuYSndxxKgEn1csd968BX/8yQZATYf/9+/qg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.36.tgz",
+      "integrity": "sha512-vFVFS5ve7PuwlfgoWNyRccGDi2QTNkQo/2k5U5ttVD0jRFaMlc8UQee708fOZA6zTCDy5RWsT5MJw3sl2X6KDg==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-arm": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.27.tgz",
-      "integrity": "sha512-JnnmgUBdqLQO9hoNZQqNHFWlNpSX82vzB3rYuCJMhtkuaWQEmQz6Lec1UIxJdC38ifEghNTBsF9bbe8dFilnCw==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.36.tgz",
+      "integrity": "sha512-NhgU4n+NCsYgt7Hy61PCquEz5aevI6VjQvxwBxtxrooXsxt5b2xtOUXYZe04JxqQo+XZk3d1gcr7pbV9MAQ/Lg==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.27.tgz",
-      "integrity": "sha512-no6Mi17eV2tHlJnqBHRLekpZ2/VYx+NfGxKcBE/2xOMYwctsanCaXxw4zapvNrGE9X38vefVXLz6YCF8b1EHiQ==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.36.tgz",
+      "integrity": "sha512-24Vq1M7FdpSmaTYuu1w0Hdhiqkbto1I5Pjyi+4Cdw5fJKGlwQuw+hWynTcRI/cOZxBcBpP21gND7W27gHAiftw==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-mips64le": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.27.tgz",
-      "integrity": "sha512-NolWP2uOvIJpbwpsDbwfeExZOY1bZNlWE/kVfkzLMsSgqeVcl5YMen/cedRe9mKnpfLli+i0uSp7N+fkKNU27A==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.36.tgz",
+      "integrity": "sha512-hZUeTXvppJN+5rEz2EjsOFM9F1bZt7/d2FUM1lmQo//rXh1RTFYzhC0txn7WV0/jCC7SvrGRaRz0NMsRPf8SIA==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-ppc64le": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.27.tgz",
-      "integrity": "sha512-/7dTjDvXMdRKmsSxKXeWyonuGgblnYDn0MI1xDC7J1VQXny8k1qgNp6VmrlsawwnsymSUUiThhkJsI+rx0taNA==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.36.tgz",
+      "integrity": "sha512-1Bg3QgzZjO+QtPhP9VeIBhAduHEc2kzU43MzBnMwpLSZ890azr4/A9Dganun8nsqD/1TBcqhId0z4mFDO8FAvg==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-riscv64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.27.tgz",
-      "integrity": "sha512-D+aFiUzOJG13RhrSmZgrcFaF4UUHpqj7XSKrIiCXIj1dkIkFqdrmqMSOtSs78dOtObWiOrFCDDzB24UyeEiNGg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.36.tgz",
+      "integrity": "sha512-dOE5pt3cOdqEhaufDRzNCHf5BSwxgygVak9UR7PH7KPVHwSTDAZHDoEjblxLqjJYpc5XaU9+gKJ9F8mp9r5I4A==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-s390x": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.27.tgz",
-      "integrity": "sha512-CD/D4tj0U4UQjELkdNlZhQ8nDHU5rBn6NGp47Hiz0Y7/akAY5i0oGadhEIg0WCY/HYVXFb3CsSPPwaKcTOW3bg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.36.tgz",
+      "integrity": "sha512-g4FMdh//BBGTfVHjF6MO7Cz8gqRoDPzXWxRvWkJoGroKA18G9m0wddvPbEqcQf5Tbt2vSc1CIgag7cXwTmoTXg==",
       "dev": true,
       "optional": true
     },
     "esbuild-netbsd-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.27.tgz",
-      "integrity": "sha512-h3mAld69SrO1VoaMpYl3a5FNdGRE/Nqc+E8VtHOag4tyBwhCQXxtvDDOAKOUQexBGca0IuR6UayQ4ntSX5ij1Q==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.36.tgz",
+      "integrity": "sha512-UB2bVImxkWk4vjnP62ehFNZ73lQY1xcnL5ZNYF3x0AG+j8HgdkNF05v67YJdCIuUJpBuTyCK8LORCYo9onSW+A==",
       "dev": true,
       "optional": true
     },
     "esbuild-openbsd-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.27.tgz",
-      "integrity": "sha512-xwSje6qIZaDHXWoPpIgvL+7fC6WeubHHv18tusLYMwL+Z6bEa4Pbfs5IWDtQdHkArtfxEkIZz77944z8MgDxGw==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.36.tgz",
+      "integrity": "sha512-NvGB2Chf8GxuleXRGk8e9zD3aSdRO5kLt9coTQbCg7WMGXeX471sBgh4kSg8pjx0yTXRt0MlrUDnjVYnetyivg==",
       "dev": true,
       "optional": true
     },
     "esbuild-sunos-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.27.tgz",
-      "integrity": "sha512-/nBVpWIDjYiyMhuqIqbXXsxBc58cBVH9uztAOIfWShStxq9BNBik92oPQPJ57nzWXRNKQUEFWr4Q98utDWz7jg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.36.tgz",
+      "integrity": "sha512-VkUZS5ftTSjhRjuRLp+v78auMO3PZBXu6xl4ajomGenEm2/rGuWlhFSjB7YbBNErOchj51Jb2OK8lKAo8qdmsQ==",
       "dev": true,
       "optional": true
     },
     "esbuild-windows-32": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.27.tgz",
-      "integrity": "sha512-Q9/zEjhZJ4trtWhFWIZvS/7RUzzi8rvkoaS9oiizkHTTKd8UxFwn/Mm2OywsAfYymgUYm8+y2b+BKTNEFxUekw==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.36.tgz",
+      "integrity": "sha512-bIar+A6hdytJjZrDxfMBUSEHHLfx3ynoEZXx/39nxy86pX/w249WZm8Bm0dtOAByAf4Z6qV0LsnTIJHiIqbw0w==",
       "dev": true,
       "optional": true
     },
     "esbuild-windows-64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.27.tgz",
-      "integrity": "sha512-b3y3vTSl5aEhWHK66ngtiS/c6byLf6y/ZBvODH1YkBM+MGtVL6jN38FdHUsZasCz9gFwYs/lJMVY9u7GL6wfYg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.36.tgz",
+      "integrity": "sha512-+p4MuRZekVChAeueT1Y9LGkxrT5x7YYJxYE8ZOTcEfeUUN43vktSn6hUNsvxzzATrSgq5QqRdllkVBxWZg7KqQ==",
       "dev": true,
       "optional": true
     },
     "esbuild-windows-arm64": {
-      "version": "0.14.27",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.27.tgz",
-      "integrity": "sha512-I/reTxr6TFMcR5qbIkwRGvldMIaiBu2+MP0LlD7sOlNXrfqIl9uNjsuxFPGEG4IRomjfQ5q8WT+xlF/ySVkqKg==",
+      "version": "0.14.36",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.36.tgz",
+      "integrity": "sha512-fBB4WlDqV1m18EF/aheGYQkQZHfPHiHJSBYzXIo8yKehek+0BtBwo/4PNwKGJ5T0YK0oc8pBKjgwPbzSrPLb+Q==",
       "dev": true,
       "optional": true
     },
       }
     },
     "sass": {
-      "version": "1.49.9",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz",
-      "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==",
+      "version": "1.50.0",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.0.tgz",
+      "integrity": "sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ==",
       "dev": true,
       "requires": {
         "chokidar": ">=3.0.0 <4.0.0",
index 054015009168bb989560cb20caf7b10be9b5f788..b49a2a07f32b7196b7c8d1c503529adfa51eb0b4 100644 (file)
@@ -4,9 +4,9 @@
     "build:css:dev": "sass ./resources/sass:./public/dist",
     "build:css:watch": "sass ./resources/sass:./public/dist --watch",
     "build:css:production": "sass ./resources/sass:./public/dist -s compressed",
-    "build:js:dev": "esbuild --bundle ./resources/js/*.{js,mjs} --outdir=public/dist/ --sourcemap --target=es2020 --main-fields=module,main --format=esm",
+    "build:js:dev": "node dev/build/esbuild.js",
     "build:js:watch": "chokidar --initial \"./resources/**/*.js\" -c \"npm run build:js:dev\"",
-    "build:js:production": "NODE_ENV=production esbuild --bundle ./resources/js/*.{js,mjs} --outdir=public/dist/ --sourcemap --target=es2020 --main-fields=module,main --minify --format=esm",
+    "build:js:production": "node dev/build/esbuild.js production",
     "build": "npm-run-all --parallel build:*:dev",
     "production": "npm-run-all --parallel build:*:production",
     "dev": "npm-run-all --parallel watch livereload",
   },
   "devDependencies": {
     "chokidar-cli": "^3.0",
-    "esbuild": "0.14.27",
+    "esbuild": "0.14.36",
     "livereload": "^0.9.3",
     "npm-run-all": "^4.1.5",
     "punycode": "^2.1.1",
-    "sass": "^1.49.9"
+    "sass": "^1.50.0"
   },
   "dependencies": {
     "clipboard": "^2.0.10",
diff --git a/resources/icons/swap-horizontal.svg b/resources/icons/swap-horizontal.svg
new file mode 100644 (file)
index 0000000..7bd25dd
--- /dev/null
@@ -0,0 +1 @@
+<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6.99 16H14v-2H6.99v-3L3 15l3.99 4ZM21 9l-3.99-4v3H10v2h7.01v3z"/></svg>
\ No newline at end of file
index 68de49b4a32740143e7fc6fe24e442c0e502af5e..d1c15c00a7e604742d566cdd80b280fd11f82135 100644 (file)
@@ -131,7 +131,7 @@ class AutoSuggest {
             return this.hideSuggestions();
         }
 
-        this.list.innerHTML = suggestions.map(value => `<li><button type="button">${escapeHtml(value)}</button></li>`).join('');
+        this.list.innerHTML = suggestions.map(value => `<li><button type="button" class="text-item">${escapeHtml(value)}</button></li>`).join('');
         this.list.style.display = 'block';
         for (const button of this.list.querySelectorAll('button')) {
             button.addEventListener('blur', this.hideSuggestionsIfFocusedLost.bind(this));
index f44de813de18bf93290e30a484a9ca3e921b26ac..4ee3531c58a7da957079a7a9ffb6c46aaaaf9c4c 100644 (file)
@@ -96,7 +96,7 @@ class CodeEditor {
         this.historyDropDown.classList.toggle('hidden', historyKeys.length === 0);
         this.historyList.innerHTML = historyKeys.map(key => {
              const localTime = (new Date(parseInt(key))).toLocaleTimeString();
-             return `<li><button type="button" data-time="${key}">${localTime}</button></li>`;
+             return `<li><button type="button" data-time="${key}" class="text-item">${localTime}</button></li>`;
         }).join('');
     }
 
diff --git a/resources/js/components/confirm-dialog.js b/resources/js/components/confirm-dialog.js
new file mode 100644 (file)
index 0000000..858be1b
--- /dev/null
@@ -0,0 +1,52 @@
+import {onSelect} from "../services/dom";
+
+/**
+ * Custom equivalent of window.confirm() using our popup component.
+ * Is promise based so can be used like so:
+ * `const result = await dialog.show()`
+ * @extends {Component}
+ */
+class ConfirmDialog {
+
+    setup() {
+        this.container = this.$el;
+        this.confirmButton = this.$refs.confirm;
+
+        this.res = null;
+
+        onSelect(this.confirmButton, () => {
+            this.sendResult(true);
+            this.getPopup().hide();
+        });
+    }
+
+    show() {
+        this.getPopup().show(null, () => {
+            this.sendResult(false);
+        });
+
+        return new Promise((res, rej) => {
+           this.res = res;
+        });
+    }
+
+    /**
+     * @returns {Popup}
+     */
+    getPopup() {
+        return this.container.components.popup;
+    }
+
+    /**
+     * @param {Boolean} result
+     */
+    sendResult(result) {
+        if (this.res) {
+            this.res(result)
+            this.res = null;
+        }
+    }
+
+}
+
+export default ConfirmDialog;
\ No newline at end of file
index fe348aba758a157562e2d48724f6066c22301d0e..6a4a8c2b08fc9096380fc225f361e28196883150 100644 (file)
@@ -10,6 +10,7 @@ import chapterToggle from "./chapter-toggle.js"
 import codeEditor from "./code-editor.js"
 import codeHighlighter from "./code-highlighter.js"
 import collapsible from "./collapsible.js"
+import confirmDialog from "./confirm-dialog"
 import customCheckbox from "./custom-checkbox.js"
 import detailsHighlighter from "./details-highlighter.js"
 import dropdown from "./dropdown.js"
@@ -26,7 +27,6 @@ import headerMobileToggle from "./header-mobile-toggle.js"
 import homepageControl from "./homepage-control.js"
 import imageManager from "./image-manager.js"
 import imagePicker from "./image-picker.js"
-import index from "./index.js"
 import listSortControl from "./list-sort-control.js"
 import markdownEditor from "./markdown-editor.js"
 import newUserPassword from "./new-user-password.js"
@@ -66,6 +66,7 @@ const componentMapping = {
     "code-editor": codeEditor,
     "code-highlighter": codeHighlighter,
     "collapsible": collapsible,
+    "confirm-dialog": confirmDialog,
     "custom-checkbox": customCheckbox,
     "details-highlighter": detailsHighlighter,
     "dropdown": dropdown,
@@ -82,7 +83,6 @@ const componentMapping = {
     "homepage-control": homepageControl,
     "image-manager": imageManager,
     "image-picker": imagePicker,
-    "index": index,
     "list-sort-control": listSortControl,
     "markdown-editor": markdownEditor,
     "new-user-password": newUserPassword,
index dae8071220720d6126c81f77406f88c77af5e2a0..ce123e987b055db94769f7326a8fdf63f841342b 100644 (file)
@@ -24,6 +24,8 @@ class PageEditor {
         this.draftDisplayIcon = this.$refs.draftDisplayIcon;
         this.changelogInput = this.$refs.changelogInput;
         this.changelogDisplay = this.$refs.changelogDisplay;
+        this.changeEditorButtons = this.$manyRefs.changeEditor;
+        this.switchDialogContainer = this.$refs.switchDialog;
 
         // Translations
         this.draftText = this.$opts.draftText;
@@ -72,6 +74,9 @@ class PageEditor {
         // Draft Controls
         onSelect(this.saveDraftButton, this.saveDraft.bind(this));
         onSelect(this.discardDraftButton, this.discardDraft.bind(this));
+
+        // Change editor controls
+        onSelect(this.changeEditorButtons, this.changeEditor.bind(this));
     }
 
     setInitialFocus() {
@@ -113,17 +118,21 @@ class PageEditor {
             data.markdown = this.editorMarkdown;
         }
 
+        let didSave = false;
         try {
             const resp = await window.$http.put(`/ajax/page/${this.pageId}/save-draft`, data);
             if (!this.isNewDraft) {
                 this.toggleDiscardDraftVisibility(true);
             }
+
             this.draftNotifyChange(`${resp.data.message} ${Dates.utcTimeStampToLocalTime(resp.data.timestamp)}`);
             this.autoSave.last = Date.now();
             if (resp.data.warning && !this.shownWarningsCache.has(resp.data.warning)) {
                 window.$events.emit('warning', resp.data.warning);
                 this.shownWarningsCache.add(resp.data.warning);
             }
+
+            didSave = true;
         } catch (err) {
             // Save the editor content in LocalStorage as a last resort, just in case.
             try {
@@ -134,6 +143,7 @@ class PageEditor {
             window.$events.emit('error', this.autosaveFailText);
         }
 
+        return didSave;
     }
 
     draftNotifyChange(text) {
@@ -185,6 +195,18 @@ class PageEditor {
         this.discardDraftWrap.classList.toggle('hidden', !show);
     }
 
+    async changeEditor(event) {
+        event.preventDefault();
+
+        const link = event.target.closest('a').href;
+        const dialog = this.switchDialogContainer.components['confirm-dialog'];
+        const [saved, confirmed] = await Promise.all([this.saveDraft(), dialog.show()]);
+
+        if (saved && confirmed) {
+            window.location = link;
+        }
+    }
+
 }
 
 export default PageEditor;
\ No newline at end of file
index 13cf69d2192c37b21b39edf8733fa7329ae22bf2..ec111963f51e65358c51d5d3333bd5d47fb8e55d 100644 (file)
@@ -34,7 +34,7 @@ class Popup {
     }
 
     hide(onComplete = null) {
-        fadeOut(this.container, 240, onComplete);
+        fadeOut(this.container, 120, onComplete);
         if (this.onkeyup) {
             window.removeEventListener('keyup', this.onkeyup);
             this.onkeyup = null;
@@ -45,7 +45,7 @@ class Popup {
     }
 
     show(onComplete = null, onHide = null) {
-        fadeIn(this.container, 240, onComplete);
+        fadeIn(this.container, 120, onComplete);
 
         this.onkeyup = (event) => {
             if (event.key === 'Escape') {
index 6e22919fb4d230556d99b6ce6a4382f077866af4..dfca832117f28b8c5ac12014a729bc0fc0610483 100644 (file)
@@ -43,6 +43,8 @@ function drawReceive(event) {
         drawEventSave(message);
     } else if (message.event === 'export') {
         drawEventExport(message);
+    } else if (message.event === 'configure') {
+        drawEventConfigure();
     }
 }
 
@@ -63,6 +65,12 @@ function drawEventInit() {
     });
 }
 
+function drawEventConfigure() {
+    const config = {};
+    window.$events.emitPublic(iFrame, 'editor-drawio::configure', {config});
+    drawPostMessage({action: 'configure', config});
+}
+
 function drawEventClose() {
     window.removeEventListener('message', drawReceive);
     if (iFrame) document.body.removeChild(iFrame);
index 3dc4c0473ec3bdebed52281978ed743d3c57dabf..dbb89bc8f7accbb3a2ec9cf365dc932eedb0a7e2 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'تم خفظ المسودة في ',
     'pages_edit_delete_draft' => 'حذف المسودة',
     'pages_edit_discard_draft' => 'التخلص من المسودة',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'تثبيت سجل التعديل',
     'pages_edit_enter_changelog_desc' => 'ضع وصف مختصر للتعديلات التي تمت',
     'pages_edit_enter_changelog' => 'أدخل سجل التعديل',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'حفظ الصفحة',
     'pages_title' => 'عنوان الصفحة',
     'pages_name' => 'اسم الصفحة',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'مراجعة #:id',
     'pages_revisions_numbered_changes' => 'مراجعة #: رقم تعريفي التغييرات',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'سجل التعديل',
     'pages_revisions_changes' => 'التعديلات',
     'pages_revisions_current' => 'النسخة الحالية',
index bbddd2f002831593d94091c9c44f342117354dc4..183e0b0b75f92309c3912fb062cef7d0fdd576ee 100755 (executable)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'تفعيل حماية أكبر لرفع الصور؟',
     'app_secure_images_toggle' => 'لمزيد من الحماية',
     'app_secure_images_desc' => 'لتحسين أداء النظام, ستكون جميع الصور متاحة للعامة. هذا الخيار يضيف سلسلة من الحروف والأرقام العشوائية صعبة التخمين إلى رابط الصورة. الرجاء التأكد من تعطيل فهرسة المسارات لمنع الوصول السهل.',
-    'app_editor' => 'محرر الصفحة',
-    'app_editor_desc' => 'الرجاء اختيار محرر النص الذي سيستخدم من قبل جميع المستخدمين لتحرير الصفحات.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Custom HTML head content',
     'app_custom_html_desc' => 'سيتم إدراج أي محتوى مضاف هنا في الجزء السفلي من قسم <head> من كل صفحة. هذا أمر مفيد لتجاوز الأنماط أو إضافة رمز التحليل.',
     'app_custom_html_disabled_notice' => 'تم تعطيل محتوى HTML الرئيسي المخصص في صفحة الإعدادات هذه لضمان عكس أي تغييرات متتالية.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'الوصول إلى واجهة برمجة تطبيقات النظام API',
     'role_manage_settings' => 'إدارة إعدادات التطبيق',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'أذونات الأصول',
     'roles_system_warning' => 'اعلم أن الوصول إلى أي من الأذونات الثلاثة المذكورة أعلاه يمكن أن يسمح للمستخدم بتغيير امتيازاته الخاصة أو امتيازات الآخرين في النظام. قم بتعيين الأدوار مع هذه الأذونات فقط للمستخدمين الموثوق بهم.',
     'role_asset_desc' => 'تتحكم هذه الأذونات في الوصول الافتراضي إلى الأصول داخل النظام. ستتجاوز الأذونات الخاصة بالكتب والفصول والصفحات هذه الأذونات.',
index 0f4172151dc7ddd8c2df5277e246691d76b4594b..a1faad7cd507aa9e6032212389eb7c8705c3721f 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Черновата е запазена в ',
     'pages_edit_delete_draft' => 'Изтрий чернова',
     'pages_edit_discard_draft' => 'Отхвърляне на черновата',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Задайте регистър на промените',
     'pages_edit_enter_changelog_desc' => 'Въведете кратко резюме на промените, които сте създали',
     'pages_edit_enter_changelog' => 'Въведи регистър на промените',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Запазване на страницата',
     'pages_title' => 'Заглавие на страницата',
     'pages_name' => 'Име на страницата',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '№',
     'pages_revisions_numbered' => 'Ревизия №:id',
     'pages_revisions_numbered_changes' => 'Ревизия №:id Промени',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'История на промените',
     'pages_revisions_changes' => 'Промени',
     'pages_revisions_current' => 'Текуща версия',
index e006d14254159428723fdf9eafdfb0738a71f5eb..cd004be6543acd8f920fc40f615f9bbc04bb223e 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'По-висока сигурност при качване на изображения',
     'app_secure_images_toggle' => 'Активиране на по-висока сигурност при качване на изображения',
     'app_secure_images_desc' => 'С цел производителност, всички изображения са публични. Тази настройка добавя случаен, труден за отгатване низ от символи пред линка на изображението. Подсигурете, че индексите на директорията не са включени за да предотвратите лесен достъп.',
-    'app_editor' => 'Редактор на страница',
-    'app_editor_desc' => 'Изберете кой редактор да се използва от всички потребители за да редактират страници.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Персонализирано съдържание на HTML шапката',
     'app_custom_html_desc' => 'Всяко съдържание, добавено тук, ще бъде поставено в долната част на секцията <head> на всяка страница. Това е удобно за преобладаващи стилове или добавяне на код за анализ.',
     'app_custom_html_disabled_notice' => 'Съдържанието на персонализираната HTML шапка е деактивирано на страницата с настройки, за да се гарантира, че евентуални лоши промени могат да бъдат върнати.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Достъп до API на системата',
     'role_manage_settings' => 'Управление на настройките на приложението',
     'role_export_content' => 'Експортирай съдържанието',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Настройки за достъп до активи',
     'roles_system_warning' => 'Важно: Добавянето на потребител в някое от горните три роли може да му позволи да промени собствените си права или правата на другите в системата. Възлагайте тези роли само на доверени потребители.',
     'role_asset_desc' => 'Тези настройки за достъп контролират достъпа по подразбиране до активите в системата. Настройките за достъп до книги, глави и страници ще отменят тези настройки.',
index 74f6eeb21ca3c33ba5c13bcbf2e1cabf1def7261..afa5f39e927b5d35048333fb819b2e0aa991467b 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Draft saved at ',
     'pages_edit_delete_draft' => 'Delete Draft',
     'pages_edit_discard_draft' => 'Discard Draft',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Set Changelog',
     'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
     'pages_edit_enter_changelog' => 'Enter Changelog',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Save Page',
     'pages_title' => 'Page Title',
     'pages_name' => 'Page Name',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revision #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id Changes',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Changelog',
     'pages_revisions_changes' => 'Changes',
     'pages_revisions_current' => 'Trenutna verzija',
index 7461c9d4ebd951748b8b84520226db894c7e1bfc..af2dcc1e1655bab7208832cb6e090a578f2e931f 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Higher Security Image Uploads',
     'app_secure_images_toggle' => 'Enable higher security image uploads',
     'app_secure_images_desc' => 'For performance reasons, all images are public. This option adds a random, hard-to-guess string in front of image urls. Ensure directory indexes are not enabled to prevent easy access.',
-    'app_editor' => 'Page Editor',
-    'app_editor_desc' => 'Select which editor will be used by all users to edit pages.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Custom HTML Head Content',
     'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the <head> section of every page. This is handy for overriding styles or adding analytics code.',
     'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Access system API',
     'role_manage_settings' => 'Manage app settings',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Asset Permissions',
     'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.',
     'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.',
index 6ba7808b3b5ae5d6251aa78b131c1e42826391c5..1791658281569c9b32425184b35782945fc004c9 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Esborrany desat ',
     'pages_edit_delete_draft' => 'Suprimeix l\'esborrany',
     'pages_edit_discard_draft' => 'Descarta l\'esborrany',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Defineix el registre de canvis',
     'pages_edit_enter_changelog_desc' => 'Introduïu una breu descripció dels canvis que heu fet',
     'pages_edit_enter_changelog' => 'Introduïu un registre de canvis',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Desa la pàgina',
     'pages_title' => 'Títol de la pàgina',
     'pages_name' => 'Nom de la pàgina',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => 'Núm. ',
     'pages_revisions_numbered' => 'Revisió núm. :id',
     'pages_revisions_numbered_changes' => 'Canvis de la revisió núm. :id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Registre de canvis',
     'pages_revisions_changes' => 'Canvis',
     'pages_revisions_current' => 'Versió actual',
index 788c3704e95588d963cd32294871bf9dd1e29fa6..a4dd95323224bd2fbdde322e224c9270f4c08cbe 100755 (executable)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Pujades d\'imatges amb més seguretat',
     'app_secure_images_toggle' => 'Activa les pujades d\'imatges amb més seguretat',
     'app_secure_images_desc' => 'Per motius de rendiment, totes les imatges són públiques. Aquesta opció afegeix una cadena aleatòria i difícil d\'endevinar al davant dels URL d\'imatges. Assegureu-vos que els índexs de directoris no estiguin activats per a evitar-hi l\'accés de manera fàcil.',
-    'app_editor' => 'Editor de pàgines',
-    'app_editor_desc' => 'Seleccioneu quin editor faran servir tots els usuaris per a editar les pàgines.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Contingut personalitzat a la capçalera HTML',
     'app_custom_html_desc' => 'Aquí podeu afegir contingut que s\'inserirà a la part final de la secció <head> de cada pàgina. És útil per a sobreescriure estils o afegir-hi codi d\'analítiques.',
     'app_custom_html_disabled_notice' => 'El contingut personalitzat a la capçalera HTML es desactiva en aquesta pàgina de la configuració per a assegurar que qualsevol canvi que trenqui el web es pugui desfer.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Accedeix a l\'API del sistema',
     'role_manage_settings' => 'Gestiona la configuració de l\'aplicació',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Permisos de recursos',
     'roles_system_warning' => 'Tingueu en compte que l\'accés a qualsevol dels tres permisos de dalt pot permetre que un usuari alteri els seus propis permisos o els privilegis d\'altres usuaris del sistema. Assigneu rols amb aquests permisos només a usuaris de confiança.',
     'role_asset_desc' => 'Aquests permisos controlen l\'accés per defecte als recursos del sistema. Els permisos de llibres, capítols i pàgines tindran més importància que aquests permisos.',
index 78355b4b4e9b6821740493293672631b4afa5b72..ab0b103d6dea3987e70c51ffb4501527b77a590f 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Koncept uložen v ',
     'pages_edit_delete_draft' => 'Odstranit koncept',
     'pages_edit_discard_draft' => 'Zahodit koncept',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Nastavit protokol změn',
     'pages_edit_enter_changelog_desc' => 'Zadejte stručný popis změn, které jste provedli',
     'pages_edit_enter_changelog' => 'Zadejte protokol změn',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Uložit stránku',
     'pages_title' => 'Nadpis stránky',
     'pages_name' => 'Název stránky',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => 'Č. ',
     'pages_revisions_numbered' => 'Revize č. :id',
     'pages_revisions_numbered_changes' => 'Změny revize č. :id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Protokol změn',
     'pages_revisions_changes' => 'Změny',
     'pages_revisions_current' => 'Aktuální verze',
index 6fa3615023149fa5dd83b708434377724cdc3612..7da021da40d304de7fd09f60ac884650f5ea30d1 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Nahrávat obrázky neveřejně a zabezpečeně',
     'app_secure_images_toggle' => 'Zapnout bezpečnější nahrávání obrázků',
     'app_secure_images_desc' => 'Z výkonnostních důvodů jsou všechny obrázky veřejně dostupné. Tato volba přidá do adresy obrázku náhodný řetězec, aby nikdo neodhadnul adresu obrázku. Ujistěte se, že server nezobrazuje v adresáři seznam souborů, což by přístup k přístup opět otevřelo.',
-    'app_editor' => 'Editor stránek',
-    'app_editor_desc' => 'Zvolte který editor budou užívat všichni uživatelé k úpravě stránek.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Vlastní obsah hlavičky HTML',
     'app_custom_html_desc' => 'Cokoliv sem napíšete bude přidáno na konec sekce <head> v každém místě této aplikace. To se hodí pro přidávání nebo změnu CSS stylů nebo přidání kódu pro analýzu používání (např.: google analytics.).',
     'app_custom_html_disabled_notice' => 'Na této stránce nastavení je zakázán vlastní obsah HTML hlavičky, aby bylo zajištěno, že bude možné vrátit případnou problematickou úpravu.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Přístup k systémovému API',
     'role_manage_settings' => 'Správa nastavení aplikace',
     'role_export_content' => 'Exportovat obsah',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Obsahová oprávnění',
     'roles_system_warning' => 'Berte na vědomí, že přístup k některému ze tří výše uvedených oprávnění může uživateli umožnit změnit svá vlastní oprávnění nebo oprávnění ostatních uživatelů v systému. Přiřazujte role s těmito oprávněními pouze důvěryhodným uživatelům.',
     'role_asset_desc' => 'Tato oprávnění řídí přístup k obsahu napříč systémem. Specifická oprávnění na knihách, kapitolách a stránkách převáží tato nastavení.',
index bea5ec91dbac34138b533cf066dcf60dbd8f9a68..1766dede5185487710867b2a2f536eb251f036c7 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Kladde gemt ved ',
     'pages_edit_delete_draft' => 'Slet kladde',
     'pages_edit_discard_draft' => 'Kassér kladde',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Sæt ændringsoversigt',
     'pages_edit_enter_changelog_desc' => 'Indtast en kort beskrivelse af ændringer du har lavet',
     'pages_edit_enter_changelog' => 'Indtast ændringsoversigt',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Gem siden',
     'pages_title' => 'Overskrift',
     'pages_name' => 'Sidenavn',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revision #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id ændringer',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Ændringsoversigt',
     'pages_revisions_changes' => 'Ændringer',
     'pages_revisions_current' => 'Nuværende version',
index 8294505218ddd01939368f0834be675efbac9e96..c3f3339461ca71558b02679e8104aa6869418e39 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Højere sikkerhed for billeduploads',
     'app_secure_images_toggle' => 'Aktiver højere sikkerhed for billeduploads',
     'app_secure_images_desc' => 'Af performanceårsager er alle billeder offentlige. Denne funktion tilføjer en tilfældig, vanskelig at gætte streng foran billed-url\'er. Sørg for, at mappeindeksering ikke er aktiveret for at forhindre nem adgang.',
-    'app_editor' => 'Sideeditor',
-    'app_editor_desc' => 'Vælg hvilken editor der skal bruges af alle brugere til at redigere sider.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Tilpasset HTML head indhold',
     'app_custom_html_desc' => 'Alt indhold tilføjet her, vil blive indsat i bunden af <head> sektionen på alle sider. Dette er brugbart til overskrivning af styles og tilføjelse af analytics kode.',
     'app_custom_html_disabled_notice' => 'Brugerdefineret HTML head indhold er deaktiveret på denne indstillingsside for at, at ændringer kan rulles tilbage.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Tilgå system-API',
     'role_manage_settings' => 'Administrer app-indstillinger',
     'role_export_content' => 'Eksporter indhold',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Tilladelser for medier og "assets"',
     'roles_system_warning' => 'Vær opmærksom på, at adgang til alle af de ovennævnte tre tilladelser, kan give en bruger mulighed for at ændre deres egne brugerrettigheder eller brugerrettigheder for andre i systemet. Tildel kun roller med disse tilladelser til betroede brugere.',
     'role_asset_desc' => 'Disse tilladelser kontrollerer standardadgang til medier og "assets" i systemet. Tilladelser til bøger, kapitler og sider tilsidesætter disse tilladelser.',
index 8d0c0da54325a1d852d1fbf83fc7bb010e5d0a8b..e6f06a0b16c34f6831d22b4da09b7353d54ed1b3 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Entwurf gespeichert um ',
     'pages_edit_delete_draft' => 'Entwurf löschen',
     'pages_edit_discard_draft' => 'Entwurf verwerfen',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Änderungsprotokoll hinzufügen',
     'pages_edit_enter_changelog_desc' => 'Bitte geben Sie eine kurze Zusammenfassung Ihrer Änderungen ein',
     'pages_edit_enter_changelog' => 'Änderungsprotokoll eingeben',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Seite speichern',
     'pages_title' => 'Seitentitel',
     'pages_name' => 'Seitenname',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revision #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id Änderungen',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Änderungsprotokoll',
     'pages_revisions_changes' => 'Änderungen',
     'pages_revisions_current' => 'Aktuelle Version',
index 8c14f273451180cd3a21522e6521d0fed35a7f62..d7ef9dc9960a792f28f1568335cf0fa5c4a93e10 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Erhöhte Sicherheit für hochgeladene Bilder aktivieren?',
     'app_secure_images_toggle' => 'Aktiviere Bild-Upload höherer Sicherheit',
     'app_secure_images_desc' => 'Aus Leistungsgründen sind alle Bilder öffentlich sichtbar. Diese Option fügt zufällige, schwer zu eratene, Zeichenketten zu Bild-URLs hinzu. Stellen sie sicher, dass Verzeichnisindizes deaktiviert sind, um einen einfachen Zugriff zu verhindern.',
-    'app_editor' => 'Seiteneditor',
-    'app_editor_desc' => 'Wählen Sie den Editor aus, der von allen Benutzern genutzt werden soll, um Seiten zu editieren.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Benutzerdefinierter HTML <head> Inhalt',
     'app_custom_html_desc' => 'Jeder Inhalt, der hier hinzugefügt wird, wird am Ende der <head> Sektion jeder Seite eingefügt. Diese kann praktisch sein, um CSS Styles anzupassen oder Analytics-Code hinzuzufügen.',
     'app_custom_html_disabled_notice' => 'Benutzerdefinierte HTML-Kopfzeileninhalte sind auf dieser Einstellungsseite deaktiviert, um sicherzustellen, dass alle Änderungen rückgängig gemacht werden können.',
@@ -155,6 +155,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'role_access_api' => 'Systemzugriffs-API',
     'role_manage_settings' => 'Globaleinstellungen verwalten',
     'role_export_content' => 'Inhalt exportieren',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Berechtigungen',
     'roles_system_warning' => 'Beachten Sie, dass der Zugriff auf eine der oben genannten drei Berechtigungen einem Benutzer erlauben kann, seine eigenen Berechtigungen oder die Rechte anderer im System zu ändern. Weisen Sie nur Rollen, mit diesen Berechtigungen, vertrauenswürdigen Benutzern zu.',
     'role_asset_desc' => 'Diese Berechtigungen gelten für den Standard-Zugriff innerhalb des Systems. Berechtigungen für Bücher, Kapitel und Seiten überschreiben diese Berechtigungenen.',
@@ -202,7 +203,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'users_social_accounts' => 'Social-Media Konten',
     'users_social_accounts_info' => 'Hier können Sie andere Social-Media-Konten für eine schnellere und einfachere Anmeldung verknüpfen. Wenn Sie ein Social-Media Konto lösen, bleibt der Zugriff erhalten. Entfernen Sie in diesem Falle die Berechtigung in Ihren Profil-Einstellungen des verknüpften Social-Media-Kontos.',
     'users_social_connect' => 'Social-Media-Konto verknüpfen',
-    'users_social_disconnect' => 'Social-Media-Konto lösen',
+    'users_social_disconnect' => 'Social-Media-Konto löschen',
     'users_social_connected' => ':socialAccount-Konto wurde erfolgreich mit dem Profil verknüpft.',
     'users_social_disconnected' => ':socialAccount-Konto wurde erfolgreich vom Profil gelöst.',
     'users_api_tokens' => 'API-Token',
index b2b01f1a0fc654fc66339acf627acc2f8e00dd79..165afd4f5de582f70303b7f2881151948174e2a1 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Entwurf gespeichert um ',
     'pages_edit_delete_draft' => 'Entwurf löschen',
     'pages_edit_discard_draft' => 'Entwurf verwerfen',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Änderungsprotokoll hinzufügen',
     'pages_edit_enter_changelog_desc' => 'Bitte gib eine kurze Zusammenfassung Deiner Änderungen ein',
     'pages_edit_enter_changelog' => 'Änderungsprotokoll eingeben',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Seite speichern',
     'pages_title' => 'Seitentitel',
     'pages_name' => 'Seitenname',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revision #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id Änderungen',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Änderungsprotokoll',
     'pages_revisions_changes' => 'Änderungen',
     'pages_revisions_current' => 'Aktuelle Version',
index 1973bb1826be916b387376a965256705ff532847..1968e547acf16b89a3640da9b9f3e3924a786060 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Erhöhte Sicherheit für hochgeladene Bilder aktivieren?',
     'app_secure_images_toggle' => 'Aktiviere Bild-Upload mit höherer Sicherheit',
     'app_secure_images_desc' => 'Aus Leistungsgründen sind alle Bilder öffentlich sichtbar. Diese Option fügt zufällige, schwer zu eratene, Zeichenketten zu Bild-URLs hinzu. Stellen sie sicher, dass Verzeichnisindizes deaktiviert sind, um einen einfachen Zugriff zu verhindern.',
-    'app_editor' => 'Seiteneditor',
-    'app_editor_desc' => 'Wähle den Editor aus, der von allen Benutzern genutzt werden soll, um Seiten zu editieren.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Benutzerdefinierter HTML <head> Inhalt',
     'app_custom_html_desc' => 'Jeder Inhalt, der hier hinzugefügt wird, wird am Ende der <head> Sektion jeder Seite eingefügt. Diese kann praktisch sein, um CSS Styles anzupassen oder Analytics-Code hinzuzufügen.',
     'app_custom_html_disabled_notice' => 'Benutzerdefinierte HTML-Kopfzeileninhalte sind auf dieser Einstellungsseite deaktiviert, um sicherzustellen, dass alle Änderungen rückgängig gemacht werden können.',
@@ -155,6 +155,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'role_access_api' => 'Systemzugriffs-API',
     'role_manage_settings' => 'Globaleinstellungen verwalten',
     'role_export_content' => 'Inhalt exportieren',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Berechtigungen',
     'roles_system_warning' => 'Beachten Sie, dass der Zugriff auf eine der oben genannten drei Berechtigungen einem Benutzer erlauben kann, seine eigenen Berechtigungen oder die Rechte anderer im System zu ändern. Weisen Sie nur Rollen, mit diesen Berechtigungen, vertrauenswürdigen Benutzern zu.',
     'role_asset_desc' => 'Diese Berechtigungen gelten für den Standard-Zugriff innerhalb des Systems. Berechtigungen für Bücher, Kapitel und Seiten überschreiben diese Berechtigungenen.',
index 4e4bbccd3f4227ad721134d722e20f472a518c8e..bed781b6129b180789556b43597883ba5671da21 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Draft saved at ',
     'pages_edit_delete_draft' => 'Delete Draft',
     'pages_edit_discard_draft' => 'Discard Draft',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Set Changelog',
     'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
     'pages_edit_enter_changelog' => 'Enter Changelog',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Save Page',
     'pages_title' => 'Page Title',
     'pages_name' => 'Page Name',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revision #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id Changes',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Changelog',
     'pages_revisions_changes' => 'Changes',
     'pages_revisions_current' => 'Current Version',
index 7461c9d4ebd951748b8b84520226db894c7e1bfc..af2dcc1e1655bab7208832cb6e090a578f2e931f 100755 (executable)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Higher Security Image Uploads',
     'app_secure_images_toggle' => 'Enable higher security image uploads',
     'app_secure_images_desc' => 'For performance reasons, all images are public. This option adds a random, hard-to-guess string in front of image urls. Ensure directory indexes are not enabled to prevent easy access.',
-    'app_editor' => 'Page Editor',
-    'app_editor_desc' => 'Select which editor will be used by all users to edit pages.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Custom HTML Head Content',
     'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the <head> section of every page. This is handy for overriding styles or adding analytics code.',
     'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Access system API',
     'role_manage_settings' => 'Manage app settings',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Asset Permissions',
     'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.',
     'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.',
index 6092c567f6cc40155e569da0204067cf665ca6d9..1b579b36030fae96552b2117ba1df2c4e571cdff 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Borrador guardado ',
     'pages_edit_delete_draft' => 'Borrar borrador',
     'pages_edit_discard_draft' => 'Descartar borrador',
+    'pages_edit_switch_to_markdown' => 'Cambiar a Editor Markdown',
+    'pages_edit_switch_to_markdown_clean' => '(Limpiar Contenido)',
+    'pages_edit_switch_to_markdown_stable' => '(Contenido Estable)',
+    'pages_edit_switch_to_wysiwyg' => 'Cambiar a Editor WYSIWYG',
     'pages_edit_set_changelog' => 'Ajustar Log de cambios',
     'pages_edit_enter_changelog_desc' => 'Introduzca una breve descripción de los cambios que ha realizado',
     'pages_edit_enter_changelog' => 'Entrar al Log de cambios',
+    'pages_editor_switch_title' => 'Cambiar editor',
+    'pages_editor_switch_are_you_sure' => '¿Está seguro de que desea cambiar el editor de esta página?',
+    'pages_editor_switch_consider_following' => 'Considere lo siguiente al cambiar de editor:',
+    'pages_editor_switch_consideration_a' => 'Una vez guardado, el nuevo editor será utilizado por cualquier usuario en el futuro, incluyendo aquellos que no puedan cambiar el tipo de editor por sí mismos.',
+    'pages_editor_switch_consideration_b' => 'Esto puede llevar a una pérdida de detalle y sintaxis en ciertas circunstancias.',
+    'pages_editor_switch_consideration_c' => 'Cambios en etiquetas o en el registro de cambios, realizados desde el último guardado, no persistirán a través de este cambio.',
     'pages_save' => 'Guardar página',
     'pages_title' => 'Título de página',
     'pages_name' => 'Nombre de página',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revisión #:id',
     'pages_revisions_numbered_changes' => 'Revisión #:id Cambios',
+    'pages_revisions_editor' => 'Tipo de Editor',
     'pages_revisions_changelog' => 'Log de cambios',
     'pages_revisions_changes' => 'Cambios',
     'pages_revisions_current' => 'Versión actual',
index 52c4b320c15d85c1a35c83914430299d98c359d2..3e27359e3122c952d5907bde951318fc7434eb3d 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Mayor seguridad para subir imágenes',
     'app_secure_images_toggle' => 'Habilitar mayor seguridad en la subida de imágenes',
     'app_secure_images_desc' => 'Por razones de rendimiento, todas las imágenes son públicas. Esta opción agrega una cadena de texto larga difícil de adivinar. Asegúrese que los índices de directorio no están habilitados para evitar el acceso fácil a las imágenes.',
-    'app_editor' => 'Editor de Páginas',
-    'app_editor_desc' => 'Seleccione qué editor se usará por todos los usuarios para editar páginas.',
+    'app_default_editor' => 'Editor de Página por defecto',
+    'app_default_editor_desc' => 'Seleccione qué editor se utilizará por defecto cuando se editen nuevas páginas. Esto se puede anular a nivel de página si los permisos lo permiten.',
     'app_custom_html' => 'Contenido de cabecera HTML personalizado',
     'app_custom_html_desc' => 'Cualquier contenido agregado aquí será insertado al final de la sección <head> de cada página. Esto es útil para sobreescribir estilos o agregar código para analíticas web.',
     'app_custom_html_disabled_notice' => 'El contenido personalizado para la cabecera está deshabilitado en esta página de ajustes para permitir que cualquier cambio que rompa la funcionalidad pueda ser revertido.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'API de sistema de acceso',
     'role_manage_settings' => 'Gestionar ajustes de la aplicación',
     'role_export_content' => 'Exportar contenido',
+    'role_editor_change' => 'Cambiar editor de página',
     'role_asset' => 'Permisos de contenido',
     'roles_system_warning' => 'Tenga en cuenta que el acceso a cualquiera de los tres permisos anteriores puede permitir a un usuario alterar sus propios privilegios o los privilegios de otros en el sistema. Sólo asignar roles con estos permisos a usuarios de confianza.',
     'role_asset_desc' => 'Estos permisos controlan el acceso por defecto a los contenidos del sistema. Los permisos de Libros, Capítulos y Páginas sobreescribiran estos permisos.',
index 526f660deee75bd82fe868aaad611466622922e5..03702b245965cd14b842787aac76cc48c1063522 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Borrador guardado el ',
     'pages_edit_delete_draft' => 'Borrar borrador',
     'pages_edit_discard_draft' => 'Descartar borrador',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Establecer cambios de registro',
     'pages_edit_enter_changelog_desc' => 'Introduzca una breve descripción de los cambios que ha realizado',
     'pages_edit_enter_changelog' => 'Entrar en cambio de registro',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Guardar página',
     'pages_title' => 'Título de página',
     'pages_name' => 'Nombre de página',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revisión #:id',
     'pages_revisions_numbered_changes' => 'Cambios de Revisión #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Registro de cambios',
     'pages_revisions_changes' => 'Cambios',
     'pages_revisions_current' => 'Versión actual',
index d60334b5cc1f4c9213882928f1c039b4cbae15c9..4806445597ae5ffbb09c72304653467176e6662d 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => '¿Habilitar mayor seguridad para subir imágenes?',
     'app_secure_images_toggle' => 'Habilitar seguridad alta para subir imágenes',
     'app_secure_images_desc' => 'Por razones de rendimiento, todas las imágenes son públicas. Esta opción agrega una cadena larga difícil de adivinar, asegúrese que los índices de directorios no están habilitados para prevenir el acceso fácil a las imágenes.',
-    'app_editor' => 'Editor de página',
-    'app_editor_desc' => 'Seleccione cuál editor será usado por todos los usuarios para editar páginas.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Contenido de cabecera HTML personalizable',
     'app_custom_html_desc' => 'Cualquier contenido agregado aquí será agregado al final de la sección <head> de cada página. Esto es útil para sobreescribir estilos o agregar código para analíticas.',
     'app_custom_html_disabled_notice' => 'El contenido personailzado para la cabecera HTML está deshabilitado en esta configuración para garantizar que cualquier cambio importante se pueda revertir.',
@@ -153,6 +153,7 @@ return [
     'role_access_api' => 'API de sistema de acceso',
     'role_manage_settings' => 'Gestionar ajustes de activos',
     'role_export_content' => 'Exportar contenido',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Permisos de activos',
     'roles_system_warning' => 'Tenga en cuenta que el acceso a cualquiera de los tres permisos anteriores puede permitir a un usuario modificar sus propios privilegios o los privilegios de otros usuarios en el sistema. Asignar roles con estos permisos sólo a usuarios de comfianza.',
     'role_asset_desc' => 'Estos permisos controlan el acceso por defecto a los activos del sistema. Permisos definidos en Libros, Capítulos y Páginas ignorarán estos permisos.',
index efcedbd5ee11ba664cd2f8c34d5cf701b4c9e6b0..009a3d562bb690ab0a30e45d473ac353649492bd 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Mustand salvestatud ',
     'pages_edit_delete_draft' => 'Kustuta mustand',
     'pages_edit_discard_draft' => 'Loobu mustandist',
+    'pages_edit_switch_to_markdown' => 'Kasuta Markdown redaktorit',
+    'pages_edit_switch_to_markdown_clean' => '(Puhas sisu)',
+    'pages_edit_switch_to_markdown_stable' => '(Stabiilne sisu)',
+    'pages_edit_switch_to_wysiwyg' => 'Kasuta WYSIWYG redaktorit',
     'pages_edit_set_changelog' => 'Muudatuste logi',
     'pages_edit_enter_changelog_desc' => 'Sisesta tehtud muudatuste lühikirjeldus',
     'pages_edit_enter_changelog' => 'Salvesta muudatuste logi',
+    'pages_editor_switch_title' => 'Vaheta redaktorit',
+    'pages_editor_switch_are_you_sure' => 'Kas oled kindel, et soovid selle lehe redaktorit muuta?',
+    'pages_editor_switch_consider_following' => 'Redaktori muutmisel pea meeles järgnevat:',
+    'pages_editor_switch_consideration_a' => 'Pärast salvestamist kasutatakse valitud redaktorit ka tulevikus, sh. olukordades, kus ei pruugi olla võimalik redaktori tüüpi muuta.',
+    'pages_editor_switch_consideration_b' => 'See võib teatud olukordades põhjustada detailide ja süntaksi kaotsiminekut.',
+    'pages_editor_switch_consideration_c' => 'Viimasest salvestamisest saadik tehtud siltide ja muudatuste logi muudatused ei jää alles.',
     'pages_save' => 'Salvesta leht',
     'pages_title' => 'Lehe pealkiri',
     'pages_name' => 'Lehe nimetus',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Redaktsioon #:id',
     'pages_revisions_numbered_changes' => 'Redaktsiooni #:id muudatused',
+    'pages_revisions_editor' => 'Redaktori tüüp',
     'pages_revisions_changelog' => 'Muudatuste ajalugu',
     'pages_revisions_changes' => 'Muudatused',
     'pages_revisions_current' => 'Praegune versioon',
index 309130ecaf425d16ded6668ca3b0e4742c7f2e50..90727eef51b06ac825e8fec24daf721ea868470b 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Turvalisem piltide üleslaadimine',
     'app_secure_images_toggle' => 'Lülita sisse turvalisem piltide üleslaadimine',
     'app_secure_images_desc' => 'Jõudluse kaalutlustel on kõik pildifailid avalikult kättesaadavad. See valik lisab pildifailide URL-ide ette juhugenereeritud, raskesti arvatava stringi. Ligipääsu piiramiseks veendu, et kataloogide indekseerimine ei oleks lubatud.',
-    'app_editor' => 'Redaktor',
-    'app_editor_desc' => 'Vali, millist redaktorit kasutajad lehtede muutmiseks kasutavad.',
+    'app_default_editor' => 'Vaikimisi lehe redaktor',
+    'app_default_editor_desc' => 'Vali, millist redaktorit vaikimisi uute lehtede jaoks kasutada. Seda valikut saab õiguste olemasolul iga lehe jaoks eraldi muuta.',
     'app_custom_html' => 'Kohandatud HTML päise sisu',
     'app_custom_html_desc' => 'Siia lisatud sisu lisatakse iga lehe <head> sektsiooni lõppu. See võimaldab stiile üle laadida või lisada analüütika koodi.',
     'app_custom_html_disabled_notice' => 'Kohandatud HTML päise sisu on sellel lehel välja lülitatud, et probleemseid muudatusi saaks tagasi võtta.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Süsteemi API ligipääs',
     'role_manage_settings' => 'Rakenduse seadete haldamine',
     'role_export_content' => 'Sisu eksport',
+    'role_editor_change' => 'Lehe redaktori muutmine',
     'role_asset' => 'Sisu õigused',
     'roles_system_warning' => 'Pane tähele, et ülalolevad kolm õigust võimaldavad kasutajal enda või teiste kasutajate õiguseid muuta. Määra nende õigustega roll ainult usaldusväärsetele kasutajatele.',
     'role_asset_desc' => 'Need load kontrollivad vaikimisi ligipääsu süsteemis olevale sisule. Raamatute, peatükkide ja lehtede õigused rakenduvad esmajärjekorras.',
index 5403f88bc8c67417404d50fc29aacdbcea64dc9b..5381baf182b6047cda949578ee28e02a18277d48 100644 (file)
@@ -24,7 +24,7 @@ return [
     'width' => 'Zabalera',
     'height' => 'Altuera',
     'More' => 'Gehiago',
-    'select' => 'Select...',
+    'select' => 'Aukeratu...',
 
     // Toolbar
     'formats' => 'Formatuak',
@@ -53,33 +53,33 @@ return [
     'align_left' => 'Lerrokatu ezkerrean',
     'align_center' => 'Lerrokatu erdian',
     'align_right' => 'Lerrokatu eskuinean',
-    'align_justify' => 'Justify',
+    'align_justify' => 'Justifikatuta',
     'list_bullet' => 'Buletdun zerrenda',
     'list_numbered' => 'Zenbakitutako zerrenda',
-    'list_task' => 'Task list',
+    'list_task' => 'Zereginen zerrenda',
     'indent_increase' => 'Handitu koska',
     'indent_decrease' => 'Txikitu koska',
     'table' => 'Taula',
     'insert_image' => 'Irudia txertatu',
-    'insert_image_title' => 'Insert/Edit Image',
-    'insert_link' => 'Insert/edit link',
-    'insert_link_title' => 'Insert/Edit Link',
-    'insert_horizontal_line' => 'Insert horizontal line',
-    'insert_code_block' => 'Insert code block',
-    'insert_drawing' => 'Insert/edit drawing',
-    'drawing_manager' => 'Drawing manager',
-    'insert_media' => 'Insert/edit media',
-    'insert_media_title' => 'Insert/Edit Media',
-    'clear_formatting' => 'Clear formatting',
-    'source_code' => 'Source code',
-    'source_code_title' => 'Source Code',
-    'fullscreen' => 'Fullscreen',
-    'image_options' => 'Image options',
+    'insert_image_title' => 'Aldatu/Txertatu irudia',
+    'insert_link' => 'Txertatu/aldatu esteka',
+    'insert_link_title' => 'Txertatu/Aldatu esteka',
+    'insert_horizontal_line' => 'Txertatu linea horizontala',
+    'insert_code_block' => 'Txertatu kode-blokea',
+    'insert_drawing' => 'Txertatu marrazki berria',
+    'drawing_manager' => 'Marrazki kudeaketa',
+    'insert_media' => 'Txertatu/aldatu media',
+    'insert_media_title' => 'Aldatu/Txertatu irudia',
+    'clear_formatting' => 'Garbitu formatua',
+    'source_code' => 'Iturburu kodea',
+    'source_code_title' => 'Iturburu kodea',
+    'fullscreen' => 'Pantaila osoa',
+    'image_options' => 'Irudiaren aukerak',
 
     // Tables
-    'table_properties' => 'Table properties',
-    'table_properties_title' => 'Table Properties',
-    'delete_table' => 'Delete table',
+    'table_properties' => 'Taularen propietateak',
+    'table_properties_title' => 'Taularen propietateak',
+    'delete_table' => 'Ezabatu taula',
     'insert_row_before' => 'Insert row before',
     'insert_row_after' => 'Insert row after',
     'delete_row' => 'Delete row',
index 57be5a3ae758fa8ed466c0386a47eab045d56db2..6c71e0c5bd48d995ca1df9b03a4e4d8345b456c5 100644 (file)
@@ -29,184 +29,194 @@ return [
     'my_recently_viewed' => 'Nik Ikusitako azkenak',
     'my_most_viewed_favourites' => 'Nire gehien ikusitako gogokoak',
     'my_favourites' => 'Nire Gogokoenak',
-    'no_pages_viewed' => 'You have not viewed any pages',
+    'no_pages_viewed' => 'Ez daukazu ikusiriko orririk',
     'no_pages_recently_created' => 'Ez da orrialderik sortu azkenaldian',
     'no_pages_recently_updated' => 'Ez da orrialderik aldatu azkenaldian',
     'export' => 'Esportatu',
-    'export_html' => 'Contained Web File',
+    'export_html' => 'Daukan web artxiboa',
     'export_pdf' => 'PDF fitxategia',
     'export_text' => 'Testu lauko fitxategiak',
-    'export_md' => 'Markdown File',
+    'export_md' => 'Markdown fitxategia',
 
     // Permissions and restrictions
     'permissions' => 'Baimenak',
-    'permissions_intro' => 'Once enabled, These permissions will take priority over any set role permissions.',
+    'permissions_intro' => 'Behin hau aktibatuta, baimen hauek lehentasuna izango dute beste edozein rol-engainetik.',
     'permissions_enable' => 'Baimena pertsonalizatuak Gaitu',
     'permissions_save' => 'Gorde baimenak',
     'permissions_owner' => 'Jabea',
 
     // Search
     'search_results' => 'Bilaketaren emaitzak',
-    'search_total_results_found' => ':count result found|:count total results found',
+    'search_total_results_found' => ':count emaitza aurkitu dira|:count emaitza aurkitu dira guztira',
     'search_clear' => 'Bilaketa testua garbitu',
     'search_no_pages' => 'Ez da orririk aurkitu zure bilaketan',
-    'search_for_term' => 'Search for :term',
+    'search_for_term' => 'Bilatu honen arabera :term',
     'search_more' => 'Emaitza gehiago',
     'search_advanced' => 'Bilaketa aurreratua',
     'search_terms' => 'Bilaketa-hitza',
     'search_content_type' => 'Eduki Mota',
     'search_exact_matches' => 'Bat etortze zehatza',
-    'search_tags' => 'Tag Searches',
+    'search_tags' => 'Etiketa bilaketak',
     'search_options' => 'Aukerak',
     'search_viewed_by_me' => 'Nik ikusiak',
     'search_not_viewed_by_me' => 'Nik ikusi ez ditudanak',
     'search_permissions_set' => 'Baimenak',
-    'search_created_by_me' => 'Created by me',
-    'search_updated_by_me' => 'Updated by me',
-    'search_owned_by_me' => 'Owned by me',
-    'search_date_options' => 'Date Options',
-    'search_updated_before' => 'Updated before',
-    'search_updated_after' => 'Updated after',
-    'search_created_before' => 'Created before',
-    'search_created_after' => 'Created after',
-    'search_set_date' => 'Set Date',
-    'search_update' => 'Update Search',
+    'search_created_by_me' => 'Nik sortuak',
+    'search_updated_by_me' => 'Nik eguneratuak',
+    'search_owned_by_me' => 'Nire jabetazkoak',
+    'search_date_options' => 'Data aukerak',
+    'search_updated_before' => 'Aurretik eguneratuak',
+    'search_updated_after' => 'Ondoren eguneratuak',
+    'search_created_before' => 'Aurretik sortuak',
+    'search_created_after' => 'Ondoren sortuak',
+    'search_set_date' => 'Data finkatu',
+    'search_update' => 'Eguneratu bilaketa',
 
     // Shelves
-    'shelf' => 'Shelf',
-    'shelves' => 'Shelves',
-    'x_shelves' => ':count Shelf|:count Shelves',
-    'shelves_long' => 'Bookshelves',
-    'shelves_empty' => 'No shelves have been created',
-    'shelves_create' => 'Create New Shelf',
-    'shelves_popular' => 'Popular Shelves',
-    'shelves_new' => 'New Shelves',
-    'shelves_new_action' => 'New Shelf',
-    'shelves_popular_empty' => 'The most popular shelves will appear here.',
-    'shelves_new_empty' => 'The most recently created shelves will appear here.',
-    'shelves_save' => 'Save Shelf',
-    'shelves_books' => 'Books on this shelf',
-    'shelves_add_books' => 'Add books to this shelf',
-    'shelves_drag_books' => 'Drag books here to add them to this shelf',
-    'shelves_empty_contents' => 'This shelf has no books assigned to it',
-    'shelves_edit_and_assign' => 'Edit shelf to assign books',
-    'shelves_edit_named' => 'Edit Bookshelf :name',
-    'shelves_edit' => 'Edit Bookshelf',
-    'shelves_delete' => 'Delete Bookshelf',
-    'shelves_delete_named' => 'Delete Bookshelf :name',
-    'shelves_delete_explain' => "This will delete the bookshelf with the name ':name'. Contained books will not be deleted.",
-    'shelves_delete_confirmation' => 'Are you sure you want to delete this bookshelf?',
-    'shelves_permissions' => 'Bookshelf Permissions',
-    'shelves_permissions_updated' => 'Bookshelf Permissions Updated',
-    'shelves_permissions_active' => 'Bookshelf Permissions Active',
+    'shelf' => 'Apalategia',
+    'shelves' => 'Apalategiak',
+    'x_shelves' => ':count Apalategi|:count Apalategi',
+    'shelves_long' => 'Liburu-Apalategi',
+    'shelves_empty' => 'Ez da inolako apalategirik sortu',
+    'shelves_create' => 'Apalategi berria sortu',
+    'shelves_popular' => 'Apalategi esanguratsuak',
+    'shelves_new' => 'Apalategi berriak',
+    'shelves_new_action' => 'Apalategi berria',
+    'shelves_popular_empty' => 'Apalategi ikusienak hemen agertuko dira.',
+    'shelves_new_empty' => 'Berriki sorturiko apalategiak hemen agertuko dira.',
+    'shelves_save' => 'Gorde apalategia',
+    'shelves_books' => 'Apalategi honetako liburuak',
+    'shelves_add_books' => 'Gehitu liburuak apalategi honetara',
+    'shelves_drag_books' => 'Bota hona liburuak apalategi honetara gehitzeko',
+    'shelves_empty_contents' => 'Apalategi honek ez dauka libururik',
+    'shelves_edit_and_assign' => 'Apalategia editatu liburuak gehitzeko',
+    'shelves_edit_named' => ':name liburu-apalategia editatu',
+    'shelves_edit' => 'Liburu-apalategia editatu',
+    'shelves_delete' => 'Apalategia ezabatu',
+    'shelves_delete_named' => ':name apalategia ezabatu',
+    'shelves_delete_explain' => "':name' apalategia ezabatuko du ekintza honek. bertan dauden liburuak ez dira ezabatuko.",
+    'shelves_delete_confirmation' => 'Ziur zaude apalategi hau ezabatu nahi duzula?',
+    'shelves_permissions' => 'Apalategi baimenak',
+    'shelves_permissions_updated' => 'Apalategi baimenak eguneratuta',
+    'shelves_permissions_active' => 'Apalategi baimenak aktibatuta',
     'shelves_permissions_cascade_warning' => 'Permissions on bookshelves do not automatically cascade to contained books. This is because a book can exist on multiple shelves. Permissions can however be copied down to child books using the option found below.',
-    'shelves_copy_permissions_to_books' => 'Copy Permissions to Books',
-    'shelves_copy_permissions' => 'Copy Permissions',
+    'shelves_copy_permissions_to_books' => 'Kopiatu baimenak liburura',
+    'shelves_copy_permissions' => 'Gorde baimenak',
     'shelves_copy_permissions_explain' => 'This will apply the current permission settings of this bookshelf to all books contained within. Before activating, ensure any changes to the permissions of this bookshelf have been saved.',
-    'shelves_copy_permission_success' => 'Bookshelf permissions copied to :count books',
+    'shelves_copy_permission_success' => 'Apalategi baimenak :count liburutan kopiatuta',
 
     // Books
-    'book' => 'Book',
-    'books' => 'Books',
-    'x_books' => ':count Book|:count Books',
+    'book' => 'Liburua',
+    'books' => 'Liburuak',
+    'x_books' => ':count Liburu|:count Liburu',
     'books_empty' => 'Ez da orrialderik sortu',
-    'books_popular' => 'Popular Books',
+    'books_popular' => 'Liburu ikusienak',
     'books_recent' => 'Azken liburuak',
     'books_new' => 'Liburu berriak',
     'books_new_action' => 'Liburu berria',
-    'books_popular_empty' => 'The most popular books will appear here.',
-    'books_new_empty' => 'The most recently created books will appear here.',
+    'books_popular_empty' => 'Apalategi ikusienak hemen agertuko dira.',
+    'books_new_empty' => 'Berriki sorturiko apalategiak hemen agertuko dira.',
     'books_create' => 'Liburu berria sortu',
     'books_delete' => 'Liburua ezabatu',
-    'books_delete_named' => 'Delete Book :bookName',
-    'books_delete_explain' => 'This will delete the book with the name \':bookName\'. All pages and chapters will be removed.',
+    'books_delete_named' => ':bookName liburua ezabatuta',
+    'books_delete_explain' => 'Honek \':bookName\' liburua ezabatuko du. bere orrialde eta kapitulu guztiak ezabatuak izango dira.',
     'books_delete_confirmation' => 'Ziur zaude liburu hau ezabatu nahi duzula?',
     'books_edit' => 'Editatu liburua',
-    'books_edit_named' => 'Edit Book :bookName',
+    'books_edit_named' => 'Editatu :bookName liburua',
     'books_form_book_name' => 'Liburu izena',
-    'books_save' => 'Save Book',
-    'books_permissions' => 'Book Permissions',
-    'books_permissions_updated' => 'Book Permissions Updated',
-    'books_empty_contents' => 'No pages or chapters have been created for this book.',
-    'books_empty_create_page' => 'Create a new page',
-    'books_empty_sort_current_book' => 'Sort the current book',
+    'books_save' => 'Gorde Liburua',
+    'books_permissions' => 'Liburu baimenak',
+    'books_permissions_updated' => 'Liburu baimenak eguneratuta',
+    'books_empty_contents' => 'Ez da orri edo kapitulurik sortu liburu honentzat.',
+    'books_empty_create_page' => 'Sortu orrialde berria',
+    'books_empty_sort_current_book' => 'Ordenatu uneko liburu hau',
     'books_empty_add_chapter' => 'Kapitulu berria gehitu',
-    'books_permissions_active' => 'Book Permissions Active',
+    'books_permissions_active' => 'Liburu baimenak aktibatuta',
     'books_search_this' => 'Bilatu liburu hau',
-    'books_navigation' => 'Book Navigation',
-    'books_sort' => 'Sort Book Contents',
-    'books_sort_named' => 'Sort Book :bookName',
+    'books_navigation' => 'Liburu nabigazioa',
+    'books_sort' => 'Ordenatu liburu edukiak',
+    'books_sort_named' => 'Ordenatu :bookName liburua',
     'books_sort_name' => 'Ordenatu izenaren arabera',
     'books_sort_created' => 'Ordenatu argitaratze-dataren arabera',
-    'books_sort_updated' => 'Sort by Updated Date',
-    'books_sort_chapters_first' => 'Chapters First',
-    'books_sort_chapters_last' => 'Chapters Last',
-    'books_sort_show_other' => 'Show Other Books',
-    'books_sort_save' => 'Save New Order',
-    'books_copy' => 'Copy Book',
-    'books_copy_success' => 'Book successfully copied',
+    'books_sort_updated' => 'Ordenatu aldaketa-dataren arabera',
+    'books_sort_chapters_first' => 'Lehen kapitulua',
+    'books_sort_chapters_last' => 'Azken kapitulua',
+    'books_sort_show_other' => 'Erakutsi beste liburuak',
+    'books_sort_save' => 'Gorde agindu berria',
+    'books_copy' => 'Kopiatu liburua',
+    'books_copy_success' => 'Ondo kopiatu da',
 
     // Chapters
     'chapter' => 'Kapitulua',
     'chapters' => 'Kapituluak',
-    'x_chapters' => ':count Chapter|:count Chapters',
-    'chapters_popular' => 'Popular Chapters',
-    'chapters_new' => 'New Chapter',
-    'chapters_create' => 'Create New Chapter',
+    'x_chapters' => ':count Kapitulu|:count Kapitulu',
+    'chapters_popular' => 'Kapitulu ikusienak',
+    'chapters_new' => 'Kopiatu kapitulua',
+    'chapters_create' => 'Sortu kapitulu berria',
     'chapters_delete' => 'Kapitulua ezabatu',
-    'chapters_delete_named' => 'Delete Chapter :chapterName',
+    'chapters_delete_named' => ':chapterName kapitulua ezabatu',
     'chapters_delete_explain' => 'This will delete the chapter with the name \':chapterName\'. All pages that exist within this chapter will also be deleted.',
     'chapters_delete_confirm' => 'Ziur kapitulu hau ezabatu nahi duzula?',
     'chapters_edit' => 'Kapitulua aldatu',
     'chapters_edit_named' => 'Edit Chapter :chapterName',
     'chapters_save' => 'Kapitulua gorde',
-    'chapters_move' => 'Move Chapter',
+    'chapters_move' => 'Kapitulua mugitu',
     'chapters_move_named' => 'Move Chapter :chapterName',
     'chapter_move_success' => 'Chapter moved to :bookName',
-    'chapters_copy' => 'Copy Chapter',
-    'chapters_copy_success' => 'Chapter successfully copied',
+    'chapters_copy' => 'Kapitulua kopiatu',
+    'chapters_copy_success' => 'Kapitulua egoki kopiatua',
     'chapters_permissions' => 'Chapter Permissions',
-    'chapters_empty' => 'No pages are currently in this chapter.',
+    'chapters_empty' => 'Ez dago orrialderik kapitulu honetan.',
     'chapters_permissions_active' => 'Chapter Permissions Active',
     'chapters_permissions_success' => 'Chapter Permissions Updated',
     'chapters_search_this' => 'Search this chapter',
 
     // Pages
-    'page' => 'Page',
-    'pages' => 'Pages',
+    'page' => 'Orria',
+    'pages' => 'Orriak',
     'x_pages' => ':count Page|:count Pages',
-    'pages_popular' => 'Popular Pages',
-    'pages_new' => 'New Page',
-    'pages_attachments' => 'Attachments',
-    'pages_navigation' => 'Page Navigation',
-    'pages_delete' => 'Delete Page',
+    'pages_popular' => 'Orrialde ikusienak',
+    'pages_new' => 'Orrialde berria',
+    'pages_attachments' => 'Eranskinak',
+    'pages_navigation' => 'Nabigazio orrialdea',
+    'pages_delete' => 'Ezabatu orria',
     'pages_delete_named' => 'Delete Page :pageName',
     'pages_delete_draft_named' => 'Delete Draft Page :pageName',
     'pages_delete_draft' => 'Delete Draft Page',
-    'pages_delete_success' => 'Page deleted',
+    'pages_delete_success' => 'Orria ezabatua',
     'pages_delete_draft_success' => 'Draft page deleted',
-    'pages_delete_confirm' => 'Are you sure you want to delete this page?',
+    'pages_delete_confirm' => 'Ziur al zaude orri hau ezabatu nahi duzula?',
     'pages_delete_draft_confirm' => 'Are you sure you want to delete this draft page?',
     'pages_editing_named' => 'Editing Page :pageName',
     'pages_edit_draft_options' => 'Draft Options',
-    'pages_edit_save_draft' => 'Save Draft',
+    'pages_edit_save_draft' => 'Gorde zirriborroa',
     'pages_edit_draft' => 'Edit Page Draft',
-    'pages_editing_draft' => 'Editing Draft',
-    'pages_editing_page' => 'Editing Page',
+    'pages_editing_draft' => 'Editatu zirriborroa',
+    'pages_editing_page' => 'Editatu orrialdea',
     'pages_edit_draft_save_at' => 'Draft saved at ',
-    'pages_edit_delete_draft' => 'Delete Draft',
-    'pages_edit_discard_draft' => 'Discard Draft',
+    'pages_edit_delete_draft' => 'Ezabatu zirriborroa',
+    'pages_edit_discard_draft' => 'Baztertu zirriborroa',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Set Changelog',
     'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
     'pages_edit_enter_changelog' => 'Enter Changelog',
-    'pages_save' => 'Save Page',
-    'pages_title' => 'Page Title',
-    'pages_name' => 'Page Name',
-    'pages_md_editor' => 'Editor',
-    'pages_md_preview' => 'Preview',
-    'pages_md_insert_image' => 'Insert Image',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
+    'pages_save' => 'Gorde orrialdea',
+    'pages_title' => 'Orrialdearen titulua',
+    'pages_name' => 'Orrialdearen izena',
+    'pages_md_editor' => 'Editorea',
+    'pages_md_preview' => 'Aurrebista',
+    'pages_md_insert_image' => 'Txertatu irudia',
     'pages_md_insert_link' => 'Insert Entity Link',
-    'pages_md_insert_drawing' => 'Insert Drawing',
+    'pages_md_insert_drawing' => 'Txertatu marrazki berria',
     'pages_not_in_chapter' => 'Page is not in a chapter',
     'pages_move' => 'Move Page',
     'pages_move_success' => 'Page moved to ":parentName"',
@@ -220,22 +230,23 @@ return [
     'pages_revisions_named' => 'Page Revisions for :pageName',
     'pages_revision_named' => 'Page Revision for :pageName',
     'pages_revision_restored_from' => 'Restored from #:id; :summary',
-    'pages_revisions_created_by' => 'Created By',
-    'pages_revisions_date' => 'Revision Date',
+    'pages_revisions_created_by' => 'Sortzailea',
+    'pages_revisions_date' => 'Berrikuspen data',
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revision #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id Changes',
-    'pages_revisions_changelog' => 'Changelog',
-    'pages_revisions_changes' => 'Changes',
-    'pages_revisions_current' => 'Current Version',
-    'pages_revisions_preview' => 'Preview',
-    'pages_revisions_restore' => 'Restore',
+    'pages_revisions_editor' => 'Editor Type',
+    'pages_revisions_changelog' => 'Aldaketen erregistroa',
+    'pages_revisions_changes' => 'Aldaketak',
+    'pages_revisions_current' => 'Uneko bertsioa',
+    'pages_revisions_preview' => 'Aurrebista',
+    'pages_revisions_restore' => 'Berreskuratu',
     'pages_revisions_none' => 'This page has no revisions',
     'pages_copy_link' => 'Copy Link',
-    'pages_edit_content_link' => 'Edit Content',
+    'pages_edit_content_link' => 'Editatu edukia',
     'pages_permissions_active' => 'Page Permissions Active',
     'pages_initial_revision' => 'Initial publish',
-    'pages_initial_name' => 'New Page',
+    'pages_initial_name' => 'Orrialde berria',
     'pages_editing_draft_notification' => 'You are currently editing a draft that was last saved :timeDiff.',
     'pages_draft_edited_notification' => 'This page has been updated by since that time. It is recommended that you discard this draft.',
     'pages_draft_page_changed_since_creation' => 'This page has been updated since this draft was created. It is recommended that you discard this draft or take care not to overwrite any page changes.',
@@ -248,19 +259,19 @@ return [
     ],
     'pages_draft_discarded' => 'Draft discarded, The editor has been updated with the current page content',
     'pages_specific' => 'Specific Page',
-    'pages_is_template' => 'Page Template',
+    'pages_is_template' => 'Orrialde txantiloia',
 
     // Editor Sidebar
-    'page_tags' => 'Page Tags',
-    'chapter_tags' => 'Chapter Tags',
-    'book_tags' => 'Book Tags',
-    'shelf_tags' => 'Shelf Tags',
-    'tag' => 'Tag',
-    'tags' =>  'Tags',
-    'tag_name' =>  'Tag Name',
+    'page_tags' => 'Orrialde etiketak',
+    'chapter_tags' => 'Kapitulu etiketak',
+    'book_tags' => 'Liburu etiketak',
+    'shelf_tags' => 'Apalategi etiketak',
+    'tag' => 'Etiketa',
+    'tags' =>  'Etiketak',
+    'tag_name' =>  'Etiketa izena',
     'tag_value' => 'Tag Value (Optional)',
     'tags_explain' => "Add some tags to better categorise your content. \n You can assign a value to a tag for more in-depth organisation.",
-    'tags_add' => 'Add another tag',
+    'tags_add' => 'Beste bat gehitu',
     'tags_remove' => 'Remove this tag',
     'tags_usages' => 'Total tag usages',
     'tags_assigned_pages' => 'Assigned to Pages',
@@ -268,29 +279,29 @@ return [
     'tags_assigned_books' => 'Assigned to Books',
     'tags_assigned_shelves' => 'Assigned to Shelves',
     'tags_x_unique_values' => ':count unique values',
-    'tags_all_values' => 'All values',
+    'tags_all_values' => 'Balio guztiak',
     'tags_view_tags' => 'View Tags',
     'tags_view_existing_tags' => 'View existing tags',
     'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.',
-    'attachments' => 'Attachments',
+    'attachments' => 'Eranskinak',
     'attachments_explain' => 'Upload some files or attach some links to display on your page. These are visible in the page sidebar.',
     'attachments_explain_instant_save' => 'Changes here are saved instantly.',
-    'attachments_items' => 'Attached Items',
-    'attachments_upload' => 'Upload File',
+    'attachments_items' => 'Atxikiak',
+    'attachments_upload' => 'Kargatu artxiboak',
     'attachments_link' => 'Attach Link',
     'attachments_set_link' => 'Set Link',
     'attachments_delete' => 'Are you sure you want to delete this attachment?',
     'attachments_dropzone' => 'Drop files or click here to attach a file',
-    'attachments_no_files' => 'No files have been uploaded',
+    'attachments_no_files' => 'Ez da igo fitxategirik',
     'attachments_explain_link' => 'You can attach a link if you\'d prefer not to upload a file. This can be a link to another page or a link to a file in the cloud.',
-    'attachments_link_name' => 'Link Name',
+    'attachments_link_name' => 'Loturaren izena',
     'attachment_link' => 'Attachment link',
-    'attachments_link_url' => 'Link to file',
+    'attachments_link_url' => 'Fitxategiarentzako esteka',
     'attachments_link_url_hint' => 'Url of site or file',
     'attach' => 'Attach',
     'attachments_insert_link' => 'Add Attachment Link to Page',
     'attachments_edit_file' => 'Edit File',
-    'attachments_edit_file_name' => 'File Name',
+    'attachments_edit_file_name' => 'Fitxategi izena',
     'attachments_edit_drop_upload' => 'Drop files or click here to upload and overwrite',
     'attachments_order_updated' => 'Attachment order updated',
     'attachments_updated_success' => 'Attachment details updated',
@@ -314,25 +325,25 @@ return [
     'profile_not_created_shelves' => ':userName has not created any shelves',
 
     // Comments
-    'comment' => 'Comment',
-    'comments' => 'Comments',
-    'comment_add' => 'Add Comment',
-    'comment_placeholder' => 'Leave a comment here',
+    'comment' => 'Iruzkina',
+    'comments' => 'Iruzkinak',
+    'comment_add' => 'Iruzkina gehitu',
+    'comment_placeholder' => 'Utzi iruzkin bat hemen',
     'comment_count' => '{0} No Comments|{1} 1 Comment|[2,*] :count Comments',
-    'comment_save' => 'Save Comment',
+    'comment_save' => 'Iruzkina gorde',
     'comment_saving' => 'Saving comment...',
     'comment_deleting' => 'Deleting comment...',
-    'comment_new' => 'New Comment',
+    'comment_new' => 'Iruzkin berria',
     'comment_created' => 'commented :createDiff',
     'comment_updated' => 'Updated :updateDiff by :username',
     'comment_deleted_success' => 'Comment deleted',
-    'comment_created_success' => 'Comment added',
-    'comment_updated_success' => 'Comment updated',
-    'comment_delete_confirm' => 'Are you sure you want to delete this comment?',
+    'comment_created_success' => 'Iruzkina gehituta',
+    'comment_updated_success' => 'Iruzkina gehituta',
+    'comment_delete_confirm' => 'Ziur zaude iruzkin hau ezabatu nahi duzula?',
     'comment_in_reply_to' => 'In reply to :commentId',
 
     // Revision
-    'revision_delete_confirm' => 'Are you sure you want to delete this revision?',
+    'revision_delete_confirm' => 'Ziur zaude hau ezabatu nahi duzula?',
     'revision_restore_confirm' => 'Are you sure you want to restore this revision? The current page contents will be replaced.',
     'revision_delete_success' => 'Revision deleted',
     'revision_cannot_delete_latest' => 'Cannot delete the latest revision.',
index 250d5d92fc1df9f009965b93670766aacc90f625..bd25e49d56073779c7aa22c7c6610ff88c7647d3 100644 (file)
@@ -20,10 +20,10 @@ return [
     'ldap_cannot_connect' => 'Ezin izan da ldap zerbitzarira konektatu, hasierako konexioak huts egin du',
     'saml_already_logged_in' => 'Saioa aurretik hasita dago',
     'saml_user_not_registered' => ':name erabiltzailea ez dago erregistratua eta erregistro automatikoa ezgaituta dago',
-    'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
-    'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
+    'saml_no_email_address' => 'Ezin izan dugu posta helbiderik aurkitu erabiltzaile honentzat, kanpoko autentifikazio zerbitzuak bidalitako datuetan',
+    'saml_invalid_response_id' => 'Kanpoko egiazkotasun-sistemaren eskaria ez du onartzen aplikazio honek abiarazitako prozesu batek. Loginean atzera egitea izan daiteke arrazoia.',
     'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
-    'oidc_already_logged_in' => 'Already logged in',
+    'oidc_already_logged_in' => 'Dagoeneko saioa hasita',
     'oidc_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
     'oidc_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
     'oidc_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
@@ -84,13 +84,13 @@ return [
     'empty_comment' => 'Cannot add an empty comment.',
 
     // Error pages
-    '404_page_not_found' => 'Page Not Found',
+    '404_page_not_found' => 'Ez da orrialdea aurkitu',
     'sorry_page_not_found' => 'Sorry, The page you were looking for could not be found.',
     'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
-    'image_not_found' => 'Image Not Found',
+    'image_not_found' => 'Irudia Ez da Aurkitu',
     'image_not_found_subtitle' => 'Sorry, The image file you were looking for could not be found.',
     'image_not_found_details' => 'If you expected this image to exist it might have been deleted.',
-    'return_home' => 'Return to home',
+    'return_home' => 'Itzuli hasierara',
     'error_occurred' => 'Akats bat gertatu da',
     'app_down' => ':appName is down right now',
     'back_soon' => 'It will be back up soon.',
index dac1e107e1c5f0b34f7255795e083b9ffab7f56e..dbac076c8595ca1f48e5633e67bbbec848f95c59 100644 (file)
@@ -27,17 +27,17 @@ return [
     'app_secure_images' => 'Goi Segurtasuneko irudiak',
     'app_secure_images_toggle' => 'Goi Segurtasuneko irudiak aktibatu',
     'app_secure_images_desc' => 'Antzezpen arrazoiengatik, irudi guztiak publikoak dira. Aukera honek ausazko lokarri bat gehitzen du irudiaren aurrean. Segurtasun-indizeek ezin dute sarrera erraza eragotzi.',
-    'app_editor' => 'Orri editorea',
-    'app_editor_desc' => 'Aukeratu zein editore erabiliko duten erabiltzaile guztiek orriak editatzeko.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'HTML pertsonalizatuko goiburu edukia',
     'app_custom_html_desc' => 'Hemen sarturiko edozein eduki <head> eremuko behekaldean sartuko da orrialde guztietan. Honek estiloak gainditzeko edo analitika-kodea gehitzeko balio du.',
-    'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.',
+    'app_custom_html_disabled_notice' => 'HTML edukiera desgaituta dago konfigurazio-orri honetan, edozein aldaketa eten daitekeela bermatzeko.',
     'app_logo' => 'Aplikazioaren logoa',
-    'app_logo_desc' => 'This image should be 43px in height. <br>Large images will be scaled down.',
+    'app_logo_desc' => 'Irudi honek 43px izan behar du altueran.<br>Irudi handiagoak txikitu egingo dira.',
     'app_primary_color' => 'Aplikazioaren kolore lehenetsia',
-    'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.',
+    'app_primary_color_desc' => 'Konfiguratu aplikaziorako kolore nagusia, botoi, banner eta estekak barne.',
     'app_homepage' => 'Aplikazioko hasiera orria',
-    'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.',
+    'app_homepage_desc' => 'Aukeratu hasierako orriko bista, defektuzkoa beharrean. Orrialde baimenak ez dira kontutan hartuko aukeratutako orrialdeentzat.',
     'app_homepage_select' => 'Aukeratu Orria',
     'app_footer_links' => 'Beheko aldeko estekak',
     'app_footer_links_desc' => 'Add links to show within the site footer. These will be displayed at the bottom of most pages, including those that do not require login. You can use a label of "trans::<key>" to use system-defined translations. For example: Using "trans::common.privacy_policy" will provide the translated text "Privacy Policy" and "trans::common.terms_of_service" will provide the translated text "Terms of Service".',
@@ -112,18 +112,18 @@ return [
     'recycle_bin_restore_notification' => 'Restored :count total items from the recycle bin.',
 
     // Audit Log
-    'audit' => 'Audit Log',
+    'audit' => 'Auditoretza erregistroak',
     'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.',
-    'audit_event_filter' => 'Event Filter',
+    'audit_event_filter' => 'Gertakari filtroa',
     'audit_event_filter_no_filter' => 'Filtrorik ez',
-    'audit_deleted_item' => 'Deleted Item',
-    'audit_deleted_item_name' => 'Name: :name',
+    'audit_deleted_item' => 'Ezabatutako edukiak',
+    'audit_deleted_item_name' => 'Izena :name',
     'audit_table_user' => 'Erabiltzailea',
     'audit_table_event' => 'Gertaera',
     'audit_table_related' => 'Related Item or Detail',
     'audit_table_ip' => 'IP helbidea',
     'audit_table_date' => 'Azken aktibitate data',
-    'audit_date_from' => 'Date Range From',
+    'audit_date_from' => 'Data tartea',
     'audit_date_to' => 'Data tartea',
 
     // Role Settings
@@ -131,20 +131,20 @@ return [
     'role_user_roles' => 'Erabiltzailearen rola',
     'role_create' => 'Rol berria sortu',
     'role_create_success' => 'Rola ondo sortu da',
-    'role_delete' => 'Delete Role',
+    'role_delete' => 'Ezabatu Rol-a',
     'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.',
     'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
-    'role_delete_no_migration' => "Don't migrate users",
-    'role_delete_sure' => 'Are you sure you want to delete this role?',
-    'role_delete_success' => 'Role successfully deleted',
-    'role_edit' => 'Edit Role',
-    'role_details' => 'Role Details',
-    'role_name' => 'Role Name',
+    'role_delete_no_migration' => "Ez migratu erabiltzaileak",
+    'role_delete_sure' => 'Ziur zaude rol hau ezabatu nahi duzula?',
+    'role_delete_success' => 'Rola ezabatua',
+    'role_edit' => 'Editatu rola',
+    'role_details' => 'Ireki xehetasunak',
+    'role_name' => 'Rol izena',
     'role_desc' => 'Short Description of Role',
     'role_mfa_enforced' => 'Requires Multi-Factor Authentication',
     'role_external_auth_id' => 'External Authentication IDs',
     'role_system' => 'System Permissions',
-    'role_manage_users' => 'Manage users',
+    'role_manage_users' => 'Erabiltzaileak kudeatu',
     'role_manage_roles' => 'Manage roles & role permissions',
     'role_manage_entity_permissions' => 'Manage all book, chapter & page permissions',
     'role_manage_own_entity_permissions' => 'Manage permissions on own book, chapter & pages',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Sistemako APIra sarrera',
     'role_manage_settings' => 'Kudeatu aplikazio ezarpenak',
     'role_export_content' => 'Exportatu edukia',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Fitxategi baimenak',
     'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.',
     'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.',
@@ -178,13 +179,13 @@ return [
     'users_password' => 'Erabiltzaile pasahitza',
     'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 8 characters long.',
     'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.',
-    'users_send_invite_option' => 'Send user invite email',
-    'users_external_auth_id' => 'External Authentication ID',
+    'users_send_invite_option' => 'Erabiltzailea gonbidatzeko emaila bidali',
+    'users_external_auth_id' => 'Kanpo autentikazioa IDa',
     'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
     'users_password_warning' => 'Only fill the below if you would like to change your password.',
     'users_system_public' => 'This user represents any guest users that visit your instance. It cannot be used to log in but is assigned automatically.',
     'users_delete' => 'Ezabatu erabiltzailea',
-    'users_delete_named' => 'Delete user :userName',
+    'users_delete_named' => ':userName erabiltzailea ezabatu',
     'users_delete_warning' => 'This will fully delete this user with the name \':userName\' from the system.',
     'users_delete_confirm' => 'Are you sure you want to delete this user?',
     'users_migrate_ownership' => 'Migrate Ownership',
@@ -192,7 +193,7 @@ return [
     'users_none_selected' => 'Erabiltzailerik ez duzu aukeratu',
     'users_edit' => 'Erabiltzaile editatu',
     'users_edit_profile' => 'Editatu profila',
-    'users_avatar' => 'User Avatar',
+    'users_avatar' => 'Erabiltzaile avatarra',
     'users_avatar_desc' => 'Select an image to represent this user. This should be approx 256px square.',
     'users_preferred_language' => 'Hobetsitako hizkuntza',
     'users_preferred_language_desc' => 'This option will change the language used for the user-interface of the application. This will not affect any user-created content.',
@@ -202,10 +203,10 @@ return [
     'users_social_disconnect' => 'Deskonektatu kontua',
     'users_social_connected' => ':socialAccount account was successfully attached to your profile.',
     'users_social_disconnected' => ':socialAccount account was successfully disconnected from your profile.',
-    'users_api_tokens' => 'API Tokens',
+    'users_api_tokens' => 'API tokenak',
     'users_api_tokens_none' => 'No API tokens have been created for this user',
-    'users_api_tokens_create' => 'Create Token',
-    'users_api_tokens_expires' => 'Expires',
+    'users_api_tokens_create' => 'Sortu Tokena',
+    'users_api_tokens_expires' => 'Iraungita',
     'users_api_tokens_docs' => 'API dokumentazioa',
     'users_mfa' => 'Multi-Factor Authentication',
     'users_mfa_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
@@ -213,7 +214,7 @@ return [
     'users_mfa_configure' => 'Configure Methods',
 
     // API Tokens
-    'user_api_token_create' => 'Create API Token',
+    'user_api_token_create' => 'Sortu Tokena',
     'user_api_token_name' => 'Izena',
     'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
     'user_api_token_expiry' => 'Iraungitze data',
index 0a335b1180cc927fa0330187ab0029761bbbc63a..2eab19661f858b18a23b00c776716f027362f56f 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'پیش نویس ذخیره شده در',
     'pages_edit_delete_draft' => 'حذف پیش نویس',
     'pages_edit_discard_draft' => 'دور انداختن پیش نویس',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'تنظیم تغییرات',
     'pages_edit_enter_changelog_desc' => 'توضیح مختصری از تغییراتی که ایجاد کرده اید وارد کنید',
     'pages_edit_enter_changelog' => 'وارد کردن تغییرات',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'ذخیره صفحه',
     'pages_title' => 'عنوان صفحه',
     'pages_name' => 'نام صفحه',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'تجدید نظر #:id',
     'pages_revisions_numbered_changes' => 'بازبینی #:id تغییرات',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'لیست تغییرات',
     'pages_revisions_changes' => 'تغییرات',
     'pages_revisions_current' => 'نسخه‌ی جاری',
index d5ddd2f23e78786684f7bcdabfc72f00040c54c5..5ab82290d8ebb16fe004de43098704ea49821085 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'آپلود تصویر با امنیت بالاتر',
     'app_secure_images_toggle' => 'آپلود تصویر با امنیت بالاتر',
     'app_secure_images_desc' => 'به دلایل عملکرد، همه تصاویر عمومی هستند. این گزینه یک رشته تصادفی و غیرقابل حدس زدن را در مقابل آدرس های تصویر اضافه می کند. برای جلوگیری از دسترسی آسان، اطمینان حاصل کنید که فهرست های دایرکتوری فعال نیستند.',
-    'app_editor' => 'ویرایشگر صفحه',
-    'app_editor_desc' => 'انتخاب کنید کدام ویرایشگر توسط همه کاربران برای ویرایش صفحات استفاده شود.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'محتوای اصلی HTML سفارشی',
     'app_custom_html_desc' => 'هر محتوای اضافه شده در اینجا در پایین بخش <head> هر صفحه درج می شود. این برای تغییر سبک ها یا اضافه کردن کد تجزیه و تحلیل مفید است.',
     'app_custom_html_disabled_notice' => 'محتوای سر HTML سفارشی در این صفحه تنظیمات غیرفعال است تا اطمینان حاصل شود که هر گونه تغییر شکسته می تواند برگردانده شود.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'دسترسی به API سیستم',
     'role_manage_settings' => 'تنظیمات برنامه را مدیریت کنید',
     'role_export_content' => 'صادرات محتوا',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'مجوزهای دارایی',
     'roles_system_warning' => 'توجه داشته باشید که دسترسی به هر یک از سه مجوز فوق می‌تواند به کاربر اجازه دهد تا امتیازات خود یا امتیازات دیگران را در سیستم تغییر دهد. فقط نقش هایی را با این مجوزها به کاربران مورد اعتماد اختصاص دهید.',
     'role_asset_desc' => 'این مجوزها دسترسی پیش‌فرض به دارایی‌های درون سیستم را کنترل می‌کنند. مجوزهای مربوط به کتاب‌ها، فصل‌ها و صفحات این مجوزها را لغو می‌کنند.',
index d1fd92597244dea1405134b67b7efae4cb7669c5..9537c09664fe57efda0e52251c523867123b6ada 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Brouillon enregistré le ',
     'pages_edit_delete_draft' => 'Supprimer le brouillon',
     'pages_edit_discard_draft' => 'Jeter le brouillon',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Remplir le journal des changements',
     'pages_edit_enter_changelog_desc' => 'Entrez une brève description des changements effectués',
     'pages_edit_enter_changelog' => 'Ouvrir le journal des changements',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Enregistrer la page',
     'pages_title' => 'Titre de la page',
     'pages_name' => 'Nom de la page',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Révision #:id',
     'pages_revisions_numbered_changes' => 'Modification #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Journal des changements',
     'pages_revisions_changes' => 'Changements',
     'pages_revisions_current' => 'Version actuelle',
index fa6cf85ff8ffe92d6855c4ab8ddce67aeae49b8b..1c57ad4c0f53e3042d257b224489c1b6a8a7601e 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Ajout d\'image sécurisé',
     'app_secure_images_toggle' => 'Activer l\'ajout d\'image sécurisé',
     'app_secure_images_desc' => 'Pour des questions de performances, toutes les images sont publiques. Cette option ajoute une chaîne aléatoire difficile à deviner dans les URLs des images.',
-    'app_editor' => 'Éditeur des pages',
-    'app_editor_desc' => 'Sélectionnez l\'éditeur qui sera utilisé pour modifier les pages.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'HTML personnalisé dans l\'en-tête',
     'app_custom_html_desc' => 'Le contenu inséré ici sera ajouté en bas de la balise <head> de toutes les pages. Vous pouvez l\'utiliser pour ajouter du CSS personnalisé ou un tracker analytique.',
     'app_custom_html_disabled_notice' => 'Le contenu de l\'en-tête HTML personnalisé est désactivé sur cette page de paramètres pour garantir que les modifications les plus récentes puissent être annulées.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Accès à l\'API du système',
     'role_manage_settings' => 'Gérer les préférences de l\'application',
     'role_export_content' => 'Exporter le contenu',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Permissions des ressources',
     'roles_system_warning' => 'Sachez que l\'accès à l\'une des trois permissions ci-dessus peut permettre à un utilisateur de modifier ses propres privilèges ou les privilèges des autres utilisateurs du système. N\'attribuez uniquement des rôles avec ces permissions qu\'à des utilisateurs de confiance.',
     'role_asset_desc' => 'Ces permissions contrôlent l\'accès par défaut des ressources dans le système. Les permissions dans les livres, les chapitres et les pages ignoreront ces permissions',
index d0add8d2e3bf34f485a2853eae91fdadf3c3794d..ad49c895fee69d756586bc35ae2db0dcfa3f36b0 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'טיוטה נשמרה ב ',
     'pages_edit_delete_draft' => 'מחק טיוטה',
     'pages_edit_discard_draft' => 'התעלם מהטיוטה',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'הגדר יומן שינויים',
     'pages_edit_enter_changelog_desc' => 'ציין תיאור קצר אודות השינויים שביצעת',
     'pages_edit_enter_changelog' => 'הכנס יומן שינויים',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'שמור דף',
     'pages_title' => 'כותרת דף',
     'pages_name' => 'שם הדף',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'נוסח #:id',
     'pages_revisions_numbered_changes' => 'שינויי נוסח #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'יומן שינויים',
     'pages_revisions_changes' => 'שינויים',
     'pages_revisions_current' => 'גירסא נוכחית',
index 5ba6bf3f5ef73c2f764c3412f93a84dd3d457b95..e9cf47b279f49a71f9dadf9a4e54e42e93934a42 100755 (executable)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'העלאת תמונות מאובטחת',
     'app_secure_images_toggle' => 'אפשר העלאת תמונות מאובטחת',
     'app_secure_images_desc' => 'משיקולי ביצועים, כל התמונות הינן ציבוריות. אפשרות זו מוסיפה מחרוזת אקראית שקשה לנחש לכל כתובת של תמונה. אנא ודא שאפשרות הצגת תוכן התיקייה מבוטל.',
-    'app_editor' => 'עורך הדפים',
-    'app_editor_desc' => 'בחר באמצעות איזה עורך תתבצע עריכת הדפים',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'HTML מותאם אישית לחלק העליון',
     'app_custom_html_desc' => 'כל קוד שיתווסף כאן, יופיע בתחתית תגית ה head של כל דף. חלק זה שימושי על מנת להגדיר עיצובי CSS והתקנת קוד Analytics',
     'app_custom_html_disabled_notice' => 'קוד HTML מותאם מבוטל בדף ההגדרות על מנת לוודא ששינויים שגורמים לבעיה יוכלו להיות מבוטלים לאחר מכן',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'גש ל-API המערכת',
     'role_manage_settings' => 'ניהול הגדרות יישום',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'הרשאות משאבים',
     'roles_system_warning' => 'שימו לב לכך שגישה לכל אחת משלושת ההרשאות הנ"ל יכולה לאפשר למשתמש לשנות את הפריווילגיות שלהם או של אחרים במערכת. הגדירו תפקידים להרשאות אלה למשתמשים בהם אתם בוטחים בלבד.',
     'role_asset_desc' => 'הרשאות אלו שולטות בגישת ברירת המחדל למשאבים בתוך המערכת. הרשאות של ספרים, פרקים ודפים יגברו על הרשאות אלו.',
index 333fdeb39bff24434b56442ed59ca2b87a339538..e5e57b22b7b751aa8e83c2b9be5569498c06692c 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Nacrt spremljen kao',
     'pages_edit_delete_draft' => 'Izbriši nacrt',
     'pages_edit_discard_draft' => 'Odbaci nacrt',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Postavi dnevnik promjena',
     'pages_edit_enter_changelog_desc' => 'Ukratko opišite promjene koje ste napravili',
     'pages_edit_enter_changelog' => 'Unesi dnevnik promjena',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Spremi stranicu',
     'pages_title' => 'Naslov stranice',
     'pages_name' => 'Ime stranice',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revizija #:id',
     'pages_revisions_numbered_changes' => 'Revizija #:id Promjene',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Dnevnik promjena',
     'pages_revisions_changes' => 'Promjene',
     'pages_revisions_current' => 'Trenutna verzija',
index 77735bf7df26627dac9d4223f5d563302ce548e8..cc7c5c89b713e3c7963637732d3f0495f712f896 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Visoka razina sigurnosti prijenosa slika',
     'app_secure_images_toggle' => 'Omogući visoku sigurnost prijenosa slika',
     'app_secure_images_desc' => 'Zbog specifične izvedbe sve su slike javne. Osigurajte da indeksi direktorija nisu omogućeni kako bi se spriječio neovlašten pristup.',
-    'app_editor' => 'Uređivač stranice',
-    'app_editor_desc' => 'Odaberite uređivače stranica',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Prilagođeni HTML sadržaj',
     'app_custom_html_desc' => 'Sav sadržaj dodan ovdje bit će umetnut na dno <glavne> stranice. To je korisno za stiliziranje i dodavanje analitičkog koda.',
     'app_custom_html_disabled_notice' => 'Prilagođeni HTML je onemogućen kako bi se osiguralo vraćanje promjena u slučaju kvara.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'API pristup',
     'role_manage_settings' => 'Upravljanje postavkama aplikacija',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Upravljanje vlasništvom',
     'roles_system_warning' => 'Uzmite u obzir da pristup bilo kojem od ovih dopuštenja dozvoljavate korisniku upravljanje dopuštenjima ostalih u sustavu. Ova dopuštenja dodijelite pouzdanim korisnicima.',
     'role_asset_desc' => 'Ova dopuštenja kontroliraju zadane pristupe. Dopuštenja za knjige, poglavlja i stranice ih poništavaju.',
index f017d1371145d27b5ad696d7c613dd40f261abfc..58b44076f08d3bb4cf2ebd5167b3e026a4b96096 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Vázlat elmentve:',
     'pages_edit_delete_draft' => 'Vázlat törlése',
     'pages_edit_discard_draft' => 'Vázlat elvetése',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Változásnapló beállítása',
     'pages_edit_enter_changelog_desc' => 'A végrehajtott módosítások rövid leírása',
     'pages_edit_enter_changelog' => 'Változásnapló megadása',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Oldal mentése',
     'pages_title' => 'Oldal címe',
     'pages_name' => 'Oldal neve',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Változat #:id',
     'pages_revisions_numbered_changes' => '#:id változat módosításai',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Változásnapló',
     'pages_revisions_changes' => 'Módosítások',
     'pages_revisions_current' => 'Aktuális verzió',
index 700bdc0de52fee3325cf7979aa74dd545cd63420..5cd15c4877e286f536a39af1010c397ce9aea647 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Magasabb biztonságú képfeltöltés',
     'app_secure_images_toggle' => 'Magasabb biztonságú képfeltöltés engedélyezése',
     'app_secure_images_desc' => 'Teljesítmény optimalizálási okokból minden kép nyilvános. Ez a beállítás egy véletlenszerű, nehezen kitalálható karakterláncot illeszt a képek útvonalának elejére. Meg kell győződni róla, hogy a könnyű hozzáférés megakadályozása érdekében a könyvtár indexek nincsenek engedélyezve.',
-    'app_editor' => 'Oldalszerkesztő',
-    'app_editor_desc' => 'Annak kiválasztása, hogy a felhasználók melyik szerkesztőt használhatják az oldalak szerkesztéséhez.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Egyéni HTML fejléc tartalom',
     'app_custom_html_desc' => 'Az itt hozzáadott bármilyen tartalom be lesz illesztve minden oldal <head> szekciójának aljára. Ez hasznos a stílusok felülírásához van analitikai kódok hozzáadásához.',
     'app_custom_html_disabled_notice' => 'Az egyéni HTML fejléc tartalom le van tiltva ezen a beállítási oldalon, hogy az esetleg hibásan megadott módosításokat vissza lehessen állítani.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Hozzáférés a rendszer API-hoz',
     'role_manage_settings' => 'Alkalmazás beállításainak kezelése',
     'role_export_content' => 'Tartalom exportálása',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Eszköz jogosultságok',
     'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.',
     'role_asset_desc' => 'Ezek a jogosultság vezérlik a alapértelmezés szerinti hozzáférést a rendszerben található eszközökhöz. A könyvek, fejezetek és oldalak jogosultságai felülírják ezeket a jogosultságokat.',
index 423c92ff6164b253ab8eaaab5d27b1c44bced4b4..d76a05a01be4979548f9cb4e818fc56184623c34 100644 (file)
@@ -21,7 +21,7 @@ return [
     'email' => 'Email',
     'password' => 'Kata Sandi',
     'password_confirm' => 'Konfirmasi Kata Sandi',
-    'password_hint' => 'Must be at least 8 characters',
+    'password_hint' => 'Harus minimal 8 karakter',
     'forgot_password' => 'Lupa Password?',
     'remember_me' => 'Ingat saya',
     'ldap_email_hint' => 'Harap masukkan email yang akan digunakan untuk akun ini.',
@@ -77,13 +77,13 @@ return [
     'mfa_setup' => 'Setup Multi-Factor Authentication',
     'mfa_setup_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
     'mfa_setup_configured' => 'Already configured',
-    'mfa_setup_reconfigure' => 'Reconfigure',
+    'mfa_setup_reconfigure' => 'Konfigurasi ulang',
     'mfa_setup_remove_confirmation' => 'Apakah Anda yakin ingin menghapus metode autentikasi multi-faktor ini?',
     'mfa_setup_action' => 'Setup',
     'mfa_backup_codes_usage_limit_warning' => 'You have less than 5 backup codes remaining, Please generate and store a new set before you run out of codes to prevent being locked out of your account.',
-    'mfa_option_totp_title' => 'Mobile App',
+    'mfa_option_totp_title' => 'Aplikasi Seluler',
     'mfa_option_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
-    'mfa_option_backup_codes_title' => 'Backup Codes',
+    'mfa_option_backup_codes_title' => 'Kode Cadangan',
     'mfa_option_backup_codes_desc' => 'Securely store a set of one-time-use backup codes which you can enter to verify your identity.',
     'mfa_gen_confirm_and_enable' => 'Confirm and Enable',
     'mfa_gen_backup_codes_title' => 'Backup Codes Setup',
@@ -100,9 +100,9 @@ return [
     'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.',
     'mfa_verify_no_methods' => 'No Methods Configured',
     'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.',
-    'mfa_verify_use_totp' => 'Verify using a mobile app',
-    'mfa_verify_use_backup_codes' => 'Verify using a backup code',
-    'mfa_verify_backup_code' => 'Backup Code',
+    'mfa_verify_use_totp' => 'Verifikasi menggunakan aplikasi seluler',
+    'mfa_verify_use_backup_codes' => 'Verifikasi menggunakan kode cadangan',
+    'mfa_verify_backup_code' => 'Kode Cadangan',
     'mfa_verify_backup_code_desc' => 'Enter one of your remaining backup codes below:',
     'mfa_verify_backup_code_enter_here' => 'Enter backup code here',
     'mfa_verify_totp_desc' => 'Enter the code, generated using your mobile app, below:',
index 82712029210ebeec005dbf5530d8ad4c0918c042..88204b416e2ec7f2d6eba405b5ad7a246d4f5471 100644 (file)
@@ -7,27 +7,27 @@
  */
 return [
     // General editor terms
-    'general' => 'General',
-    'advanced' => 'Advanced',
-    'none' => 'None',
-    'cancel' => 'Cancel',
-    'save' => 'Save',
-    'close' => 'Close',
+    'general' => 'Umum',
+    'advanced' => 'Lanjutan',
+    'none' => 'Tidak Ada',
+    'cancel' => 'Batal',
+    'save' => 'Simpan',
+    'close' => 'Tutup',
     'undo' => 'Undo',
-    'redo' => 'Redo',
-    'left' => 'Left',
-    'center' => 'Center',
-    'right' => 'Right',
-    'top' => 'Top',
-    'middle' => 'Middle',
-    'bottom' => 'Bottom',
-    'width' => 'Width',
-    'height' => 'Height',
-    'More' => 'More',
-    'select' => 'Select...',
+    'redo' => 'Ulangi',
+    'left' => 'Kiri',
+    'center' => 'Tengah',
+    'right' => 'Kanan',
+    'top' => 'Atas',
+    'middle' => 'Sedang',
+    'bottom' => 'Bawah',
+    'width' => 'Lebar',
+    'height' => 'Tinggi',
+    'More' => 'Lebih Banyak',
+    'select' => 'Pilih...',
 
     // Toolbar
-    'formats' => 'Formats',
+    'formats' => 'Format',
     'header_large' => 'Large Header',
     'header_medium' => 'Medium Header',
     'header_small' => 'Small Header',
@@ -37,12 +37,12 @@ return [
     'inline_code' => 'Inline code',
     'callouts' => 'Callouts',
     'callout_information' => 'Information',
-    'callout_success' => 'Success',
-    'callout_warning' => 'Warning',
-    'callout_danger' => 'Danger',
-    'bold' => 'Bold',
+    'callout_success' => 'Sukses',
+    'callout_warning' => 'Peringatan',
+    'callout_danger' => 'Bahaya',
+    'bold' => 'Berani',
     'italic' => 'Italic',
-    'underline' => 'Underline',
+    'underline' => 'Garis Bawah',
     'strikethrough' => 'Strikethrough',
     'superscript' => 'Superscript',
     'subscript' => 'Subscript',
index 366776c86a136666722e6794e2dbedab9e172f7c..65a9c4149d5755af8cd12fd77aa4e9d016df756f 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Draf disimpan pada ',
     'pages_edit_delete_draft' => 'Hapus Draf',
     'pages_edit_discard_draft' => 'Buang Draf',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Atur Changelog',
     'pages_edit_enter_changelog_desc' => 'Masukkan deskripsi singkat tentang perubahan yang Anda buat',
     'pages_edit_enter_changelog' => 'Masuk ke Changelog',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Simpan Halaman',
     'pages_title' => 'Judul Halaman',
     'pages_name' => 'Nama Halaman',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revisi #:id',
     'pages_revisions_numbered_changes' => 'Revisi #:id Berubah',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Changelog',
     'pages_revisions_changes' => 'Perubahan',
     'pages_revisions_current' => 'Versi sekarang',
index 19221d40a599810c150d67b68a994ef898da3cf6..0f53c758c44abac32408ed2d5774cf839bf8563a 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Unggahan Gambar Keamanan Lebih Tinggi',
     'app_secure_images_toggle' => 'Aktifkan unggahan gambar dengan keamanan lebih tinggi',
     'app_secure_images_desc' => 'Untuk alasan performa, semua gambar bersifat publik. Opsi ini menambahkan string acak yang sulit ditebak di depan url gambar. Pastikan indeks direktori tidak diaktifkan untuk mencegah akses mudah.',
-    'app_editor' => 'Halaman Editor',
-    'app_editor_desc' => 'Pilih editor mana yang akan digunakan oleh semua pengguna untuk mengedit halaman.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Kustom Konten HTML Head',
     'app_custom_html_desc' => 'Konten apa pun yang ditambahkan di sini akan dimasukkan ke bagian bawah <head> bagian dari setiap halaman. Ini berguna untuk mengganti gaya atau menambahkan kode analitik.',
     'app_custom_html_disabled_notice' => 'Kustom konten HTML Head dinonaktifkan pada halaman pengaturan ini untuk memastikan setiap perubahan yang mengganggu dapat dikembalikan.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Akses Sistem API',
     'role_manage_settings' => 'Kelola setelan aplikasi',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Izin Aset',
     'roles_system_warning' => 'Ketahuilah bahwa akses ke salah satu dari tiga izin di atas dapat memungkinkan pengguna untuk mengubah hak mereka sendiri atau orang lain dalam sistem. Hanya tetapkan peran dengan izin ini untuk pengguna tepercaya.',
     'role_asset_desc' => 'Izin ini mengontrol akses default ke aset dalam sistem. Izin pada Buku, Bab, dan Halaman akan menggantikan izin ini.',
index 36a3397f5ae93bc5267bd8140465b61d8de6d7ec..e1fcbc7246c2b9ee8f7ce9410a202883007fee3d 100644 (file)
@@ -15,7 +15,7 @@ return [
     'alpha_dash'           => ':attribute hanya boleh berisi huruf, angka, tanda hubung, dan garis bawah.',
     'alpha_num'            => ':attribute hanya boleh berisi huruf dan angka.',
     'array'                => ':attribute harus berupa larik.',
-    'backup_codes'         => 'The provided code is not valid or has already been used.',
+    'backup_codes'         => 'Kode yang diberikan tidak valid atau telah digunakan.',
     'before'               => ':attribute harus tanggal sebelum :date.',
     'between'              => [
         'numeric' => ':attribute harus di antara :min dan :max.',
@@ -32,7 +32,7 @@ return [
     'digits_between'       => ':attribute harus diantara :min dan :max digit.',
     'email'                => ':attrtibute Harus alamat e-mail yang valid.',
     'ends_with' => ':attribute harus diakhiri dengan salah satu dari berikut ini: :values',
-    'file'                 => 'The :attribute must be provided as a valid file.',
+    'file'                 => ':attribute harus diberikan sebagai file yang valid.',
     'filled'               => ':attribute bidang diperlukan.',
     'gt'                   => [
         'numeric' => ':attribute harus lebih besar dari :value.',
@@ -100,7 +100,7 @@ return [
     ],
     'string'               => ':attribute harus berupa string.',
     'timezone'             => ':attribute harus menjadi zona yang valid.',
-    'totp'                 => 'The provided code is not valid or has expired.',
+    'totp'                 => 'Kode yang diberikan tidak valid atau telah kedaluwarsa.',
     'unique'               => ':attribute sudah diambil.',
     'url'                  => ':attribute format tidak valid.',
     'uploaded'             => 'Berkas tidak dapat diunggah. Server mungkin tidak menerima berkas dengan ukuran ini.',
index 9c9c0d58ddf235f57e9f954a951cb4d028ae1b2a..ab4286d721b3cfa2b1d25f62d65508047f89c6a6 100755 (executable)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Bozza salvata alle ',
     'pages_edit_delete_draft' => 'Elimina Bozza',
     'pages_edit_discard_draft' => 'Scarta Bozza',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Imposta Changelog',
     'pages_edit_enter_changelog_desc' => 'Inserisci una breve descrizione dei cambiamenti che hai apportato',
     'pages_edit_enter_changelog' => 'Inserisci Changelog',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Salva Pagina',
     'pages_title' => 'Titolo Pagina',
     'pages_name' => 'Nome Pagina',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revisione #:id',
     'pages_revisions_numbered_changes' => 'Modifiche Revisione #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Cambiamenti',
     'pages_revisions_changes' => 'Cambiamenti',
     'pages_revisions_current' => 'Versione Corrente',
index 4445c2cb6dd34eb91b99efa5e850cb7f1a66905f..94f2de6f76e88a6e50bec5cf0f5486d6851eb6cd 100755 (executable)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Abilitare una sicurezza maggiore per le immagini caricate?',
     'app_secure_images_toggle' => 'Abilita sicurezza aggiuntiva negli upload delle immagini',
     'app_secure_images_desc' => 'Per una ragione di prestazioni, tutte le immagini sono pubbliche. Questa opzione aaggiunge una stringa, difficile da indovinare, random negli url delle immagini. Assicurati che il listing delle cartelle non sia abilitato per prevenire un accesso semplice.',
-    'app_editor' => 'Editor pagine',
-    'app_editor_desc' => 'Seleziona quale editor verrà usato da tutti gli utenti per modificare le pagine.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Contenuto Head HTML Custom',
     'app_custom_html_desc' => 'Qualsiasi contenuto aggiunto qui verrà inserito alla fine della sezione <head> di tutte le pagine. Questo è utile per sovrascrivere lo stile o aggiungere il codice per gli analytics.',
     'app_custom_html_disabled_notice' => 'Il contenuto HTML personalizzato è disabilitato su questa pagina impostazioni per garantire che eventuali modifiche possano essere ripristinate.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'API sistema d\'accesso',
     'role_manage_settings' => 'Gestire impostazioni app',
     'role_export_content' => 'Esporta contenuto',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Permessi Entità',
     'roles_system_warning' => 'Siate consapevoli che l\'accesso a uno dei tre permessi qui sopra, può consentire a un utente di modificare i propri privilegi o i privilegi di altri nel sistema. Assegna ruoli con questi permessi solo ad utenti fidati.',
     'role_asset_desc' => 'Questi permessi controllano l\'accesso di default alle entità. I permessi nei Libri, Capitoli e Pagine sovrascriveranno questi.',
index b2845b27e953358d81bc942037b32ba36fa54fb4..45eaa3287970fc67d69efa3706bf6989e18fb1f8 100644 (file)
@@ -53,15 +53,15 @@ return [
 
     // Webhooks
     'webhook_create' => 'created webhook',
-    'webhook_create_notification' => 'Webhook successfully created',
+    'webhook_create_notification' => 'Webhookが正常に作成されました',
     'webhook_update' => 'updated webhook',
-    'webhook_update_notification' => 'Webhook successfully updated',
+    'webhook_update_notification' => 'Webhookが正常に更新されました',
     'webhook_delete' => 'deleted webhook',
-    'webhook_delete_notification' => 'Webhook successfully deleted',
+    'webhook_delete_notification' => 'Webhookが正常に削除されました',
 
     // Users
-    'user_update_notification' => 'User successfully updated',
-    'user_delete_notification' => 'User successfully removed',
+    'user_update_notification' => 'ユーザーが正常に更新されました',
+    'user_delete_notification' => 'ユーザーが正常に削除されました',
 
     // Other
     'commented_on'                => 'がコメント:',
index 70b9611004a55b6ede12eec11ef4bbac2b701fd9..7c6cc1f59519f407fd141464c5cf40a03c8694e9 100644 (file)
@@ -75,7 +75,7 @@ return [
     'status_active' => '有効',
     'status_inactive' => '無効',
     'never' => '該当なし',
-    'none' => 'None',
+    'none' => 'なし',
 
     // Header
     'header_menu_expand' => 'ヘッダーメニューを展開',
index e21a6d5a0bca4b8842fc8ebf604e9d1d5219f329..aaed115f2be002e80ce106514bccfc707e716887 100644 (file)
@@ -24,7 +24,7 @@ return [
     'width' => '幅',
     'height' => '高さ',
     'More' => 'さらに表示',
-    'select' => 'Select...',
+    'select' => '選択...',
 
     // Toolbar
     'formats' => '書式',
@@ -53,10 +53,10 @@ return [
     'align_left' => '左揃え',
     'align_center' => '中央揃え',
     'align_right' => '右揃え',
-    'align_justify' => 'Justify',
+    'align_justify' => '両端揃え',
     'list_bullet' => '箇条書き',
     'list_numbered' => '番号付き箇条書き',
-    'list_task' => 'Task list',
+    'list_task' => 'タスクリスト',
     'indent_increase' => 'インデントを増やす',
     'indent_decrease' => 'インデントを減らす',
     'table' => '表',
@@ -93,10 +93,10 @@ return [
     'cell_properties_title' => 'セルの詳細設定',
     'cell_type' => 'セルタイプ',
     'cell_type_cell' => 'セル',
-    'cell_scope' => 'Scope',
+    'cell_scope' => '見出しとの関連',
     'cell_type_header' => 'ヘッダーセル',
-    'merge_cells' => 'Merge cells',
-    'split_cell' => 'Split cell',
+    'merge_cells' => 'セルを結合',
+    'split_cell' => 'セルを分割',
     'table_row_group' => '行グループ',
     'table_column_group' => '列グループ',
     'horizontal_align' => '水平方向の配置',
@@ -124,16 +124,16 @@ return [
     'caption' => '表題',
     'show_caption' => 'キャプションの表示',
     'constrain' => '縦横比を保持する',
-    'cell_border_solid' => 'Solid',
-    'cell_border_dotted' => 'Dotted',
-    'cell_border_dashed' => 'Dashed',
-    'cell_border_double' => 'Double',
-    'cell_border_groove' => 'Groove',
-    'cell_border_ridge' => 'Ridge',
-    'cell_border_inset' => 'Inset',
-    'cell_border_outset' => 'Outset',
-    'cell_border_none' => 'None',
-    'cell_border_hidden' => 'Hidden',
+    'cell_border_solid' => '実線',
+    'cell_border_dotted' => '点線',
+    'cell_border_dashed' => '破線',
+    'cell_border_double' => '二重線',
+    'cell_border_groove' => '掘り',
+    'cell_border_ridge' => '盛り',
+    'cell_border_inset' => '陥没',
+    'cell_border_outset' => '隆起',
+    'cell_border_none' => 'なし',
+    'cell_border_hidden' => 'なし(優先)',
 
     // Images, links, details/summary & embed
     'source' => '画像のソース',
@@ -154,18 +154,18 @@ return [
     'toggle_label' => 'ブロックのラベル',
 
     // About view
-    'about' => 'About the editor',
+    'about' => 'エディタについて',
     'about_title' => 'WYSIWYGエディタについて',
     'editor_license' => 'エディタのライセンスと著作権',
     'editor_tiny_license' => 'このエディタはLGPL v2.1ライセンスの下で提供される:tinyLinkを利用して構築されています。',
     'editor_tiny_license_link' => 'TinyMCEの著作権およびライセンスの詳細は、こちらをご覧ください。',
     'save_continue' => 'ページを保存して続行',
     'callouts_cycle' => '(押し続けて種類を切り替え)',
-    'link_selector' => 'Link to content',
+    'link_selector' => 'コンテンツへのリンク',
     'shortcuts' => 'ショートカット',
     'shortcut' => 'ショートカット',
     'shortcuts_intro' => 'エディタでは次に示すショートカットが利用できます。',
     'windows_linux' => '(Windows/Linux)',
     'mac' => '(Mac)',
-    'description' => 'テンプレートの内容',
+    'description' => '説明',
 ];
index e5ba8c673061bcbcd7e8c911e4a25261bb94ab4b..3ef87f8a1bb4f8517eee0e20911600b345cfd3fb 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => '下書きを保存済み: ',
     'pages_edit_delete_draft' => '下書きを削除',
     'pages_edit_discard_draft' => '下書きを破棄',
+    'pages_edit_switch_to_markdown' => 'Markdownエディタに切り替え',
+    'pages_edit_switch_to_markdown_clean' => '(クリーンなコンテンツ)',
+    'pages_edit_switch_to_markdown_stable' => '(安定したコンテンツ)',
+    'pages_edit_switch_to_wysiwyg' => 'WYSIWYGエディタに切り替え',
     'pages_edit_set_changelog' => '編集内容についての説明',
     'pages_edit_enter_changelog_desc' => 'どのような変更を行ったのかを記録してください',
     'pages_edit_enter_changelog' => '編集内容を入力',
+    'pages_editor_switch_title' => 'エディタの切り替え',
+    'pages_editor_switch_are_you_sure' => 'このページのエディタを変更してもよろしいですか?',
+    'pages_editor_switch_consider_following' => 'エディタを変更する場合には次の点に注意してください',
+    'pages_editor_switch_consideration_a' => '保存すると、新しいエディタはそれ自身で種類を変更できない可能性のあるエディタを含め、今後のエディタとして利用されます。',
+    'pages_editor_switch_consideration_b' => 'これにより、特定の状況で詳細と構文が失われる可能性があります。',
+    'pages_editor_switch_consideration_c' => '最後の保存以降に行われたタグまたは変更ログの変更は、この変更では保持されません。',
     'pages_save' => 'ページを保存',
     'pages_title' => 'ページタイトル',
     'pages_name' => 'ページ名',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'リビジョン #:id',
     'pages_revisions_numbered_changes' => 'リビジョン #:id の変更',
+    'pages_revisions_editor' => 'エディタの種類',
     'pages_revisions_changelog' => '説明',
     'pages_revisions_changes' => '変更点',
     'pages_revisions_current' => '現在のバージョン',
index b256029a272b1c043b0c3dcf98f9774f499f8f52..75d6434072896ee5e6fa6153fe58f0f5dd37d5a0 100644 (file)
@@ -10,8 +10,8 @@ return [
     'settings' => '設定',
     'settings_save' => '設定を保存',
     'settings_save_success' => '設定を保存しました',
-    'system_version' => 'System Version',
-    'categories' => 'Categories',
+    'system_version' => 'システムバージョン',
+    'categories' => 'カテゴリー',
 
     // App Settings
     'app_customization' => 'カスタマイズ',
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => '画像アップロード時のセキュリティを強化',
     'app_secure_images_toggle' => 'より高いセキュリティの画像アップロードを可能にする',
     'app_secure_images_desc' => 'パフォーマンスの観点から、全ての画像が公開になっています。このオプションを有効にすると、画像URLの先頭にランダムで推測困難な文字列が追加され、アクセスを困難にします。',
-    'app_editor' => 'ページエディタ',
-    'app_editor_desc' => 'ここで選択されたエディタを全ユーザが使用します。',
+    'app_default_editor' => 'デフォルトのページエディタ',
+    'app_default_editor_desc' => '新しいページを編集するときにデフォルトで使用されるエディタを選択してください。これは権限が許可されているページレベルで上書きできます。',
     'app_custom_html' => 'カスタムheadタグ',
     'app_custom_html_desc' => 'スタイルシートやアナリティクスコード追加したい場合、ここを編集します。これは<head>の最下部に挿入されます。',
     'app_custom_html_disabled_notice' => '重大な変更を元に戻せるよう、この設定ページではカスタムのHTML headコンテンツが無効になっています。',
@@ -106,7 +106,7 @@ return [
     'recycle_bin_destroy_list' => '削除されるアイテム',
     'recycle_bin_restore_list' => '復元されるアイテム',
     'recycle_bin_restore_confirm' => 'この操作により、すべての子要素を含む削除されたアイテムが元の場所に復元されます。元の場所が削除されてごみ箱に入っている場合は、親アイテムも復元する必要があります。',
-    'recycle_bin_restore_deleted_parent' => 'The parent of this item has also been deleted. These will remain deleted until that parent is also restored.',
+    'recycle_bin_restore_deleted_parent' => 'このアイテムの親も削除されました。これらは、その親が復元されるまで削除されたままになります。',
     'recycle_bin_restore_parent' => '親を復元',
     'recycle_bin_destroy_notification' => 'ごみ箱から合計:count個のアイテムを削除しました。',
     'recycle_bin_restore_notification' => 'ごみ箱から合計:count個のアイテムを復元しました。',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'システムのAPIへのアクセス',
     'role_manage_settings' => 'アプリケーション設定の管理',
     'role_export_content' => 'コンテンツのエクスポート',
+    'role_editor_change' => 'ページエディタの変更',
     'role_asset' => 'アセット権限',
     'roles_system_warning' => '上記の3つの権限のいずれかを付与することは、ユーザーが自分の特権またはシステム内の他のユーザーの特権を変更できる可能性があることに注意してください。これらの権限は信頼できるユーザーにのみ割り当ててください。',
     'role_asset_desc' => '各アセットに対するデフォルトの権限を設定します。ここで設定した権限が優先されます。',
@@ -176,7 +177,7 @@ return [
     'users_role' => 'ユーザーの役割',
     'users_role_desc' => 'このユーザーに割り当てる役割を選択します。ユーザーが複数の役割に割り当てられている場合は、それらの役割の権限が重ね合わされ、割り当てられた役割のすべての権限が与えられます。',
     'users_password' => 'ユーザー パスワード',
-    'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 8 characters long.',
+    'users_password_desc' => 'アプリケーションへのログインに利用するパスワードを設定してください。8文字以上である必要があります。',
     'users_send_invite_text' => 'このユーザーに招待メールを送信してユーザー自身にパスワードを設定してもらうか、あなたがここでパスワードを設定するかを選択できます。',
     'users_send_invite_option' => 'ユーザーに招待メールを送信',
     'users_external_auth_id' => '外部認証ID',
index 8f649f19dc1cf1875c90ec92d64c1cc79c2b7270..7c80d20cac7ad52af04022ba3127aecc406bd7c4 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => '보관함: ',
     'pages_edit_delete_draft' => '초안 삭제',
     'pages_edit_discard_draft' => '폐기',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => '수정본 설명',
     'pages_edit_enter_changelog_desc' => '수정본 설명',
     'pages_edit_enter_changelog' => '설명',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => '저장',
     'pages_title' => '문서 제목',
     'pages_name' => '문서 이름',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => 'No.',
     'pages_revisions_numbered' => '수정본 :id',
     'pages_revisions_numbered_changes' => '수정본 :id에서 바꾼 부분',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => '설명',
     'pages_revisions_changes' => '바꾼 부분',
     'pages_revisions_current' => '현재 판본',
index cdc4a6e042c8a6898bca887757d6fab2523b628b..4af7aee2bbc150029f799f4429635fec6a2c5d30 100755 (executable)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => '이미지 주소 보호',
     'app_secure_images_toggle' => '이미지 주소 보호',
     'app_secure_images_desc' => '성능상의 문제로 이미지에 누구나 접근할 수 있기 때문에 이미지 주소를 무작위한 문자로 구성합니다. 폴더 색인을 끄세요.',
-    'app_editor' => '에디터',
-    'app_editor_desc' => '모든 사용자에게 적용합니다.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => '헤드 작성',
     'app_custom_html_desc' => '설정 페이지를 제외한 모든 페이지 head 태그 끝머리에 추가합니다.',
     'app_custom_html_disabled_notice' => '문제가 생겨도 설정 페이지에서 되돌릴 수 있어요.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => '시스템 접근 API',
     'role_manage_settings' => '사이트 설정 관리',
     'role_export_content' => '항목 내보내기',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => '권한 항목',
     'roles_system_warning' => '위 세 권한은 자신의 권한이나 다른 유저의 권한을 바꿀 수 있습니다.',
     'role_asset_desc' => '책, 챕터, 문서별 권한은 이 설정에 우선합니다.',
index c9c1c601543f889ddfc36fc7d2b683b20c9a8cab..c91b118305a881aa991c4a787f4d685a6c8694ce 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Juodraštis išsaugotas',
     'pages_edit_delete_draft' => 'Ištrinti juodraštį',
     'pages_edit_discard_draft' => 'Išmesti juodraštį',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Nustatyti keitimo žurnalą',
     'pages_edit_enter_changelog_desc' => 'Įveskite trumpus, jūsų atliktus, pokyčių aprašymus',
     'pages_edit_enter_changelog' => 'Įeiti į keitimo žurnalą',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Išsaugoti puslapį',
     'pages_title' => 'Puslapio antraštė',
     'pages_name' => 'Puslapio pavadinimas',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Peržiūra #:id',
     'pages_revisions_numbered_changes' => 'Peržiūros #:id pokyčiai',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Keitimo žurnalas',
     'pages_revisions_changes' => 'Pakeitimai',
     'pages_revisions_current' => 'Dabartinė versija',
index da2f60ebdd3d20dbb02c95ba66af3222f047b69e..9032dc38001348833baeb920b3cf63cf8b2ce221 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Didesnio saugumo vaizdų įkėlimai',
     'app_secure_images_toggle' => 'Įgalinti didesnio saugumo vaizdų įkėlimus',
     'app_secure_images_desc' => 'Dėl veiklos priežasčių, visi vaizdai yra vieši. Šis pasirinkimas prideda atsitiktinę, sunkiai atspėjamą eilutę prieš vaizdo URL. Įsitikinkite, kad katalogų rodyklės neįgalintos, kad prieiga būtų lengvesnė.',
-    'app_editor' => 'Puslapio redaktorius',
-    'app_editor_desc' => 'Pasirinkite, kuris redaktorius bus naudojamas visų vartotojų redaguoti puslapiams.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Pasirinktinis HTL antraštės turinys',
     'app_custom_html_desc' => 'Bet koks čia pridedamas turinys bus prisegamas apačioje <antraštės> kiekvieno puslapio skyriuje. Tai yra patogu svarbesniems stiliams arba pridedant analizės kodą.',
     'app_custom_html_disabled_notice' => 'Pasirinktinis HTML antraštės turinys yra išjungtas šiame nustatymų puslapyje užtikrinti, kad bet kokie negeri pokyčiai galėtų būti anuliuojami.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Gauti prieigą prie sistemos API',
     'role_manage_settings' => 'Tvarkyti programos nustatymus',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Nuosavybės leidimai',
     'roles_system_warning' => 'Būkite sąmoningi, kad prieiga prie bet kurio iš trijų leidimų viršuje gali leisti naudotojui pakeisti jų pačių privilegijas arba kitų privilegijas sistemoje. Paskirkite vaidmenis su šiais leidimais tik patikimiems naudotojams.',
     'role_asset_desc' => 'Šie leidimai kontroliuoja numatytą prieigą į nuosavybę, esančią sistemoje. Knygų, skyrių ir puslapių leidimai nepaisys šių leidimų.',
index 0ddb2b203747979053d038b7f713bf228f5e455b..975207bfd3165aaa44ef0c84472d541c1cb5cf53 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Melnraksts saglabāts ',
     'pages_edit_delete_draft' => 'Dzēst melnrakstu',
     'pages_edit_discard_draft' => 'Atmest malnrakstu',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Pievienot izmaiņu aprakstu',
     'pages_edit_enter_changelog_desc' => 'Ievadi nelielu aprakstu par vaiktajām izmaiņām',
     'pages_edit_enter_changelog' => 'Izmaiņu apraksts',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Saglabāt lapu',
     'pages_title' => 'Lapas virsraksts',
     'pages_name' => 'Lapas nosaukums',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revīzija #:id',
     'pages_revisions_numbered_changes' => 'Revīzijas #:id izmaiņas',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Izmaiņu žurnāls',
     'pages_revisions_changes' => 'Izmaiņas',
     'pages_revisions_current' => 'Pašreizējā versija',
index 3a60b0873c3601883e19c462a09f20b11be9e820..d946042629d74eca654ecd817fe744f855557f4a 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Paaugstinātas drošības attēlu ielāde',
     'app_secure_images_toggle' => 'Ieslēgt paaugstinātas drošības attēlu ielādi',
     'app_secure_images_desc' => 'Ātrdarbības nolūkos attēli ir publiski pieejami. Šī opcija pievieno nejaušu grūti uzminamu teksta virkni attēlu adresēs. Pārliecinieties kā ir izslēgta direktoriju pārlūkošana, lai nepieļautu vieglu piekļuvi šiem failiem.',
-    'app_editor' => 'Lapas redaktors',
-    'app_editor_desc' => 'Izvēlēties kurš redaktors tiks izmatots lapu rediģēšanai visiem lietotājiem.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Pielāgot HTML head saturu',
     'app_custom_html_desc' => 'Šis saturs tiks pievienots <head> sadaļas apakšā visām lapām. Tas ir noderīgi papildinot CSS stilus vai pievienojot analītikas kodu.',
     'app_custom_html_disabled_notice' => 'Pielāgots HTML head saturs ir izslēgts šajā uzstādījumu lapā, lai nodrošinātu, ka iespējams atcelt jebkādas kritiskas izmaiņas.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Piekļūt sistēmas API',
     'role_manage_settings' => 'Pārvaldīt iestatījumus',
     'role_export_content' => 'Eksportēt saturu',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Resursa piekļuves tiesības',
     'roles_system_warning' => 'Jebkuras no trīs augstāk redzamajām atļaujām dod iespēju lietotājam mainīt savas un citu lietotāju sistēmas atļaujas. Pievieno šīs grupu atļaujas tikai tiem lietotājiem, kuriem uzticies.',
     'role_asset_desc' => 'Šīs piekļuves tiesības kontrolē noklusēto piekļuvi sistēmas resursiem. Grāmatām, nodaļām un lapām norādītās tiesības būs pārākas par šīm.',
index d6759dd57c03ef7b486a417b279d339de55681b2..df833e87ad616a7a3411ac82746d7e8f08144517 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Ukast lagret under ',
     'pages_edit_delete_draft' => 'Forkast utkast',
     'pages_edit_discard_draft' => 'Gi opp utkast',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Angi endringslogg',
     'pages_edit_enter_changelog_desc' => 'Gi en kort beskrivelse av endringene dine',
     'pages_edit_enter_changelog' => 'Se endringslogg',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Lagre side',
     'pages_title' => 'Sidetittel',
     'pages_name' => 'Sidenavn',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revisjon #:id',
     'pages_revisions_numbered_changes' => 'Endringer på revisjon #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Endringslogg',
     'pages_revisions_changes' => 'Endringer',
     'pages_revisions_current' => 'Siste versjon',
index 58e6eaba9d54d1c3f90dbe711227116f525bc624..113ecef24559bfe23362f62ac4ce6d1763ee6c83 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Høyere sikkerhet på bildeopplastinger',
     'app_secure_images_toggle' => 'Enable høyere sikkerhet på bildeopplastinger',
     'app_secure_images_desc' => 'Av ytelsesgrunner er alle bilder offentlige. Dette alternativet legger til en tilfeldig streng som er vanskelig å gjette foran bildets nettadresser. Forsikre deg om at katalogindekser ikke er aktivert for å forhindre enkel tilgang.',
-    'app_editor' => 'Tekstbehandler',
-    'app_editor_desc' => 'Velg hvilken tekstbehandler som skal brukes av alle brukere til å redigere sider.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Tilpasset HTML-hodeinnhold',
     'app_custom_html_desc' => 'Alt innhold som legges til her, blir satt inn i bunnen av <head> -delen på hver side. Dette er praktisk for å overstyre stiler eller legge til analysekode.',
     'app_custom_html_disabled_notice' => 'Tilpasset HTML-hodeinnhold er deaktivert på denne innstillingssiden for å sikre at eventuelle endringer ødelegger noe, kan tilbakestilles.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Systemtilgang API',
     'role_manage_settings' => 'Behandle applikasjonsinnstillinger',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Eiendomstillatelser',
     'roles_system_warning' => 'Vær oppmerksom på at tilgang til noen av de ovennevnte tre tillatelsene kan tillate en bruker å endre sine egne rettigheter eller rettighetene til andre i systemet. Bare tildel roller med disse tillatelsene til pålitelige brukere.',
     'role_asset_desc' => 'Disse tillatelsene kontrollerer standard tilgang til eiendelene i systemet. Tillatelser til bøker, kapitler og sider overstyrer disse tillatelsene.',
index b9677a5074323127c7db2f3b4e7052b608795a88..e45194e65d3e361302ba3ea3ba009d7cdb4bfaf3 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Concept opgeslagen op ',
     'pages_edit_delete_draft' => 'Concept verwijderen',
     'pages_edit_discard_draft' => 'Concept verwijderen',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Wijzigingslogboek instellen',
     'pages_edit_enter_changelog_desc' => 'Geef een korte omschrijving van de wijzigingen die je gemaakt hebt',
     'pages_edit_enter_changelog' => 'Voeg toe aan wijzigingslogboek',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Pagina opslaan',
     'pages_title' => 'Pagina titel',
     'pages_name' => 'Pagina naam',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revisie #:id',
     'pages_revisions_numbered_changes' => 'Revisie #:id wijzigingen',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Wijzigingsoverzicht',
     'pages_revisions_changes' => 'Wijzigingen',
     'pages_revisions_current' => 'Huidige versie',
index 0326b290a4fc7a52836f44ac8ab0947e9870c0d0..870d32b1747c22fe626c773dae6e6cf204fc1ae4 100644 (file)
@@ -10,8 +10,8 @@ return [
     'settings' => 'Instellingen',
     'settings_save' => 'Instellingen opslaan',
     'settings_save_success' => 'Instellingen Opgeslagen',
-    'system_version' => 'System Version',
-    'categories' => 'Categories',
+    'system_version' => 'Systeem versie',
+    'categories' => 'Categorieën',
 
     // App Settings
     'app_customization' => 'Aanpassingen',
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Uploaden van afbeeldingen met hogere beveiliging',
     'app_secure_images_toggle' => 'Activeer uploaden van afbeeldingen met hogere beveiliging',
     'app_secure_images_desc' => 'Om prestatieredenen zijn alle afbeeldingen openbaar. Deze optie voegt een willekeurige en moeilijk te raden tekst toe aan de URL\'s van de afbeeldingen. Zorg ervoor dat "directory indexes" niet ingeschakeld zijn om eenvoudige toegang te voorkomen.',
-    'app_editor' => 'Pagina Bewerker',
-    'app_editor_desc' => 'Selecteer welke tekstverwerker door alle gebruikers zal worden gebruikt om pagina\'s te bewerken.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'HTML aan <head> toevoegen',
     'app_custom_html_desc' => 'Alle hieronder toegevoegde data wordt aan het einde van de <head> sectie van elke pagina toegevoegd. Gebruik dit om stijlen te overschrijven of analytische code toe te voegen.',
     'app_custom_html_disabled_notice' => 'Bovenstaande wordt niet toegevoegd aan deze pagina om ervoor te zorgen dat je foutieve code steeds ongedaan kan maken.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Ga naar systeem API',
     'role_manage_settings' => 'Beheer app instellingen',
     'role_export_content' => 'Exporteer inhoud',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Asset Machtigingen',
     'roles_system_warning' => 'Wees ervan bewust dat toegang tot een van de bovengenoemde drie machtigingen een gebruiker in staat kan stellen zijn eigen machtigingen of de machtigingen van anderen in het systeem kan wijzigen. Wijs alleen rollen toe met deze machtigingen aan vertrouwde gebruikers.',
     'role_asset_desc' => 'Deze machtigingen bepalen de standaard toegang tot de assets binnen het systeem. Machtigingen op boeken, hoofdstukken en pagina\'s overschrijven deze instelling.',
index b6c2e6e5c79a95d100d3bc627e85aa0066f44fc1..bb337d7c4030dfa1fddfbaa2a9ab62f43a243589 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Wersja robocza zapisana ',
     'pages_edit_delete_draft' => 'Usuń wersje roboczą',
     'pages_edit_discard_draft' => 'Porzuć wersje roboczą',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Ustaw dziennik zmian',
     'pages_edit_enter_changelog_desc' => 'Opisz zmiany, które zostały wprowadzone',
     'pages_edit_enter_changelog' => 'Wyświetl dziennik zmian',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Zapisz stronę',
     'pages_title' => 'Tytuł strony',
     'pages_name' => 'Nazwa strony',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Wersja #:id',
     'pages_revisions_numbered_changes' => 'Zmiany w wersji #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Dziennik zmian',
     'pages_revisions_changes' => 'Zmiany',
     'pages_revisions_current' => 'Obecna wersja',
index f4ef7005b9ddfabb38a27833916984b97d9d6391..b35981b0147c7207609ab1278266e67bfdb9c736 100644 (file)
@@ -10,8 +10,8 @@ return [
     'settings' => 'Ustawienia',
     'settings_save' => 'Zapisz ustawienia',
     'settings_save_success' => 'Ustawienia zapisane',
-    'system_version' => 'System Version',
-    'categories' => 'Categories',
+    'system_version' => 'Wersja Systemu',
+    'categories' => 'Kategorie',
 
     // App Settings
     'app_customization' => 'Dostosowywanie',
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Włączyć przesyłanie obrazów o wyższym poziomie bezpieczeństwa?',
     'app_secure_images_toggle' => 'Włącz wyższy poziom bezpieczeństwa dla obrazów',
     'app_secure_images_desc' => 'Ze względów wydajnościowych wszystkie obrazki są publiczne. Ta opcja dodaje dodatkowy, trudny do odgadnięcia losowy ciąg na początku nazwy obrazka. Upewnij się że indeksowanie katalogów jest zablokowane, aby uniemożliwić łatwy dostęp do obrazków.',
-    'app_editor' => 'Edytor strony',
-    'app_editor_desc' => 'Wybierz edytor używany przez użytkowników do edycji zawartości.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Własna zawartość w tagu <head>',
     'app_custom_html_desc' => 'Zawartość dodana tutaj zostanie dołączona na dole sekcji <head> każdej strony. Przydatne przy nadpisywaniu styli lub dodawaniu analityki.',
     'app_custom_html_disabled_notice' => 'Niestandardowa zawartość nagłówka HTML jest wyłączona na tej stronie ustawień aby zapewnić, że wszystkie błedne zmiany (braking change) mogą zostać cofnięte.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Dostęp do systemowego API',
     'role_manage_settings' => 'Zarządzanie ustawieniami aplikacji',
     'role_export_content' => 'Eksportuj zawartość',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Zarządzanie zasobami',
     'roles_system_warning' => 'Pamiętaj, że dostęp do trzech powyższych uprawnień może pozwolić użytkownikowi na zmianę własnych uprawnień lub uprawnień innych osób w systemie. Przypisz tylko role z tymi uprawnieniami do zaufanych użytkowników.',
     'role_asset_desc' => 'Te ustawienia kontrolują zarządzanie zasobami systemu. Uprawnienia książek, rozdziałów i stron nadpisują te ustawienia.',
index b85e39421cd0b66ffd062c5b42721eed1d64cdf6..733a3cadca8a897510492920410af8371328e595 100644 (file)
@@ -13,7 +13,7 @@ return [
     'page_delete'                 => 'página eliminada',
     'page_delete_notification'    => 'Página excluída com sucesso.',
     'page_restore'                => 'página restaurada',
-    'page_restore_notification'   => 'Imagem restaurada com sucesso',
+    'page_restore_notification'   => 'Página restaurada com sucesso',
     'page_move'                   => 'página movida',
 
     // Chapters
@@ -48,11 +48,11 @@ return [
     'favourite_remove_notification' => '":name" foi removido dos seus favoritos',
 
     // MFA
-    'mfa_setup_method_notification' => 'Método de múltiplos-fatores configurado com sucesso',
-    'mfa_remove_method_notification' => 'Método de múltiplos-fatores removido com sucesso',
+    'mfa_setup_method_notification' => 'Método de autenticação por múltiplos-fatores configurado com sucesso',
+    'mfa_remove_method_notification' => 'Método de autenticação por múltiplos-fatores removido com sucesso',
 
     // Webhooks
-    'webhook_create' => 'criar webhook',
+    'webhook_create' => 'webhook criado',
     'webhook_create_notification' => 'Webhook criado com sucesso',
     'webhook_update' => 'atualizar um webhook',
     'webhook_update_notification' => 'Webhook criado com sucesso',
index e64d3e9b97615b2f2405e71af8b9356bc39fde33..137f389b32b3bdaaffc08d2102ab7fe1772ccf3f 100644 (file)
@@ -19,7 +19,7 @@ return [
     'description' => 'Descrição',
     'role' => 'Cargo',
     'cover_image' => 'Imagem de capa',
-    'cover_image_description' => 'Esta imagem deve ser aproximadamente 440x250px.',
+    'cover_image_description' => 'Esta imagem deve ter aproximadamente 440x250px.',
 
     // Actions
     'actions' => 'Ações',
index ee2ccf11347df347858d1b34bb2df03fd4ca7704..e9bae6b56c676e43081c26eeb1dff328f5730e9c 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Rascunho guardado em ',
     'pages_edit_delete_draft' => 'Eliminar Rascunho',
     'pages_edit_discard_draft' => 'Descartar Rascunho',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Relatar Alterações',
     'pages_edit_enter_changelog_desc' => 'Digite uma breve descrição das alterações efetuadas por si',
     'pages_edit_enter_changelog' => 'Inserir Alterações',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Guardar Página',
     'pages_title' => 'Título da Página',
     'pages_name' => 'Nome da Página',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revisão #:id',
     'pages_revisions_numbered_changes' => 'Alterações da Revisão #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Relatório de Alterações',
     'pages_revisions_changes' => 'Alterações',
     'pages_revisions_current' => 'Versão Atual',
index 1f1f8c3bcc888de58248bb7d17c11dfa7f15c61e..c5ad184d990a78215d4c5ddf911d4e0882c1f4e8 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Carregamento de Imagens mais Seguro',
     'app_secure_images_toggle' => 'Ativar o carregamento de imagem mais seguro',
     'app_secure_images_desc' => 'Por razões de performance, todas as imagens são públicas. Esta opção adiciona uma string aleatória na frente das Urls de imagens. Certifique-se de que os diretórios não possam ser indexados para prevenir acesso indesejado.',
-    'app_editor' => 'Editor de Página',
-    'app_editor_desc' => 'Selecione qual editor será utilizado pelos utilizadores ao editar páginas.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Conteúdo personalizado para para o Head do HTML',
     'app_custom_html_desc' => 'Quaisquer conteúdos aqui adicionados serão inseridos no final da secção <head> de cada página. Esta é uma maneira útil de sobrescrever estilos e adicionar códigos de análise de site.',
     'app_custom_html_disabled_notice' => 'O conteúdo personalizado do <head> HTML está desativado nesta página de configurações, para garantir que quaisquer alterações que acabem maliciosas possam ser revertidas.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Aceder à API do sistema',
     'role_manage_settings' => 'Gerir as configurações da aplicação',
     'role_export_content' => 'Exportar conteúdo',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Permissões de Ativos',
     'roles_system_warning' => 'Esteja ciente de que o acesso a qualquer uma das três permissões acima pode permitir que um utilizador altere os seus próprios privilégios ou privilégios de outros no sistema. Apenas atribua cargos com essas permissões a utilizadores de confiança.',
     'role_asset_desc' => 'Estas permissões controlam o acesso padrão para os ativos dentro do sistema. Permissões em Livros, Capítulos e Páginas serão sobrescritas por estas permissões.',
index e28c97f9e4948af3e48d018469667ac892026bd6..18edf07824c4d5c393c95656f0f6da489aa17490 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Rascunho salvo em ',
     'pages_edit_delete_draft' => 'Excluir Rascunho',
     'pages_edit_discard_draft' => 'Descartar Rascunho',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Relatar Alterações',
     'pages_edit_enter_changelog_desc' => 'Digite uma breve descrição das alterações efetuadas por você',
     'pages_edit_enter_changelog' => 'Insira Alterações',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Salvar Página',
     'pages_title' => 'Título da Página',
     'pages_name' => 'Nome da Página',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revisão #:id',
     'pages_revisions_numbered_changes' => 'Alterações da Revisão #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Relatório de Alterações',
     'pages_revisions_changes' => 'Alterações',
     'pages_revisions_current' => 'Versão Atual',
index 1904902cbf217f207497fbc0f5293993cc41852b..51742541122d62226fa7f114ec32f0b03bcdcca5 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Upload de Imagens mais Seguro',
     'app_secure_images_toggle' => 'Habilitar uploads de imagem mais seguro',
     'app_secure_images_desc' => 'Por razões de performance, todas as imagens são públicas. Esta opção adiciona uma string randômica na frente das URLs de imagens. Certifique-se de que os diretórios não possam ser indexados para prevenir acesso indesejado.',
-    'app_editor' => 'Editor de Página',
-    'app_editor_desc' => 'Selecione qual editor será utilizado pelos usuários ao editar páginas.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Conteúdo customizado para <head> HTML',
     'app_custom_html_desc' => 'Quaisquer conteúdos aqui adicionados serão inseridos no final da seção <head> de cada página. Essa é uma maneira útil de sobrescrever estilos e adicionar códigos de análise de site.',
     'app_custom_html_disabled_notice' => 'O conteúdo customizado do <head> HTML está desabilitado nesta página de configurações, para garantir que quaisquer alterações danosas possam ser revertidas.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Acessar API do sistema',
     'role_manage_settings' => 'Gerenciar configurações da aplicação',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Permissões de Ativos',
     'roles_system_warning' => 'Esteja ciente de que o acesso a qualquer uma das três permissões acima pode permitir que um usuário altere seus próprios privilégios ou privilégios de outros usuários no sistema. Apenas atribua cargos com essas permissões para usuários confiáveis.',
     'role_asset_desc' => 'Essas permissões controlam o acesso padrão para os ativos dentro do sistema. Permissões em Livros, Capítulos e Páginas serão sobrescritas por essas permissões.',
index 6f8d9c755f510ca89579f6bb01e60ce118626c05..cda25b05f6a669163ea1c303e3ef542509a4cff6 100644 (file)
@@ -24,7 +24,7 @@ return [
     'width' => 'Ширина',
     'height' => 'Высота',
     'More' => 'Еще',
-    'select' => 'Select...',
+    'select' => 'Выбрать...',
 
     // Toolbar
     'formats' => 'Форматы',
@@ -95,8 +95,8 @@ return [
     'cell_type_cell' => 'Ячейка',
     'cell_scope' => 'Scope',
     'cell_type_header' => 'Заголовок ячейки',
-    'merge_cells' => 'Merge cells',
-    'split_cell' => 'Split cell',
+    'merge_cells' => 'Объединить ячейки',
+    'split_cell' => 'Разделить ячейку',
     'table_row_group' => 'Объединить строки',
     'table_column_group' => 'Объединить столбцы',
     'horizontal_align' => 'Выровнять по горизонтали',
@@ -124,16 +124,16 @@ return [
     'caption' => 'Подпись',
     'show_caption' => 'Показать подпись',
     'constrain' => 'Сохранять пропорции',
-    'cell_border_solid' => 'Solid',
-    'cell_border_dotted' => 'Dotted',
-    'cell_border_dashed' => 'Dashed',
-    'cell_border_double' => 'Double',
+    'cell_border_solid' => 'Сплошная',
+    'cell_border_dotted' => 'Точками',
+    'cell_border_dashed' => 'Пунктирная',
+    'cell_border_double' => 'Двойная сплошная',
     'cell_border_groove' => 'Groove',
     'cell_border_ridge' => 'Ridge',
     'cell_border_inset' => 'Inset',
     'cell_border_outset' => 'Outset',
-    'cell_border_none' => 'None',
-    'cell_border_hidden' => 'Hidden',
+    'cell_border_none' => 'Нет',
+    'cell_border_hidden' => 'Прозрачная',
 
     // Images, links, details/summary & embed
     'source' => 'Источник',
@@ -154,7 +154,7 @@ return [
     'toggle_label' => 'Метка',
 
     // About view
-    'about' => 'About the editor',
+    'about' => 'О редакторе',
     'about_title' => 'О редакторе WYSIWYG',
     'editor_license' => 'Лицензия редактора и авторские права',
     'editor_tiny_license' => 'Этот редактор собран с помощью :tinyLink, который предоставляется под лицензией LGPL v2.1.',
index 1d3e748bc40b6176cb75c115f8bb04aa30e2ffde..80a5e6b6169be02afdec87926a70a2c30d5a9884 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Черновик сохранён в ',
     'pages_edit_delete_draft' => 'Удалить черновик',
     'pages_edit_discard_draft' => 'Отменить черновик',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Задать список изменений',
     'pages_edit_enter_changelog_desc' => 'Введите краткое описание внесенных изменений',
     'pages_edit_enter_changelog' => 'Введите список изменений',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Сохранить страницу',
     'pages_title' => 'Заголовок страницы',
     'pages_name' => 'Название страницы',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Версия #:id',
     'pages_revisions_numbered_changes' => 'Изменения в версии #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Список изменений',
     'pages_revisions_changes' => 'Изменения',
     'pages_revisions_current' => 'Текущая версия',
index b23b7e97c0b8916d918d3d2ef5c08262f0c7c833..4503ee14e67a8fe7b032950dc340ad71c382071e 100755 (executable)
@@ -10,8 +10,8 @@ return [
     'settings' => 'Настройки',
     'settings_save' => 'Сохранить настройки',
     'settings_save_success' => 'Настройки сохранены',
-    'system_version' => 'System Version',
-    'categories' => 'Categories',
+    'system_version' => 'Версия системы',
+    'categories' => 'Категории',
 
     // App Settings
     'app_customization' => 'Настройки',
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Загрузка изображений с высоким уровнем безопасности',
     'app_secure_images_toggle' => 'Включить загрузку изображений с высоким уровнем безопасности',
     'app_secure_images_desc' => 'Для высокой производительности все изображения являются общедоступными. Этот параметр добавляет случайную строку перед URL изображения. Убедитесь, что индексация каталогов отключена, для предотвращения легкого доступа.',
-    'app_editor' => 'Редактор страниц',
-    'app_editor_desc' => 'Выберите, какой редактор будет использоваться всеми пользователями для редактирования страниц.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Пользовательский контент заголовка HTML',
     'app_custom_html_desc' => 'Любой контент, добавленный здесь, будет вставлен в нижнюю часть раздела <head> каждой страницы. Это удобно для переопределения стилей или добавления кода аналитики.',
     'app_custom_html_disabled_notice' => 'Пользовательский контент заголовка HTML отключен на этой странице, чтобы гарантировать отмену любых критических изменений.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Доступ к системному API',
     'role_manage_settings' => 'Управление настройками приложения',
     'role_export_content' => 'Экспорт контента',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Права доступа к материалам',
     'roles_system_warning' => 'Имейте в виду, что доступ к любому из указанных выше трех разрешений может позволить пользователю изменить свои собственные привилегии или привилегии других пользователей системы. Назначать роли с этими правами можно только доверенным пользователям.',
     'role_asset_desc' => 'Эти разрешения контролируют доступ по умолчанию к параметрам внутри системы. Разрешения на книги, главы и страницы перезапишут эти разрешения.',
index a0dec2b56986c0f36284653022ea8aae8bd2b8f3..88bd9a41f9761fc069a5d60c36df6d14244faec0 100644 (file)
@@ -32,7 +32,7 @@ return [
     'digits_between'       => ':attribute должен иметь от :min до :max цифр.',
     'email'                => ':attribute должен быть корректным email адресом.',
     'ends_with' => ':attribute должен заканчиваться одним из следующих: :values',
-    'file'                 => 'The :attribute must be provided as a valid file.',
+    'file'                 => ':attribute должен быть указан как допустимый файл.',
     'filled'               => ':attribute поле необходимо.',
     'gt'                   => [
         'numeric' => 'Значение :attribute должно быть больше чем :value.',
index 13e16249f027e715b0a813097e18e4def580cf66..4cb0a0ed341b90b08637fe77bf08804ab37a669b 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Koncept uložený pod ',
     'pages_edit_delete_draft' => 'Uložiť koncept',
     'pages_edit_discard_draft' => 'Zrušiť koncept',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Nastaviť záznam zmien',
     'pages_edit_enter_changelog_desc' => 'Zadajte krátky popis zmien, ktoré ste urobili',
     'pages_edit_enter_changelog' => 'Zadať záznam zmien',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Uložiť stránku',
     'pages_title' => 'Titulok stránky',
     'pages_name' => 'Názov stránky',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => 'č.',
     'pages_revisions_numbered' => 'Revízia č. :id',
     'pages_revisions_numbered_changes' => 'Zmeny revízie č. ',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Záznam zmien',
     'pages_revisions_changes' => 'Zmeny',
     'pages_revisions_current' => 'Aktuálna verzia',
index 14f1f98eafa41b89dd7e3b08ac2e41911112f0b2..6d9e3219128c27f21565a4ea01119141faf2f392 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Povoliť nahrávanie súborov so zvýšeným zabezpečením?',
     'app_secure_images_toggle' => 'Povoliť nahrávanie obrázkov s vyšším zabezpečením',
     'app_secure_images_desc' => 'Kvôli výkonu sú všetky obrázky verejné. Táto možnosť pridá pred URL obrázka náhodný, ťažko uhádnuteľný reťazec. Aby ste zabránili jednoduchému prístupu, uistite sa, že indexy priečinkov nie sú povolené.',
-    'app_editor' => 'Editor stránky',
-    'app_editor_desc' => 'Vyberte editor, ktorý bude používaný všetkými používateľmi na editáciu stránok.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Vlastný HTML obsah hlavičky',
     'app_custom_html_desc' => 'Všetok text pridaný sem bude vložený naspodok <head> sekcie na každej stránke. Môže sa to zísť pri zmene štýlu alebo pre pridanie analytického kódu.',
     'app_custom_html_disabled_notice' => 'Vlastný obsah hlavičky HTML je na tejto stránke s nastaveniami zakázaný, aby sa zabezpečilo, že sa dajú vrátiť zmeny, ktoré nastali.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'API prístupového systému',
     'role_manage_settings' => 'Spravovať nastavenia aplikácie',
     'role_export_content' => 'Exportovať obsah',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Oprávnenia majetku',
     'roles_system_warning' => 'Uvedomte si, že prístup ku ktorémukoľvek z vyššie uvedených troch povolení môže používateľovi umožniť zmeniť svoje vlastné privilégiá alebo privilégiá ostatných v systéme. Roly s týmito povoleniami priraďujte iba dôveryhodným používateľom.',
     'role_asset_desc' => 'Tieto oprávnenia regulujú prednastavený prístup k zdroju v systéme. Oprávnenia pre knihy, kapitoly a stránky majú vyššiu prioritu.',
index fc14cc6d7f7f5805f5810e70a1f18f1dcab64c15..c5fb5c35bb3517b44dcefb063e562e97748fbd76 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Osnutek shranjen ob ',
     'pages_edit_delete_draft' => 'Izbriši osnutek',
     'pages_edit_discard_draft' => 'Zavrzi osnutek',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Opiši spremembe na dokumentu',
     'pages_edit_enter_changelog_desc' => 'Vnesite kratek opis sprememb, ki ste jih naredili',
     'pages_edit_enter_changelog' => 'Vpišite vsebino sprememb',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Shrani stran',
     'pages_title' => 'Naslov strani',
     'pages_name' => 'Ime strani',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revizija št. :id',
     'pages_revisions_numbered_changes' => 'Revizija št. #:id Changes',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Dnevnik sprememb',
     'pages_revisions_changes' => 'Spremembe',
     'pages_revisions_current' => 'Trenutna različica',
index de91d7764083a2d56f5006041f0a7a2e045770b3..7849fe5fcc3aafe60987bd0ee1d432971b0e202c 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Nalaganje slik z večjo varnostjo',
     'app_secure_images_toggle' => 'Omogoči nalaganje slik z večjo varnostjo',
     'app_secure_images_desc' => 'Zaradi delovanja so vse slike javne. Ta možnost doda naključni, hard-to-guess niz pred Url-ji slike. Prepričajte se, da indeksi imenikov niso omogočeni, da preprečite enostaven dostop.',
-    'app_editor' => 'Urejevalnik strani',
-    'app_editor_desc' => 'Izberite urejevalnik, ki bodo uporabniki uporabljali za urejanje strani.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Po meri HTML vsebina glave',
     'app_custom_html_desc' => 'Katerakoli vsebina dodana tukaj, bo vstavljena na dno <head> dela vsake strani. To je uporabno za uporabo prevladujočih slogov ali dodajanje analitike.',
     'app_custom_html_disabled_notice' => 'Po meri narejena HTML glava vsebine je onemogočena na tej strani z nastavitvami, da se zagotovi, da bodo morebitne zrušitve lahko povrnjene.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'API za dostop do sistema',
     'role_manage_settings' => 'Nastavitve za upravljanje',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Sistemska dovoljenja',
     'roles_system_warning' => 'Zavedajte se, da lahko dostop do kateregakoli od zgornjih treh dovoljenj uporabniku omogoči, da spremeni lastne privilegije ali privilegije drugih v sistemu. Vloge s temi dovoljenji dodelite samo zaupanja vrednim uporabnikom.',
     'role_asset_desc' => 'Ta dovoljenja nadzorujejo privzeti dostop do sredstev v sistemu. Dovoljenja za knjige, poglavja in strani bodo razveljavila ta dovoljenja.',
index a982b9172977e69e837fbccb50bee9a5e77b644e..8cbaa10cca04e69b4bd007a3345840dc00140133 100644 (file)
@@ -73,7 +73,7 @@ return [
     'breadcrumb' => 'Brödsmula',
     'status' => 'Status',
     'status_active' => 'Active',
-    'status_inactive' => 'Inactive',
+    'status_inactive' => 'Inaktiv',
     'never' => 'Never',
     'none' => 'None',
 
index c41f7c98ba53eee58e65f89eccf75e6a13175d90..943cb53615d5a69fce2a7cffc3b47e9f87da0654 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Utkastet sparades ',
     'pages_edit_delete_draft' => 'Ta bort utkast',
     'pages_edit_discard_draft' => 'Ta bort utkastet',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Beskriv dina ändringar',
     'pages_edit_enter_changelog_desc' => 'Ange en kort beskrivning av de ändringar du har gjort',
     'pages_edit_enter_changelog' => 'Ändringslogg',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Spara sida',
     'pages_title' => 'Sidtitel',
     'pages_name' => 'Sidans namn',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revisions #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id ändringar',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Ändringslogg',
     'pages_revisions_changes' => 'Ändringar',
     'pages_revisions_current' => 'Nuvarande version',
index 0e770f6a0b4e60eb655c9868d7cbad8b9b29d26c..a1e167153fda5b90adb22e751b6a1f532465b134 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Aktivera högre säkerhet för bilduppladdningar?',
     'app_secure_images_toggle' => 'Aktivera säkrare bilduppladdningar',
     'app_secure_images_desc' => 'Av prestandaskäl är alla bilder publika. Det här alternativet lägger till en slumpmässig, svårgissad sträng framför alla bild-URL:er. Se till att kataloglistning inte är aktivt för att förhindra åtkomst.',
-    'app_editor' => 'Redigeringsverktyg',
-    'app_editor_desc' => 'Välj vilket redigeringsverktyg som ska användas av alla användare för att redigera sidor.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Egen HTML i <head>',
     'app_custom_html_desc' => 'Eventuellt innehåll i det här fältet placeras längst ner i <head>-sektionen på varje sida. Detta är användbart för att skriva över stilmaller eller lägga in spårningskoder.',
     'app_custom_html_disabled_notice' => 'Anpassat innehåll i HTML-huvud är inaktiverat på denna inställningssida för att säkerställa att eventuella ändringar som påverkar funktionaliteten kan återställas.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Åtkomst till systemets API',
     'role_manage_settings' => 'Hantera appinställningar',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Tillgång till innehåll',
     'roles_system_warning' => 'Var medveten om att åtkomst till någon av ovanstående tre behörigheter kan tillåta en användare att ändra sina egna rättigheter eller andras rättigheter i systemet. Tilldela endast roller med dessa behörigheter till betrodda användare.',
     'role_asset_desc' => 'Det här är standardinställningarna för allt innehåll i systemet. Eventuella anpassade rättigheter på böcker, kapitel och sidor skriver över dessa inställningar.',
index 68ccbc3780fe9d99dc7551b910e32ed0fbccce21..ee11a89bfbff0c369069e755aa78601ffa502074 100644 (file)
@@ -9,59 +9,59 @@ return [
     'page_create'                 => 'sayfa oluşturdu',
     'page_create_notification'    => 'Sayfa Başarıyla Oluşturuldu',
     'page_update'                 => 'sayfayı güncelledi',
-    'page_update_notification'    => 'Page successfully updated',
+    'page_update_notification'    => 'Sayfa başarıyla güncellendi',
     'page_delete'                 => 'sayfayı sildi',
-    'page_delete_notification'    => 'Page successfully deleted',
+    'page_delete_notification'    => 'Sayfa başarıyla silindi',
     'page_restore'                => 'sayfayı eski haline getirdi',
-    'page_restore_notification'   => 'Page successfully restored',
+    'page_restore_notification'   => 'Sayfa başarıyla kurtarıldı',
     'page_move'                   => 'sayfayı taşıdı',
 
     // Chapters
     'chapter_create'              => 'bölüm oluşturdu',
-    'chapter_create_notification' => 'Chapter successfully created',
+    'chapter_create_notification' => 'Bölüm başarıyla oluşturuldu',
     'chapter_update'              => 'bölümü güncelledi',
-    'chapter_update_notification' => 'Chapter successfully updated',
+    'chapter_update_notification' => 'Bölüm başarıyla güncellendi',
     'chapter_delete'              => 'bölümü sildi',
-    'chapter_delete_notification' => 'Chapter successfully deleted',
+    'chapter_delete_notification' => 'Bölüm başarıyla silindi',
     'chapter_move'                => 'bölümü taşıdı',
 
     // Books
     'book_create'                 => 'kitap oluşturdu',
-    'book_create_notification'    => 'Book successfully created',
+    'book_create_notification'    => 'Kitap başarıyla oluşturuldu',
     'book_update'                 => 'kitabı güncelledi',
-    'book_update_notification'    => 'Book successfully updated',
+    'book_update_notification'    => 'Kitap başarıyla güncellendi',
     'book_delete'                 => 'kitabı sildi',
-    'book_delete_notification'    => 'Book successfully deleted',
+    'book_delete_notification'    => 'Kitap başarıyla silindi',
     'book_sort'                   => 'kitabı sıraladı',
-    'book_sort_notification'      => 'Book successfully re-sorted',
+    'book_sort_notification'      => 'Kitap başarıyla yeniden sıralandı',
 
     // Bookshelves
-    'bookshelf_create'            => 'created bookshelf',
-    'bookshelf_create_notification'    => 'Bookshelf successfully created',
+    'bookshelf_create'            => 'kitaplık oluşturuldu',
+    'bookshelf_create_notification'    => 'Kitaplık başarıyla oluşturuldu',
     'bookshelf_update'                 => 'kitaplığı güncelledi',
-    'bookshelf_update_notification'    => 'Bookshelf successfully updated',
+    'bookshelf_update_notification'    => 'Kitaplık başarıyla güncellendi',
     'bookshelf_delete'                 => 'kitaplığı sildi',
-    'bookshelf_delete_notification'    => 'Bookshelf successfully deleted',
+    'bookshelf_delete_notification'    => 'Kitaplık başarıyla silindi',
 
     // Favourites
     'favourite_add_notification' => '":name" favorilerinize eklendi',
     'favourite_remove_notification' => '":name" favorilerinizden çıkarıldı',
 
     // MFA
-    'mfa_setup_method_notification' => 'Multi-factor method successfully configured',
-    'mfa_remove_method_notification' => 'Multi-factor method successfully removed',
+    'mfa_setup_method_notification' => 'Çok aşamalı kimlik doğrulama yöntemi başarıyla yapılandırıldı',
+    'mfa_remove_method_notification' => 'Çok aşamalı kimlik doğrulama yöntemi başarıyla kaldırıldı',
 
     // Webhooks
-    'webhook_create' => 'created webhook',
-    'webhook_create_notification' => 'Webhook successfully created',
-    'webhook_update' => 'updated webhook',
-    'webhook_update_notification' => 'Webhook successfully updated',
-    'webhook_delete' => 'deleted webhook',
-    'webhook_delete_notification' => 'Webhook successfully deleted',
+    'webhook_create' => 'web kancası oluşturuldu',
+    'webhook_create_notification' => 'Web kancası başarıyla oluşturuldu',
+    'webhook_update' => 'web kancası güncellendi',
+    'webhook_update_notification' => 'Web kancası başarıyla güncellendi',
+    'webhook_delete' => 'web kancası silindi',
+    'webhook_delete_notification' => 'Web kancası başarıyla silindi',
 
     // Users
-    'user_update_notification' => 'User successfully updated',
-    'user_delete_notification' => 'User successfully removed',
+    'user_update_notification' => 'Kullanıcı başarıyla güncellendi',
+    'user_delete_notification' => 'Kullanıcı başarıyla silindi',
 
     // Other
     'commented_on'                => 'yorum yaptı',
index 8a5d25a2aa33315a29300f99f007df50f80910e7..591e7e3cff1050410c3a8241097aa43500789841 100644 (file)
@@ -21,7 +21,7 @@ return [
     'email' => 'E-posta',
     'password' => 'Şifre',
     'password_confirm' => 'Şifreyi Onaylayın',
-    'password_hint' => 'Must be at least 8 characters',
+    'password_hint' => 'En az 8 karakter olmalı',
     'forgot_password' => 'Şifrenizi mi unuttunuz?',
     'remember_me' => 'Beni Hatırla',
     'ldap_email_hint' => 'Bu hesap için kullanmak istediğiniz e-posta adresini giriniz.',
@@ -54,7 +54,7 @@ return [
     'email_confirm_text' => 'Lütfen aşağıdaki butona tıklayarak e-posta adresinizi doğrulayın:',
     'email_confirm_action' => 'E-posta Adresini Doğrula',
     'email_confirm_send_error' => 'E-posta adresinin doğrulanması gerekiyor fakat sistem, doğrulama bağlantısını göndermeyi başaramadı. E-posta adresinin doğru bir şekilde ayarlığından emin olmak için yöneticiyle iletişime geçin.',
-    'email_confirm_success' => 'Your email has been confirmed! You should now be able to login using this email address.',
+    'email_confirm_success' => 'Email hesabınız onaylandı. Email adresinizi kullanarak giriş yapabilirsiniz.',
     'email_confirm_resent' => 'Doğrulama e-postası tekrar gönderildi, lütfen gelen kutunuzu kontrol ediniz.',
 
     'email_not_confirmed' => 'E-posta Adresi Doğrulanmadı',
@@ -71,40 +71,40 @@ return [
     'user_invite_page_welcome' => ':appName uygulamasına hoş geldiniz!',
     'user_invite_page_text' => 'Hesap kurulumunuzu tamamlamak ve gelecekteki :appName ziyaretlerinizde hesabınıza erişim sağlayabilmeniz için bir şifre belirlemeniz gerekiyor.',
     'user_invite_page_confirm_button' => 'Şifreyi Onayla',
-    'user_invite_success_login' => 'Password set, you should now be able to login using your set password to access :appName!',
+    'user_invite_success_login' => 'Şifre belirlendi, :appName! uygulamasına giriş yapmak için belirlediğiniz şifreyi kullanabilirsiniz',
 
     // Multi-factor Authentication
-    'mfa_setup' => 'Setup Multi-Factor Authentication',
-    'mfa_setup_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
+    'mfa_setup' => 'Çok Aşamalı Kimlik Doğrulama',
+    'mfa_setup_desc' => 'Hesabınıza ekstra bir güvenlik katmanı daha eklemek için çok aşamalı kimlik doğrulamayı kurunuz.',
     'mfa_setup_configured' => 'Zaten yapılandırıldı',
     'mfa_setup_reconfigure' => 'Yeniden yapılandır',
     'mfa_setup_remove_confirmation' => '2 adımlı doğrulamayı kaldırmak istediğinize emin misiniz?',
-    'mfa_setup_action' => 'Setup',
-    'mfa_backup_codes_usage_limit_warning' => 'You have less than 5 backup codes remaining, Please generate and store a new set before you run out of codes to prevent being locked out of your account.',
+    'mfa_setup_action' => 'Ayarlar',
+    'mfa_backup_codes_usage_limit_warning' => 'Kalan yedekleme kodu sayınız 5\'ten az, hesabınızın kilitlenip kullanım dışı kalmaması için lütfen kodlarınız bitmeden yeni kod üretip saklayınız.',
     'mfa_option_totp_title' => 'Mobil Uygulama',
-    'mfa_option_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
-    'mfa_option_backup_codes_title' => 'Backup Codes',
+    'mfa_option_totp_desc' => 'Çok aşamalı kimlik doğrulamayı kullanabilmek için Google Authenticator, Authy veya Microsoft Authenticator gibi TOTP destekleyen bir mobil uygulamaya ihtiyacınız olacaktır.',
+    'mfa_option_backup_codes_title' => 'Yedekleme Kodları',
     'mfa_option_backup_codes_desc' => 'Securely store a set of one-time-use backup codes which you can enter to verify your identity.',
-    'mfa_gen_confirm_and_enable' => 'Confirm and Enable',
-    'mfa_gen_backup_codes_title' => 'Backup Codes Setup',
+    'mfa_gen_confirm_and_enable' => 'Onayla ve aktive et',
+    'mfa_gen_backup_codes_title' => 'Yedekleme Kodları Kurulumu',
     'mfa_gen_backup_codes_desc' => 'Store the below list of codes in a safe place. When accessing the system you\'ll be able to use one of the codes as a second authentication mechanism.',
-    'mfa_gen_backup_codes_download' => 'Download Codes',
-    'mfa_gen_backup_codes_usage_warning' => 'Each code can only be used once',
-    'mfa_gen_totp_title' => 'Mobile App Setup',
+    'mfa_gen_backup_codes_download' => 'İndirme Kodları',
+    'mfa_gen_backup_codes_usage_warning' => 'Her kod tek seferlik kullanılabilir',
+    'mfa_gen_totp_title' => 'Mobil Uygulama Kurulumu',
     'mfa_gen_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
     'mfa_gen_totp_scan' => 'Scan the QR code below using your preferred authentication app to get started.',
-    'mfa_gen_totp_verify_setup' => 'Verify Setup',
-    'mfa_gen_totp_verify_setup_desc' => 'Verify that all is working by entering a code, generated within your authentication app, in the input box below:',
-    'mfa_gen_totp_provide_code_here' => 'Provide your app generated code here',
-    'mfa_verify_access' => 'Verify Access',
-    'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.',
-    'mfa_verify_no_methods' => 'No Methods Configured',
-    'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.',
-    'mfa_verify_use_totp' => 'Verify using a mobile app',
-    'mfa_verify_use_backup_codes' => 'Verify using a backup code',
-    'mfa_verify_backup_code' => 'Backup Code',
-    'mfa_verify_backup_code_desc' => 'Enter one of your remaining backup codes below:',
-    'mfa_verify_backup_code_enter_here' => 'Enter backup code here',
-    'mfa_verify_totp_desc' => 'Enter the code, generated using your mobile app, below:',
+    'mfa_gen_totp_verify_setup' => 'Kurulumu Doğrula',
+    'mfa_gen_totp_verify_setup_desc' => 'Aşağıdaki kutuya kimlik doğrulama uygulamanızda üretilmiş olan kodu girerek hepsini doğrulayabilirsiniz:',
+    'mfa_gen_totp_provide_code_here' => 'Uygulamada üretilen kodunuzu buraya giriniz',
+    'mfa_verify_access' => 'Girişi Doğrula',
+    'mfa_verify_access_desc' => 'Giriş yapmadan önce ek güvenlik doğrulaması amacıyla kimliğinizin doğrulanması gerekmektedir. Aşağıda belirtilen yöntemlerden birini kullanarak devam ediniz.',
+    'mfa_verify_no_methods' => 'Hiçbir Yöntem Ayarlanmadı',
+    'mfa_verify_no_methods_desc' => 'Hesabınızda çok aşamalı kimlik doğrulama yöntemi bulunamadı. Giriş yapabilmek için en az bir tane yöntemi ayarlamanız gerekmektedir.',
+    'mfa_verify_use_totp' => 'Mobil uygulama kullanarak doğrula',
+    'mfa_verify_use_backup_codes' => 'Yedekleme kodu kullanarak doğrula',
+    'mfa_verify_backup_code' => 'Yedekleme Kodu',
+    'mfa_verify_backup_code_desc' => 'Kalan yedekleme kodlarınızdan birini giriniz:',
+    'mfa_verify_backup_code_enter_here' => 'Yedekleme kodunuzu buraya giriniz',
+    'mfa_verify_totp_desc' => 'Mobil uygulamada üretilmiş kodu aşağıya giriniz:',
     'mfa_setup_login_notification' => '2 adımlı doğrulama ayarlandı, Lütfen 2 adımlı doğrulama kullanarak yeniden giriş yapınız.',
 ];
index 7ecf247e126d218f9915a06197cc9e675efb5f80..40b8591b3c03df45694a953dc10f208887cd2cf7 100644 (file)
@@ -39,14 +39,14 @@ return [
     'reset' => 'Sıfırla',
     'remove' => 'Kaldır',
     'add' => 'Ekle',
-    'configure' => 'Configure',
+    'configure' => 'Yapılandır',
     'fullscreen' => 'Tam Ekran',
-    'favourite' => 'Favourite',
-    'unfavourite' => 'Unfavourite',
-    'next' => 'Next',
-    'previous' => 'Previous',
-    'filter_active' => 'Active Filter:',
-    'filter_clear' => 'Clear Filter',
+    'favourite' => 'Favoriye ekle',
+    'unfavourite' => 'Favorilerden çıkar',
+    'next' => 'Sonraki',
+    'previous' => 'Önceki',
+    'filter_active' => 'Aktif filtre:',
+    'filter_clear' => 'Filtreyi Kaldır',
 
     // Sort Options
     'sort_options' => 'Sıralama Seçenekleri',
@@ -54,7 +54,7 @@ return [
     'sort_ascending' => 'Artan Sıralama',
     'sort_descending' => 'Azalan Sıralama',
     'sort_name' => 'İsim',
-    'sort_default' => 'Default',
+    'sort_default' => 'Varsayılan',
     'sort_created_at' => 'Oluşturulma Tarihi',
     'sort_updated_at' => 'Güncelleme Tarihi',
 
@@ -63,7 +63,7 @@ return [
     'no_activity' => 'Gösterilecek eylem bulunamadı',
     'no_items' => 'Herhangi bir öge bulunamadı',
     'back_to_top' => 'Başa dön',
-    'skip_to_main_content' => 'Skip to main content',
+    'skip_to_main_content' => 'Ana içeriğe geç',
     'toggle_details' => 'Detayları Göster/Gizle',
     'toggle_thumbnails' => 'Ön İzleme Görsellerini Göster/Gizle',
     'details' => 'Detaylar',
@@ -71,14 +71,14 @@ return [
     'list_view' => 'Liste Görünümü',
     'default' => 'Varsayılan',
     'breadcrumb' => 'Gezinti Menüsü',
-    'status' => 'Status',
-    'status_active' => 'Active',
-    'status_inactive' => 'Inactive',
-    'never' => 'Never',
-    'none' => 'None',
+    'status' => 'Durum',
+    'status_active' => 'Etkin',
+    'status_inactive' => 'Devre dışı',
+    'never' => 'Hiçbir zaman',
+    'none' => 'Hiçbiri',
 
     // Header
-    'header_menu_expand' => 'Expand Header Menu',
+    'header_menu_expand' => 'Başlık Menüsünü Genişlet',
     'profile_menu' => 'Profil Menüsü',
     'view_profile' => 'Profili Görüntüle',
     'edit_profile' => 'Profili Düzenle',
@@ -97,6 +97,6 @@ return [
 
     // Footer Link Options
     // Not directly used but available for convenience to users.
-    'privacy_policy' => 'Privacy Policy',
-    'terms_of_service' => 'Terms of Service',
+    'privacy_policy' => 'Gizlilik Politikası',
+    'terms_of_service' => 'Hizmet Şartları',
 ];
index 82712029210ebeec005dbf5530d8ad4c0918c042..1296d0353295b861b642e76d51bf17bdcca3bf37 100644 (file)
  */
 return [
     // General editor terms
-    'general' => 'General',
-    'advanced' => 'Advanced',
-    'none' => 'None',
-    'cancel' => 'Cancel',
-    'save' => 'Save',
-    'close' => 'Close',
-    'undo' => 'Undo',
-    'redo' => 'Redo',
-    'left' => 'Left',
-    'center' => 'Center',
-    'right' => 'Right',
-    'top' => 'Top',
-    'middle' => 'Middle',
-    'bottom' => 'Bottom',
-    'width' => 'Width',
-    'height' => 'Height',
-    'More' => 'More',
-    'select' => 'Select...',
+    'general' => 'Genel',
+    'advanced' => 'Gelişmiş seçenekler',
+    'none' => 'Hiçbiri',
+    'cancel' => 'İptal',
+    'save' => 'Kaydet',
+    'close' => 'Kapat',
+    'undo' => 'Geri al',
+    'redo' => 'Yeniden yap',
+    'left' => 'Sol',
+    'center' => 'Merkez',
+    'right' => 'Sağ',
+    'top' => 'Üst',
+    'middle' => 'Orta',
+    'bottom' => 'Alt',
+    'width' => 'Genişlik',
+    'height' => 'Yükseklik',
+    'More' => 'Daha fazla',
+    'select' => 'Seç...',
 
     // Toolbar
-    'formats' => 'Formats',
-    'header_large' => 'Large Header',
-    'header_medium' => 'Medium Header',
-    'header_small' => 'Small Header',
-    'header_tiny' => 'Tiny Header',
-    'paragraph' => 'Paragraph',
-    'blockquote' => 'Blockquote',
-    'inline_code' => 'Inline code',
-    'callouts' => 'Callouts',
-    'callout_information' => 'Information',
-    'callout_success' => 'Success',
-    'callout_warning' => 'Warning',
-    'callout_danger' => 'Danger',
-    'bold' => 'Bold',
-    'italic' => 'Italic',
-    'underline' => 'Underline',
-    'strikethrough' => 'Strikethrough',
-    'superscript' => 'Superscript',
-    'subscript' => 'Subscript',
-    'text_color' => 'Text color',
-    'custom_color' => 'Custom color',
-    'remove_color' => 'Remove color',
-    'background_color' => 'Background color',
-    'align_left' => 'Align left',
-    'align_center' => 'Align center',
-    'align_right' => 'Align right',
-    'align_justify' => 'Justify',
-    'list_bullet' => 'Bullet list',
-    'list_numbered' => 'Numbered list',
-    'list_task' => 'Task list',
-    'indent_increase' => 'Increase indent',
-    'indent_decrease' => 'Decrease indent',
-    'table' => 'Table',
-    'insert_image' => 'Insert image',
-    'insert_image_title' => 'Insert/Edit Image',
-    'insert_link' => 'Insert/edit link',
-    'insert_link_title' => 'Insert/Edit Link',
-    'insert_horizontal_line' => 'Insert horizontal line',
-    'insert_code_block' => 'Insert code block',
-    'insert_drawing' => 'Insert/edit drawing',
-    'drawing_manager' => 'Drawing manager',
-    'insert_media' => 'Insert/edit media',
-    'insert_media_title' => 'Insert/Edit Media',
-    'clear_formatting' => 'Clear formatting',
-    'source_code' => 'Source code',
-    'source_code_title' => 'Source Code',
-    'fullscreen' => 'Fullscreen',
-    'image_options' => 'Image options',
+    'formats' => 'Formatlar',
+    'header_large' => 'Büyük başlık',
+    'header_medium' => 'Normal Başlık',
+    'header_small' => 'Küçük Başlık',
+    'header_tiny' => 'Minik Başlık',
+    'paragraph' => 'Paragraf',
+    'blockquote' => 'Blok alıntı',
+    'inline_code' => 'Satır içi kod',
+    'callouts' => 'Belirtme çizgileri',
+    'callout_information' => 'Bilgi',
+    'callout_success' => 'Başarılı',
+    'callout_warning' => 'Uyarı',
+    'callout_danger' => 'Tehlike',
+    'bold' => 'Kalın',
+    'italic' => 'İtalik',
+    'underline' => 'Altı çizili',
+    'strikethrough' => 'Üstü çizili',
+    'superscript' => 'Üst simge',
+    'subscript' => 'Alt simge',
+    'text_color' => 'Metin rengi',
+    'custom_color' => 'Özel renk',
+    'remove_color' => 'Rengi kaldır',
+    'background_color' => 'Arka plan rengi',
+    'align_left' => 'Sola hizala',
+    'align_center' => 'Merkeze hizala',
+    'align_right' => 'Sağa hizala',
+    'align_justify' => 'İki yana yasla',
+    'list_bullet' => 'Noktalı liste',
+    'list_numbered' => 'Numaralı liste',
+    'list_task' => 'Görev listesi',
+    'indent_increase' => 'Girintiyi artır',
+    'indent_decrease' => 'Girintiyi azalt',
+    'table' => 'Tablo',
+    'insert_image' => 'Resim ekle',
+    'insert_image_title' => 'Resim Ekle/Düzenle',
+    'insert_link' => 'Bağlantı ekle/düzenle',
+    'insert_link_title' => 'Bağlantı Ekle/Düzenle',
+    'insert_horizontal_line' => 'Yatay çizgi ekle',
+    'insert_code_block' => 'Kod bloğu ekle',
+    'insert_drawing' => 'Çizim ekle/düzenle',
+    'drawing_manager' => 'Çizim yöneticisi',
+    'insert_media' => 'Medya ekle/düzenle',
+    'insert_media_title' => 'Medya Ekle/Düzenle',
+    'clear_formatting' => 'Biçimlendirmeyi temizle',
+    'source_code' => 'Kaynak kodu',
+    'source_code_title' => 'Kaynak Kodu',
+    'fullscreen' => 'Tam ekran',
+    'image_options' => 'Resim seçenekleri',
 
     // Tables
-    'table_properties' => 'Table properties',
-    'table_properties_title' => 'Table Properties',
-    'delete_table' => 'Delete table',
-    'insert_row_before' => 'Insert row before',
-    'insert_row_after' => 'Insert row after',
-    'delete_row' => 'Delete row',
-    'insert_column_before' => 'Insert column before',
-    'insert_column_after' => 'Insert column after',
-    'delete_column' => 'Delete column',
-    'table_cell' => 'Cell',
-    'table_row' => 'Row',
-    'table_column' => 'Column',
-    'cell_properties' => 'Cell properties',
-    'cell_properties_title' => 'Cell Properties',
-    'cell_type' => 'Cell type',
-    'cell_type_cell' => 'Cell',
-    'cell_scope' => 'Scope',
-    'cell_type_header' => 'Header cell',
-    'merge_cells' => 'Merge cells',
-    'split_cell' => 'Split cell',
-    'table_row_group' => 'Row Group',
-    'table_column_group' => 'Column Group',
-    'horizontal_align' => 'Horizontal align',
-    'vertical_align' => 'Vertical align',
-    'border_width' => 'Border width',
-    'border_style' => 'Border style',
-    'border_color' => 'Border color',
-    'row_properties' => 'Row properties',
-    'row_properties_title' => 'Row Properties',
-    'cut_row' => 'Cut row',
-    'copy_row' => 'Copy row',
-    'paste_row_before' => 'Paste row before',
-    'paste_row_after' => 'Paste row after',
-    'row_type' => 'Row type',
-    'row_type_header' => 'Header',
-    'row_type_body' => 'Body',
-    'row_type_footer' => 'Footer',
-    'alignment' => 'Alignment',
-    'cut_column' => 'Cut column',
-    'copy_column' => 'Copy column',
-    'paste_column_before' => 'Paste column before',
-    'paste_column_after' => 'Paste column after',
-    'cell_padding' => 'Cell padding',
-    'cell_spacing' => 'Cell spacing',
-    'caption' => 'Caption',
-    'show_caption' => 'Show caption',
-    'constrain' => 'Constrain proportions',
-    'cell_border_solid' => 'Solid',
-    'cell_border_dotted' => 'Dotted',
-    'cell_border_dashed' => 'Dashed',
-    'cell_border_double' => 'Double',
+    'table_properties' => 'Tablo özellikleri',
+    'table_properties_title' => 'Tablo Özellikleri',
+    'delete_table' => 'Tabloyu sil',
+    'insert_row_before' => 'Üste satır ekle',
+    'insert_row_after' => 'Alta satır ekle',
+    'delete_row' => 'Satırı sil',
+    'insert_column_before' => 'Sola sütun ekle',
+    'insert_column_after' => 'Sağa sütun ekle',
+    'delete_column' => 'Sütunu sil',
+    'table_cell' => 'Hücre',
+    'table_row' => 'Satır',
+    'table_column' => 'Sütun',
+    'cell_properties' => 'Hücre özellikleri',
+    'cell_properties_title' => 'Hücre Özellikleri',
+    'cell_type' => 'Hücre tipi',
+    'cell_type_cell' => 'Hücre',
+    'cell_scope' => 'Kapsam',
+    'cell_type_header' => 'Başlık hücresi',
+    'merge_cells' => 'Hücreleri birleştir',
+    'split_cell' => 'Hücreyi böl',
+    'table_row_group' => 'Satır Grubu',
+    'table_column_group' => 'Sütun Grubu',
+    'horizontal_align' => 'Yatay hizalama',
+    'vertical_align' => 'Dikey hizalama',
+    'border_width' => 'Kenarlık genişliği',
+    'border_style' => 'Kenarlık stili',
+    'border_color' => 'Kenarlık rengi',
+    'row_properties' => 'Satır özellikleri',
+    'row_properties_title' => 'Satır Özellikleri',
+    'cut_row' => 'Satırı kes',
+    'copy_row' => 'Satırı kopyala',
+    'paste_row_before' => 'Üste satırı yapıştır',
+    'paste_row_after' => 'Alta satırı yapıştır',
+    'row_type' => 'Satır tipi',
+    'row_type_header' => 'Üstbaşlık',
+    'row_type_body' => 'Gövde',
+    'row_type_footer' => 'Altbilgi',
+    'alignment' => 'Hizalama',
+    'cut_column' => 'Sütünu kes',
+    'copy_column' => 'Sütunu kopyala',
+    'paste_column_before' => 'Sütünu sola yapıştır',
+    'paste_column_after' => 'Sütunu sağa yapıştır',
+    'cell_padding' => 'Hücre boşluğu',
+    'cell_spacing' => 'Hücre aralığı',
+    'caption' => 'Başlık',
+    'show_caption' => 'Açıklamayı göster',
+    'constrain' => 'Oranları sınırla',
+    'cell_border_solid' => 'Düz',
+    'cell_border_dotted' => 'Noktalı',
+    'cell_border_dashed' => 'Kesik çizgili',
+    'cell_border_double' => 'Çift',
     'cell_border_groove' => 'Groove',
     'cell_border_ridge' => 'Ridge',
     'cell_border_inset' => 'Inset',
     'cell_border_outset' => 'Outset',
-    'cell_border_none' => 'None',
-    'cell_border_hidden' => 'Hidden',
+    'cell_border_none' => 'Hiçbiri',
+    'cell_border_hidden' => 'Gizli',
 
     // Images, links, details/summary & embed
-    'source' => 'Source',
-    'alt_desc' => 'Alternative description',
-    'embed' => 'Embed',
-    'paste_embed' => 'Paste your embed code below:',
+    'source' => 'Kaynak',
+    'alt_desc' => 'Alternatif açıklama',
+    'embed' => 'Yerleştir',
+    'paste_embed' => 'Gömme kodunuzu aşağı yapıştırın:',
     'url' => 'URL',
-    'text_to_display' => 'Text to display',
-    'title' => 'Title',
-    'open_link' => 'Open link in...',
-    'open_link_current' => 'Current window',
-    'open_link_new' => 'New window',
+    'text_to_display' => 'Görüntülenecek metin',
+    'title' => 'Başlık',
+    'open_link' => 'Bağlantıyı şurada aç...',
+    'open_link_current' => 'Geçerli pencere',
+    'open_link_new' => 'Yeni pencere',
     'insert_collapsible' => 'Insert collapsible block',
     'collapsible_unwrap' => 'Unwrap',
-    'edit_label' => 'Edit label',
+    'edit_label' => 'Etiketi düzenle',
     'toggle_open_closed' => 'Toggle open/closed',
     'collapsible_edit' => 'Edit collapsible block',
-    'toggle_label' => 'Toggle label',
+    'toggle_label' => 'Etiketleri aç/kapa',
 
     // About view
-    'about' => 'About the editor',
-    'about_title' => 'About the WYSIWYG Editor',
-    'editor_license' => 'Editor License & Copyright',
-    'editor_tiny_license' => 'This editor is built using :tinyLink which is provided under an LGPL v2.1 license.',
-    'editor_tiny_license_link' => 'The copyright and license details of TinyMCE can be found here.',
-    'save_continue' => 'Save Page & Continue',
-    'callouts_cycle' => '(Keep pressing to toggle through types)',
-    'link_selector' => 'Link to content',
-    'shortcuts' => 'Shortcuts',
-    'shortcut' => 'Shortcut',
-    'shortcuts_intro' => 'The following shortcuts are available in the editor:',
+    'about' => 'Editör hakkında',
+    'about_title' => 'WYSIWYG editor hakkında',
+    'editor_license' => 'Editor Lisans ve Telif Hakkı',
+    'editor_tiny_license' => 'Bu metin düzenleyici LGPL v2.1 lisansı altında :tinyLink kullanılarak yapılmıştır.',
+    'editor_tiny_license_link' => 'TinyMCE telif ve lisans bilgilerini burada bulabilirsiniz.',
+    'save_continue' => 'Kaydet & Devam Et',
+    'callouts_cycle' => '(Türler arasında geçiş için basmaya devam ediniz)',
+    'link_selector' => 'İçeriğe bağlantı',
+    'shortcuts' => 'Kısayollar',
+    'shortcut' => 'Kısayol',
+    'shortcuts_intro' => 'Aşağıdaki kısayollar editörde kullanılabilir:',
     'windows_linux' => '(Windows/Linux)',
     'mac' => '(Mac)',
-    'description' => 'Description',
+    'description' => 'Açıklama',
 ];
index 738f885196c059c42f23814401d9d480d4760033..f66a32f3d0121d6f54c67a2e2b43926068e820a7 100644 (file)
@@ -27,8 +27,8 @@ return [
     'images' => 'Görseller',
     'my_recent_drafts' => 'Son Taslaklarım',
     'my_recently_viewed' => 'Son Görüntülediklerim',
-    'my_most_viewed_favourites' => 'My Most Viewed Favourites',
-    'my_favourites' => 'My Favourites',
+    'my_most_viewed_favourites' => 'En Çok Görüntülenen Favoriler',
+    'my_favourites' => 'Favorilerim',
     'no_pages_viewed' => 'Herhangi bir sayfa görüntülemediniz',
     'no_pages_recently_created' => 'Yakın zamanda bir sayfa oluşturulmadı',
     'no_pages_recently_updated' => 'Yakın zamanda bir sayfa güncellenmedi',
@@ -143,8 +143,8 @@ return [
     'books_sort_chapters_last' => 'En Son Bölümler',
     'books_sort_show_other' => 'Diğer Kitapları Göster',
     'books_sort_save' => 'Yeni Düzeni Kaydet',
-    'books_copy' => 'Copy Book',
-    'books_copy_success' => 'Book successfully copied',
+    'books_copy' => 'Kitabı Kopyala',
+    'books_copy_success' => 'Kitap başarıyla kopyalandı',
 
     // Chapters
     'chapter' => 'Bölüm',
@@ -163,8 +163,8 @@ return [
     'chapters_move' => 'Bölümü Taşı',
     'chapters_move_named' => ':chapterName Bölümünü Taşı',
     'chapter_move_success' => 'Bölüm, :bookName kitabına taşındı',
-    'chapters_copy' => 'Copy Chapter',
-    'chapters_copy_success' => 'Chapter successfully copied',
+    'chapters_copy' => 'Bölümü kopyala',
+    'chapters_copy_success' => 'Bölüm başarıyla kopyalandı',
     'chapters_permissions' => 'Bölüm İzinleri',
     'chapters_empty' => 'Bu bölümde henüz bir sayfa bulunmuyor.',
     'chapters_permissions_active' => 'Bölüm İzinleri Aktif',
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Taslak kaydedildi ',
     'pages_edit_delete_draft' => 'Taslağı Sil',
     'pages_edit_discard_draft' => 'Taslağı Yoksay',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Değişim Günlüğünü Ayarla',
     'pages_edit_enter_changelog_desc' => 'Yaptığınız değişiklikler hakkında kısa bir açıklama girin',
     'pages_edit_enter_changelog' => 'Değişim Günlüğünü Yazın',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Sayfayı Kaydet',
     'pages_title' => 'Sayfa Başlığı',
     'pages_name' => 'Sayfa İsmi',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Revizyon #:id',
     'pages_revisions_numbered_changes' => 'Revizyon #:id Değişiklikleri',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Değişim Günlüğü',
     'pages_revisions_changes' => 'Değişiklikler',
     'pages_revisions_current' => 'Şimdiki Sürüm',
@@ -268,10 +279,10 @@ return [
     'tags_assigned_books' => 'Assigned to Books',
     'tags_assigned_shelves' => 'Assigned to Shelves',
     'tags_x_unique_values' => ':count unique values',
-    'tags_all_values' => 'All values',
-    'tags_view_tags' => 'View Tags',
-    'tags_view_existing_tags' => 'View existing tags',
-    'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.',
+    'tags_all_values' => 'Tüm değerler',
+    'tags_view_tags' => 'Etiketleri Göster',
+    'tags_view_existing_tags' => 'Mevcut etiketleri göster',
+    'tags_list_empty_hint' => 'Etiketleri sayfa editörü yan menüsünden veya kitap, bölüm veya rafları düzenlerken ekleyebilirsiniz.',
     'attachments' => 'Ekler',
     'attachments_explain' => 'Sayfanızda göstermek için dosyalar yükleyin veya bağlantılar ekleyin. Bunlar, sayfaya ait yan menüde gösterilecektir.',
     'attachments_explain_instant_save' => 'Burada yapılan değişiklikler anında kaydedilir.',
@@ -338,10 +349,10 @@ return [
     'revision_cannot_delete_latest' => 'Son revizyonu silemezsiniz.',
 
     // Copy view
-    'copy_consider' => 'Please consider the below when copying content.',
-    'copy_consider_permissions' => 'Custom permission settings will not be copied.',
-    'copy_consider_owner' => 'You will become the owner of all copied content.',
-    'copy_consider_images' => 'Page image files will not be duplicated & the original images will retain their relation to the page they were originally uploaded to.',
-    'copy_consider_attachments' => 'Page attachments will not be copied.',
-    'copy_consider_access' => 'A change of location, owner or permissions may result in this content being accessible to those previously without access.',
+    'copy_consider' => 'İçeriği kopyalarken aşağıdakileri hesaba katınız.',
+    'copy_consider_permissions' => 'Özel izin ayarları kopyalanmayacak.',
+    'copy_consider_owner' => 'Tüm kopyalanan içeriğin sahibi olacaksınız.',
+    'copy_consider_images' => 'Sayfa resim dosyalarının ikinci bir kopyası oluşturulmayıp, resimlerin ilk yüklendiği sayfadaki bağlantısı tutulacaktır.',
+    'copy_consider_attachments' => 'Sayfa ekleri kopyalanmayacak.',
+    'copy_consider_access' => 'Konum, sahiplik veya izinlerde yapılan bir değişiklik önceden erişimi olmayanlara erişim hakkı kazandırabilir.',
 ];
index 05b0a092a015502cb91086e620272541d66d7eeb..c4715b4f9908ae35a967b392810c3af98d99162b 100755 (executable)
@@ -10,8 +10,8 @@ return [
     'settings' => 'Ayarlar',
     'settings_save' => 'Ayarları Kaydet',
     'settings_save_success' => 'Ayarlar kaydedildi',
-    'system_version' => 'System Version',
-    'categories' => 'Categories',
+    'system_version' => 'Sistem Sürümü',
+    'categories' => 'Kategoriler',
 
     // App Settings
     'app_customization' => 'Özelleştirme',
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Daha Güvenli Görsel Yüklemeleri',
     'app_secure_images_toggle' => 'Daha güvenli görsel yüklemelerini aktifleştir',
     'app_secure_images_desc' => 'Bütün görseller, performans sebepleri nedeniyle herkes tarafından görüntülenebilir durumdadır. Bu seçeneği aktif ederseniz; görsel bağlantılarının önüne rastgele, tahmini zor karakterler eklenmesini sağlarsınız. Kolay erişimin önlenmesi için dizin indekslerinin kapalı olduğundan emin olun.',
-    'app_editor' => 'Sayfa Düzenleyicisi',
-    'app_editor_desc' => 'Sayfa düzenlemesi yapılırken, bütün kullanıcılar tarafından hangi düzenleyicinin kullanılacağını seçin.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Özel HTML "Head" İçeriği',
     'app_custom_html_desc' => 'Buraya yazacağınız içerik, <head> etiketinin içine ve en sonuna eklenecektir. Bu işlem, stil değişikliklerinin uygulanmasında ya da analytics kodlarının eklenmesinde yararlı olmaktadır.',
     'app_custom_html_disabled_notice' => 'Olası hatalı değişikliklerin geriye alınabilmesi için bu sayfanın özelleştirilmiş HTML "head" içeriği devre dışı bırakıldı.',
@@ -39,11 +39,11 @@ return [
     'app_homepage' => 'Ana Sayfa',
     'app_homepage_desc' => 'Varsayılan görünüm yerine ana sayfada görünmesi için bir görünüm seçin. Sayfa izinleri, burada seçeceğiniz sayfalar için yok sayılacaktır.',
     'app_homepage_select' => 'Bir sayfa seçin',
-    'app_footer_links' => 'Footer Links',
+    'app_footer_links' => 'Altbilgi Bağlantıları',
     'app_footer_links_desc' => 'Add links to show within the site footer. These will be displayed at the bottom of most pages, including those that do not require login. You can use a label of "trans::<key>" to use system-defined translations. For example: Using "trans::common.privacy_policy" will provide the translated text "Privacy Policy" and "trans::common.terms_of_service" will provide the translated text "Terms of Service".',
-    'app_footer_links_label' => 'Link Label',
-    'app_footer_links_url' => 'Link URL',
-    'app_footer_links_add' => 'Add Footer Link',
+    'app_footer_links_label' => 'Bağlantı Etiketi',
+    'app_footer_links_url' => 'Bağlantı adresi',
+    'app_footer_links_add' => 'Altbilgi Bağlantısı Ekle',
     'app_disable_comments' => 'Yorumları Devre Dışı Bırak',
     'app_disable_comments_toggle' => 'Yorumları devre dışı bırak',
     'app_disable_comments_desc' => 'Bütün sayfalar için yorumları devre dışı bırakır. <br> Mevcut yorumlar gösterilmeyecektir.',
@@ -94,7 +94,7 @@ return [
     'recycle_bin' => 'Geri Dönüşüm Kutusu',
     'recycle_bin_desc' => 'Burada silinen öğeleri geri yükleyebilir veya bunları sistemden kalıcı olarak kaldırmayı seçebilirsiniz. Bu liste, izin filtrelerinin uygulandığı sistemdeki benzer etkinlik listelerinden farklı olarak filtrelenmez.',
     'recycle_bin_deleted_item' => 'Silinen öge',
-    'recycle_bin_deleted_parent' => 'Parent',
+    'recycle_bin_deleted_parent' => 'Üst',
     'recycle_bin_deleted_by' => 'Tarafından silindi',
     'recycle_bin_deleted_at' => 'Silinme Zamanı',
     'recycle_bin_permanently_delete' => 'Kalıcı Olarak Sil',
@@ -121,7 +121,7 @@ return [
     'audit_table_user' => 'Kullanıcı',
     'audit_table_event' => 'Etkinlik',
     'audit_table_related' => 'İlgili Öğe veya Detay',
-    'audit_table_ip' => 'IP Address',
+    'audit_table_ip' => 'IP Adresi',
     'audit_table_date' => 'Aktivite Tarihi',
     'audit_date_from' => 'Tarih Aralığından',
     'audit_date_to' => 'Tarih Aralığına',
@@ -141,7 +141,7 @@ return [
     'role_details' => 'Rol Detayları',
     'role_name' => 'Rol Adı',
     'role_desc' => 'Rolün Kısa Tanımı',
-    'role_mfa_enforced' => 'Requires Multi-Factor Authentication',
+    'role_mfa_enforced' => 'Çok Aşamalı Kimlik Doğrulama Gerekiyor',
     'role_external_auth_id' => 'Harici Doğrulama Kimlikleri',
     'role_system' => 'Sistem Yetkileri',
     'role_manage_users' => 'Kullanıcıları yönet',
@@ -151,7 +151,8 @@ return [
     'role_manage_page_templates' => 'Sayfa şablonlarını yönet',
     'role_access_api' => 'Sistem programlama arayüzüne (API) eriş',
     'role_manage_settings' => 'Uygulama ayarlarını yönet',
-    'role_export_content' => 'Export content',
+    'role_export_content' => 'İçeriği dışa aktar',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Varlık Yetkileri',
     'roles_system_warning' => 'Yukarıdaki üç izinden herhangi birine erişimin, kullanıcının kendi ayrıcalıklarını veya sistemdeki diğerlerinin ayrıcalıklarını değiştirmesine izin verebileceğini unutmayın. Yalnızca bu izinlere sahip rolleri güvenilir kullanıcılara atayın.',
     'role_asset_desc' => 'Bu izinler, sistem içindeki varlıklara varsayılan erişim izinlerini ayarlar. Kitaplar, bölümler ve sayfalar üzerindeki izinler, buradaki izinleri geçersiz kılar.',
@@ -207,10 +208,10 @@ return [
     'users_api_tokens_create' => 'Anahtar Oluştur',
     'users_api_tokens_expires' => 'Bitiş süresi',
     'users_api_tokens_docs' => 'API Dokümantasyonu',
-    'users_mfa' => 'Multi-Factor Authentication',
+    'users_mfa' => 'Çok Aşamalı Kimlik Doğrulama',
     'users_mfa_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
     'users_mfa_x_methods' => ':count method configured|:count methods configured',
-    'users_mfa_configure' => 'Configure Methods',
+    'users_mfa_configure' => 'Yöntemleri Yapılandır',
 
     // API Tokens
     'user_api_token_create' => 'API Anahtarı Oluştur',
@@ -249,10 +250,10 @@ return [
     'webhooks_timeout' => 'Webhook Request Timeout (Seconds)',
     'webhooks_endpoint' => 'Webhook Endpoint',
     'webhooks_active' => 'Webhook Active',
-    'webhook_events_table_header' => 'Events',
-    'webhooks_delete' => 'Delete Webhook',
+    'webhook_events_table_header' => 'Etkinlikler',
+    'webhooks_delete' => 'Web Kancasını Sil',
     'webhooks_delete_warning' => 'This will fully delete this webhook, with the name \':webhookName\', from the system.',
-    'webhooks_delete_confirm' => 'Are you sure you want to delete this webhook?',
+    'webhooks_delete_confirm' => 'Bu web kancası silmek istediğinize emin misiniz?',
     'webhooks_format_example' => 'Webhook Format Example',
     'webhooks_format_example_desc' => 'Webhook data is sent as a POST request to the configured endpoint as JSON following the format below. The "related_item" and "url" properties are optional and will depend on the type of event triggered.',
     'webhooks_status' => 'Webhook Status',
index 50a30a5b5292e3f7e32fc0cba7bd1af376eebe26..640fe6131ced94268965f4f4402f993ffe572198 100644 (file)
@@ -15,7 +15,7 @@ return [
     'alpha_dash'           => ':attribute sadece harf, rakam ve tirelerden oluşabilir.',
     'alpha_num'            => ':attribute sadece harflerden ve rakamlardan oluşabilir.',
     'array'                => ':attribute bir dizi olmalıdır.',
-    'backup_codes'         => 'The provided code is not valid or has already been used.',
+    'backup_codes'         => 'Girilen kod geçersiz veya daha önce kullanılmış.',
     'before'               => ':attribute tarihi, :date tarihinden önceki bir tarih olmalıdır.',
     'between'              => [
         'numeric' => ':attribute değeri, :min ve :max değerleri arasında olmalıdır.',
@@ -32,7 +32,7 @@ return [
     'digits_between'       => ':attribute, en az :min ve en fazla :max basamaklı olmalıdır.',
     'email'                => ':attribute, geçerli bir e-posta adresi olmalıdır.',
     'ends_with' => ':attribute, şunlardan birisiyle bitmelidir: :values',
-    'file'                 => 'The :attribute must be provided as a valid file.',
+    'file'                 => 'Geçerli bir dosya olara :attribute sağlanmalıdır.',
     'filled'               => ':attribute alanı zorunludur.',
     'gt'                   => [
         'numeric' => ':attribute, :max değerinden büyük olmalıdır.',
@@ -100,7 +100,7 @@ return [
     ],
     'string'               => ':attribute, string olmalıdır.',
     'timezone'             => ':attribute, geçerli bir bölge olmalıdır.',
-    'totp'                 => 'The provided code is not valid or has expired.',
+    'totp'                 => 'Girilen kod geçersiz veya süresi dolmuş.',
     'unique'               => ':attribute zaten alınmış.',
     'url'                  => ':attribute formatı geçersiz.',
     'uploaded'             => 'Dosya yüklemesi başarısız oldu. Sunucu, bu boyuttaki dosyaları kabul etmiyor olabilir.',
index 622c9ef421d6560c7be8409e0d0747aedaa8c1dc..0aad8ee93bc30d2f7b976524ed45958a0d980f4f 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Чернетка збережена о ',
     'pages_edit_delete_draft' => 'Видалити чернетку',
     'pages_edit_discard_draft' => 'Відхилити чернетку',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Встановити журнал змін',
     'pages_edit_enter_changelog_desc' => 'Введіть короткий опис внесених вами змін',
     'pages_edit_enter_changelog' => 'Введіть список змін',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Зберегти сторінку',
     'pages_title' => 'Заголовок сторінки',
     'pages_name' => 'Назва сторінки',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Версія #:id',
     'pages_revisions_numbered_changes' => 'Зміни версії #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Історія змін',
     'pages_revisions_changes' => 'Зміни',
     'pages_revisions_current' => 'Поточна версія',
index 289aaa3555f3fc0ae051d29d41da7126b1ec8d46..91565fd6baf32a075c1a25c2448e2e283b4d93b8 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Вищі налаштування безпеки для зображень',
     'app_secure_images_toggle' => 'Увімкунти вищі налаштування безпеки для завантаження зображень',
     'app_secure_images_desc' => 'З міркувань продуктивності всі зображення є загальнодоступними. Цей параметр додає випадковий, важко передбачуваний рядок перед URL-адресами зображень. Переконайтеся, що індексація каталогів не активована, щоб запобігти легкому доступу.',
-    'app_editor' => 'Редактор сторінок',
-    'app_editor_desc' => 'Виберіть, який редактор буде використовуватися всіма користувачами для редагування сторінок.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Користувацький вміст HTML-заголовку',
     'app_custom_html_desc' => 'Будь-який доданий тут вміст буде вставлено в нижню частину розділу <head> кожної сторінки. Це зручно для перевизначення стилів, або додавання коду аналітики.',
     'app_custom_html_disabled_notice' => 'На цій сторінці налаштувань відключений користувацький вміст заголовка HTML, щоб гарантувати, що будь-які невдалі зміни можна буде відновити.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Доступ до системного API',
     'role_manage_settings' => 'Керування налаштуваннями програми',
     'role_export_content' => 'Вміст експорту',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Дозволи',
     'roles_system_warning' => 'Майте на увазі, що доступ до будь-якого з вищезазначених трьох дозволів може дозволити користувачеві змінювати власні привілеї або привілеї інших в системі. Ролі з цими дозволами призначайте лише довіреним користувачам.',
     'role_asset_desc' => 'Ці дозволи контролюють стандартні доступи всередині системи. Права на книги, розділи та сторінки перевизначать ці дозволи.',
diff --git a/resources/lang/uz/activities.php b/resources/lang/uz/activities.php
new file mode 100644 (file)
index 0000000..ae502a9
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Activity text strings.
+ * Is used for all the text within activity logs & notifications.
+ */
+return [
+
+    // Pages
+    'page_create'                 => 'yaratilgan sahifa',
+    'page_create_notification'    => 'Sahifa muvaffaqiyatli yaratildi',
+    'page_update'                 => 'yangilangan sahifa',
+    'page_update_notification'    => 'Sahifa muvaffaqiyatli yangilandi',
+    'page_delete'                 => 'o\'chirilgan sahifa',
+    'page_delete_notification'    => 'Sahifa muvaffaqiyatli o\'chirildi',
+    'page_restore'                => 'tiklangan sahifa',
+    'page_restore_notification'   => 'Sahifa muvaffaqiyatli qayta tiklandi',
+    'page_move'                   => 'ko\'chirilgan sahifa',
+
+    // Chapters
+    'chapter_create'              => 'yaratilgan bo\'lim',
+    'chapter_create_notification' => 'Bo\'lim muvaffaqiyatli yaratildi',
+    'chapter_update'              => 'yangilangan bo\'lim',
+    'chapter_update_notification' => 'Bo\'lim muvaffaqiyatli yangilandi',
+    'chapter_delete'              => 'o\'chirilgan bo\'lim',
+    'chapter_delete_notification' => 'Bo\'lim muvaffaqiyatli o\'chirildi',
+    'chapter_move'                => 'ko\'chirilgan bo\'lim',
+
+    // Books
+    'book_create'                 => 'yaratilgan kitob',
+    'book_create_notification'    => 'Kitob muvaffaqiyatli yaratildi',
+    'book_update'                 => 'yangilangan kitob',
+    'book_update_notification'    => 'Kitob muvaffaqiyatli yangilandi',
+    'book_delete'                 => 'o\'chirilgan kitob',
+    'book_delete_notification'    => 'Kitob muvaffaqiyatli o\'chirildi',
+    'book_sort'                   => 'tartiblangan kitob',
+    'book_sort_notification'      => 'Kitob muvaffaqiyatli qayta tartiblandi',
+
+    // Bookshelves
+    'bookshelf_create'            => 'yaratilgan kitobjavon',
+    'bookshelf_create_notification'    => 'Kitobjavon muvaffaqiyatli yaratildi',
+    'bookshelf_update'                 => 'yangilangan kitobjavob',
+    'bookshelf_update_notification'    => 'Kitobjavon muvaffaqiyatli yangilandi',
+    'bookshelf_delete'                 => 'o\'chirilgan kitobjavon',
+    'bookshelf_delete_notification'    => 'Kitobjavon muvaffaqiyatli o\'chirildi',
+
+    // Favourites
+    'favourite_add_notification' => '":name" sevimlilaringizga qo\'shildi',
+    'favourite_remove_notification' => '":name" sevimlilaringizdan olib tashlandi',
+
+    // MFA
+    'mfa_setup_method_notification' => 'Multi-faktor uslubi muvaffaqiyatli sozlandi',
+    'mfa_remove_method_notification' => 'Multi-faktor uslubi muvaffaqiyatli o\'chirildi',
+
+    // Webhooks
+    'webhook_create' => 'yaratilgan webhook',
+    'webhook_create_notification' => 'Webhook muvaffaqiyatli yaratildi',
+    'webhook_update' => 'yangilangan webhook',
+    'webhook_update_notification' => 'Webhook muvaffaqiyatli yangilandi',
+    'webhook_delete' => 'o\'chirilgan webhook',
+    'webhook_delete_notification' => 'Webhook muvaffaqiyatli o\'chirildi',
+
+    // Users
+    'user_update_notification' => 'Foydalanuvchi muvaffaqiyatli yangilandi',
+    'user_delete_notification' => 'Foydalanuvchi muvaffaqiyatli olib tashlandi',
+
+    // Other
+    'commented_on'                => 'fikr qoldirdi',
+    'permissions_update'          => 'yangilangan huquqlar',
+];
diff --git a/resources/lang/uz/auth.php b/resources/lang/uz/auth.php
new file mode 100644 (file)
index 0000000..afe0f06
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Authentication Language Lines
+ * The following language lines are used during authentication for various
+ * messages that we need to display to the user.
+ */
+return [
+
+    'failed' => 'Ushbu ma\'lumotlar, bizdagi ma\'lumotlarga mos kelmadi.',
+    'throttle' => 'Kirishga juda ko\'p urinishlar qilindi. Iltimos :seconds soniyadan so\'ng urinib ko\'ring.',
+
+    // Login & Register
+    'sign_up' => 'Ro\'yxatdan o\'tish',
+    'log_in' => 'Kirish',
+    'log_in_with' => ':socialDriver orqali kirish',
+    'sign_up_with' => ':socialDriver orqali ro\'yxatdan o\'tish',
+    'logout' => 'Chiqish',
+
+    'name' => 'Ism',
+    'username' => 'Foydalanuvchi nomi',
+    'email' => 'Email',
+    'password' => 'Parol',
+    'password_confirm' => 'Parolni tasdiqlash',
+    'password_hint' => 'Kamida 8 belgi bo\'lishi kerak',
+    'forgot_password' => 'Parolni unutdingizmi?',
+    'remember_me' => 'Meni eslab qoling',
+    'ldap_email_hint' => 'Ushbu hisob bilan foydalanish uchun emailni kiriting.',
+    'create_account' => 'Hisob yaratish',
+    'already_have_account' => 'Hisobingiz bormi?',
+    'dont_have_account' => 'Hisobingiz yo\'qmi?',
+    'social_login' => 'Ijtimoiy tarmoqlar orqali kirish',
+    'social_registration' => 'Ijtimoiy tarmoqlar orqali ro\'yxatdan o\'tish',
+    'social_registration_text' => 'Boshqa xizmatdan foydalanib ro\'yxatdan o\'ting va kiring.',
+
+    'register_thanks' => 'Ro\'yxatdan o\'tganingiz uchun rahmat!',
+    'register_confirm' => ':appName dan foydalnish uchun iltimos emailingizga yuborilgan xatni ochib, tasdiqlovchi link orqali o\'ting.',
+    'registrations_disabled' => 'Hozirda ro\'yxatdan o\'tish yopilgan',
+    'registration_email_domain_invalid' => 'Ushbu domendagi email bilan ro\'yxatdan o\'tib bo\'lmaydi',
+    'register_success' => 'Ro\'yxatdan o\'tganingiz uchun rahmat! Endi siz ushbu hisob bilan saytga kirishingiz mumkin.',
+
+    // Password Reset
+    'reset_password' => 'Parolni tiklash',
+    'reset_password_send_instructions' => 'Parolni tiklash manzilini olish uchun emailingizni quyidagi maydonga kiriting.',
+    'reset_password_send_button' => 'Tiklash manzilini yuborish',
+    'reset_password_sent' => 'A password reset link will be sent to :email if that email address is found in the system.',
+    'reset_password_success' => 'Your password has been successfully reset.',
+    'email_reset_subject' => 'Reset your :appName password',
+    'email_reset_text' => 'You are receiving this email because we received a password reset request for your account.',
+    'email_reset_not_requested' => 'If you did not request a password reset, no further action is required.',
+
+    // Email Confirmation
+    'email_confirm_subject' => 'Confirm your email on :appName',
+    'email_confirm_greeting' => 'Thanks for joining :appName!',
+    'email_confirm_text' => 'Please confirm your email address by clicking the button below:',
+    'email_confirm_action' => 'Confirm Email',
+    'email_confirm_send_error' => 'Email confirmation required but the system could not send the email. Contact the admin to ensure email is set up correctly.',
+    'email_confirm_success' => 'Your email has been confirmed! You should now be able to login using this email address.',
+    'email_confirm_resent' => 'Confirmation email resent, Please check your inbox.',
+
+    'email_not_confirmed' => 'Email Address Not Confirmed',
+    'email_not_confirmed_text' => 'Your email address has not yet been confirmed.',
+    'email_not_confirmed_click_link' => 'Please click the link in the email that was sent shortly after you registered.',
+    'email_not_confirmed_resend' => 'If you cannot find the email you can re-send the confirmation email by submitting the form below.',
+    'email_not_confirmed_resend_button' => 'Resend Confirmation Email',
+
+    // User Invite
+    'user_invite_email_subject' => 'You have been invited to join :appName!',
+    'user_invite_email_greeting' => 'An account has been created for you on :appName.',
+    'user_invite_email_text' => 'Click the button below to set an account password and gain access:',
+    'user_invite_email_action' => 'Set Account Password',
+    'user_invite_page_welcome' => 'Welcome to :appName!',
+    'user_invite_page_text' => 'To finalise your account and gain access you need to set a password which will be used to log-in to :appName on future visits.',
+    'user_invite_page_confirm_button' => 'Confirm Password',
+    'user_invite_success_login' => 'Password set, you should now be able to login using your set password to access :appName!',
+
+    // Multi-factor Authentication
+    'mfa_setup' => 'Setup Multi-Factor Authentication',
+    'mfa_setup_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
+    'mfa_setup_configured' => 'Already configured',
+    'mfa_setup_reconfigure' => 'Reconfigure',
+    'mfa_setup_remove_confirmation' => 'Are you sure you want to remove this multi-factor authentication method?',
+    'mfa_setup_action' => 'Setup',
+    'mfa_backup_codes_usage_limit_warning' => 'You have less than 5 backup codes remaining, Please generate and store a new set before you run out of codes to prevent being locked out of your account.',
+    'mfa_option_totp_title' => 'Mobile App',
+    'mfa_option_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
+    'mfa_option_backup_codes_title' => 'Backup Codes',
+    'mfa_option_backup_codes_desc' => 'Securely store a set of one-time-use backup codes which you can enter to verify your identity.',
+    'mfa_gen_confirm_and_enable' => 'Confirm and Enable',
+    'mfa_gen_backup_codes_title' => 'Backup Codes Setup',
+    'mfa_gen_backup_codes_desc' => 'Store the below list of codes in a safe place. When accessing the system you\'ll be able to use one of the codes as a second authentication mechanism.',
+    'mfa_gen_backup_codes_download' => 'Download Codes',
+    'mfa_gen_backup_codes_usage_warning' => 'Each code can only be used once',
+    'mfa_gen_totp_title' => 'Mobile App Setup',
+    'mfa_gen_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
+    'mfa_gen_totp_scan' => 'Scan the QR code below using your preferred authentication app to get started.',
+    'mfa_gen_totp_verify_setup' => 'Verify Setup',
+    'mfa_gen_totp_verify_setup_desc' => 'Verify that all is working by entering a code, generated within your authentication app, in the input box below:',
+    'mfa_gen_totp_provide_code_here' => 'Provide your app generated code here',
+    'mfa_verify_access' => 'Verify Access',
+    'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.',
+    'mfa_verify_no_methods' => 'No Methods Configured',
+    'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.',
+    'mfa_verify_use_totp' => 'Verify using a mobile app',
+    'mfa_verify_use_backup_codes' => 'Verify using a backup code',
+    'mfa_verify_backup_code' => 'Backup Code',
+    'mfa_verify_backup_code_desc' => 'Enter one of your remaining backup codes below:',
+    'mfa_verify_backup_code_enter_here' => 'Enter backup code here',
+    'mfa_verify_totp_desc' => 'Enter the code, generated using your mobile app, below:',
+    'mfa_setup_login_notification' => 'Multi-factor method configured, Please now login again using the configured method.',
+];
diff --git a/resources/lang/uz/common.php b/resources/lang/uz/common.php
new file mode 100644 (file)
index 0000000..2f09e53
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Common elements found throughout many areas of BookStack.
+ */
+return [
+
+    // Buttons
+    'cancel' => 'Cancel',
+    'confirm' => 'Confirm',
+    'back' => 'Back',
+    'save' => 'Save',
+    'continue' => 'Continue',
+    'select' => 'Select',
+    'toggle_all' => 'Toggle All',
+    'more' => 'More',
+
+    // Form Labels
+    'name' => 'Name',
+    'description' => 'Description',
+    'role' => 'Role',
+    'cover_image' => 'Cover image',
+    'cover_image_description' => 'This image should be approx 440x250px.',
+
+    // Actions
+    'actions' => 'Actions',
+    'view' => 'View',
+    'view_all' => 'View All',
+    'create' => 'Create',
+    'update' => 'Update',
+    'edit' => 'Edit',
+    'sort' => 'Sort',
+    'move' => 'Move',
+    'copy' => 'Copy',
+    'reply' => 'Reply',
+    'delete' => 'Delete',
+    'delete_confirm' => 'Confirm Deletion',
+    'search' => 'Search',
+    'search_clear' => 'Clear Search',
+    'reset' => 'Reset',
+    'remove' => 'Remove',
+    'add' => 'Add',
+    'configure' => 'Configure',
+    'fullscreen' => 'Fullscreen',
+    'favourite' => 'Favourite',
+    'unfavourite' => 'Unfavourite',
+    'next' => 'Next',
+    'previous' => 'Previous',
+    'filter_active' => 'Active Filter:',
+    'filter_clear' => 'Clear Filter',
+
+    // Sort Options
+    'sort_options' => 'Sort Options',
+    'sort_direction_toggle' => 'Sort Direction Toggle',
+    'sort_ascending' => 'Sort Ascending',
+    'sort_descending' => 'Sort Descending',
+    'sort_name' => 'Name',
+    'sort_default' => 'Default',
+    'sort_created_at' => 'Created Date',
+    'sort_updated_at' => 'Updated Date',
+
+    // Misc
+    'deleted_user' => 'Deleted User',
+    'no_activity' => 'No activity to show',
+    'no_items' => 'No items available',
+    'back_to_top' => 'Back to top',
+    'skip_to_main_content' => 'Skip to main content',
+    'toggle_details' => 'Toggle Details',
+    'toggle_thumbnails' => 'Toggle Thumbnails',
+    'details' => 'Details',
+    'grid_view' => 'Grid View',
+    'list_view' => 'List View',
+    'default' => 'Default',
+    'breadcrumb' => 'Breadcrumb',
+    'status' => 'Status',
+    'status_active' => 'Active',
+    'status_inactive' => 'Inactive',
+    'never' => 'Never',
+    'none' => 'None',
+
+    // Header
+    'header_menu_expand' => 'Expand Header Menu',
+    'profile_menu' => 'Profile Menu',
+    'view_profile' => 'View Profile',
+    'edit_profile' => 'Edit Profile',
+    'dark_mode' => 'Dark Mode',
+    'light_mode' => 'Light Mode',
+
+    // Layout tabs
+    'tab_info' => 'Info',
+    'tab_info_label' => 'Tab: Show Secondary Information',
+    'tab_content' => 'Content',
+    'tab_content_label' => 'Tab: Show Primary Content',
+
+    // Email Content
+    'email_action_help' => 'If you’re having trouble clicking the ":actionText" button, copy and paste the URL below into your web browser:',
+    'email_rights' => 'All rights reserved',
+
+    // Footer Link Options
+    // Not directly used but available for convenience to users.
+    'privacy_policy' => 'Privacy Policy',
+    'terms_of_service' => 'Terms of Service',
+];
diff --git a/resources/lang/uz/components.php b/resources/lang/uz/components.php
new file mode 100644 (file)
index 0000000..c6ae940
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Text used in custom JavaScript driven components.
+ */
+return [
+
+    // Image Manager
+    'image_select' => 'Rasmni tanlash',
+    'image_all' => 'Barchasi',
+    'image_all_title' => 'Barcha rasmlarni ko\'rish',
+    'image_book_title' => 'Ushbu kitobga yuklangan barcha rasmlarni ko\'rish',
+    'image_page_title' => 'Ushbu sahifaga yuklangan barcha rasmlarni ko\'rish',
+    'image_search_hint' => 'Rasmni nomi bo\'yicha izlash',
+    'image_uploaded' => ':uploadedDate sanada yuklangan',
+    'image_load_more' => 'Yana yuklash',
+    'image_image_name' => 'Rasm nomi',
+    'image_delete_used' => 'This image is used in the pages below.',
+    'image_delete_confirm_text' => 'Are you sure you want to delete this image?',
+    'image_select_image' => 'Rasmni tanlash',
+    'image_dropzone' => 'Drop images or click here to upload',
+    'images_deleted' => 'Images Deleted',
+    'image_preview' => 'Image Preview',
+    'image_upload_success' => 'Image uploaded successfully',
+    'image_update_success' => 'Image details successfully updated',
+    'image_delete_success' => 'Image successfully deleted',
+    'image_upload_remove' => 'Olib tashlash',
+
+    // Code Editor
+    'code_editor' => 'Kodni tahrirlash',
+    'code_language' => 'Kod tili',
+    'code_content' => 'Kod matni',
+    'code_session_history' => 'Sessiya tarixi',
+    'code_save' => 'Kodni saqlash',
+];
diff --git a/resources/lang/uz/editor.php b/resources/lang/uz/editor.php
new file mode 100644 (file)
index 0000000..8271202
--- /dev/null
@@ -0,0 +1,171 @@
+<?php
+/**
+ * Page Editor Lines
+ * Contains text strings used within the user interface of the
+ * WYSIWYG page editor. Some Markdown editor strings may still
+ * exist in the 'entities' file instead since this was added later.
+ */
+return [
+    // General editor terms
+    'general' => 'General',
+    'advanced' => 'Advanced',
+    'none' => 'None',
+    'cancel' => 'Cancel',
+    'save' => 'Save',
+    'close' => 'Close',
+    'undo' => 'Undo',
+    'redo' => 'Redo',
+    'left' => 'Left',
+    'center' => 'Center',
+    'right' => 'Right',
+    'top' => 'Top',
+    'middle' => 'Middle',
+    'bottom' => 'Bottom',
+    'width' => 'Width',
+    'height' => 'Height',
+    'More' => 'More',
+    'select' => 'Select...',
+
+    // Toolbar
+    'formats' => 'Formats',
+    'header_large' => 'Large Header',
+    'header_medium' => 'Medium Header',
+    'header_small' => 'Small Header',
+    'header_tiny' => 'Tiny Header',
+    'paragraph' => 'Paragraph',
+    'blockquote' => 'Blockquote',
+    'inline_code' => 'Inline code',
+    'callouts' => 'Callouts',
+    'callout_information' => 'Information',
+    'callout_success' => 'Success',
+    'callout_warning' => 'Warning',
+    'callout_danger' => 'Danger',
+    'bold' => 'Bold',
+    'italic' => 'Italic',
+    'underline' => 'Underline',
+    'strikethrough' => 'Strikethrough',
+    'superscript' => 'Superscript',
+    'subscript' => 'Subscript',
+    'text_color' => 'Text color',
+    'custom_color' => 'Custom color',
+    'remove_color' => 'Remove color',
+    'background_color' => 'Background color',
+    'align_left' => 'Align left',
+    'align_center' => 'Align center',
+    'align_right' => 'Align right',
+    'align_justify' => 'Justify',
+    'list_bullet' => 'Bullet list',
+    'list_numbered' => 'Numbered list',
+    'list_task' => 'Task list',
+    'indent_increase' => 'Increase indent',
+    'indent_decrease' => 'Decrease indent',
+    'table' => 'Table',
+    'insert_image' => 'Insert image',
+    'insert_image_title' => 'Insert/Edit Image',
+    'insert_link' => 'Insert/edit link',
+    'insert_link_title' => 'Insert/Edit Link',
+    'insert_horizontal_line' => 'Insert horizontal line',
+    'insert_code_block' => 'Insert code block',
+    'insert_drawing' => 'Insert/edit drawing',
+    'drawing_manager' => 'Drawing manager',
+    'insert_media' => 'Insert/edit media',
+    'insert_media_title' => 'Insert/Edit Media',
+    'clear_formatting' => 'Clear formatting',
+    'source_code' => 'Source code',
+    'source_code_title' => 'Source Code',
+    'fullscreen' => 'Fullscreen',
+    'image_options' => 'Image options',
+
+    // Tables
+    'table_properties' => 'Table properties',
+    'table_properties_title' => 'Table Properties',
+    'delete_table' => 'Delete table',
+    'insert_row_before' => 'Insert row before',
+    'insert_row_after' => 'Insert row after',
+    'delete_row' => 'Delete row',
+    'insert_column_before' => 'Insert column before',
+    'insert_column_after' => 'Insert column after',
+    'delete_column' => 'Delete column',
+    'table_cell' => 'Cell',
+    'table_row' => 'Row',
+    'table_column' => 'Column',
+    'cell_properties' => 'Cell properties',
+    'cell_properties_title' => 'Cell Properties',
+    'cell_type' => 'Cell type',
+    'cell_type_cell' => 'Cell',
+    'cell_scope' => 'Scope',
+    'cell_type_header' => 'Header cell',
+    'merge_cells' => 'Merge cells',
+    'split_cell' => 'Split cell',
+    'table_row_group' => 'Row Group',
+    'table_column_group' => 'Column Group',
+    'horizontal_align' => 'Horizontal align',
+    'vertical_align' => 'Vertical align',
+    'border_width' => 'Border width',
+    'border_style' => 'Border style',
+    'border_color' => 'Border color',
+    'row_properties' => 'Row properties',
+    'row_properties_title' => 'Row Properties',
+    'cut_row' => 'Cut row',
+    'copy_row' => 'Copy row',
+    'paste_row_before' => 'Paste row before',
+    'paste_row_after' => 'Paste row after',
+    'row_type' => 'Row type',
+    'row_type_header' => 'Header',
+    'row_type_body' => 'Body',
+    'row_type_footer' => 'Footer',
+    'alignment' => 'Alignment',
+    'cut_column' => 'Cut column',
+    'copy_column' => 'Copy column',
+    'paste_column_before' => 'Paste column before',
+    'paste_column_after' => 'Paste column after',
+    'cell_padding' => 'Cell padding',
+    'cell_spacing' => 'Cell spacing',
+    'caption' => 'Caption',
+    'show_caption' => 'Show caption',
+    'constrain' => 'Constrain proportions',
+    'cell_border_solid' => 'Solid',
+    'cell_border_dotted' => 'Dotted',
+    'cell_border_dashed' => 'Dashed',
+    'cell_border_double' => 'Double',
+    'cell_border_groove' => 'Groove',
+    'cell_border_ridge' => 'Ridge',
+    'cell_border_inset' => 'Inset',
+    'cell_border_outset' => 'Outset',
+    'cell_border_none' => 'None',
+    'cell_border_hidden' => 'Hidden',
+
+    // Images, links, details/summary & embed
+    'source' => 'Source',
+    'alt_desc' => 'Alternative description',
+    'embed' => 'Embed',
+    'paste_embed' => 'Paste your embed code below:',
+    'url' => 'URL',
+    'text_to_display' => 'Text to display',
+    'title' => 'Title',
+    'open_link' => 'Open link in...',
+    'open_link_current' => 'Current window',
+    'open_link_new' => 'New window',
+    'insert_collapsible' => 'Insert collapsible block',
+    'collapsible_unwrap' => 'Unwrap',
+    'edit_label' => 'Edit label',
+    'toggle_open_closed' => 'Toggle open/closed',
+    'collapsible_edit' => 'Edit collapsible block',
+    'toggle_label' => 'Toggle label',
+
+    // About view
+    'about' => 'About the editor',
+    'about_title' => 'About the WYSIWYG Editor',
+    'editor_license' => 'Editor License & Copyright',
+    'editor_tiny_license' => 'This editor is built using :tinyLink which is provided under an LGPL v2.1 license.',
+    'editor_tiny_license_link' => 'The copyright and license details of TinyMCE can be found here.',
+    'save_continue' => 'Save Page & Continue',
+    'callouts_cycle' => '(Keep pressing to toggle through types)',
+    'link_selector' => 'Link to content',
+    'shortcuts' => 'Shortcuts',
+    'shortcut' => 'Shortcut',
+    'shortcuts_intro' => 'The following shortcuts are available in the editor:',
+    'windows_linux' => '(Windows/Linux)',
+    'mac' => '(Mac)',
+    'description' => 'Description',
+];
diff --git a/resources/lang/uz/entities.php b/resources/lang/uz/entities.php
new file mode 100644 (file)
index 0000000..1838559
--- /dev/null
@@ -0,0 +1,358 @@
+<?php
+/**
+ * Text used for 'Entities' (Document Structure Elements) such as
+ * Books, Shelves, Chapters & Pages
+ */
+return [
+
+    // Shared
+    'recently_created' => 'Oxirgi yaratilgan',
+    'recently_created_pages' => 'Oxirgi yaratilgan sahifalar',
+    'recently_updated_pages' => 'Oxirgi yangilangan sahifalar',
+    'recently_created_chapters' => 'Oxirgi yaratilgan bo\'limlar',
+    'recently_created_books' => 'Oxirgi yaratilgan kitoblar',
+    'recently_created_shelves' => 'Oxirgi yaratilgan kitobjavonlar',
+    'recently_update' => 'Oxirgi yangilangan',
+    'recently_viewed' => 'Oxirgi ko\'rilgan',
+    'recent_activity' => 'Oxirgi faolliklar',
+    'create_now' => 'Yangi yaratish',
+    'revisions' => 'Reviziyalar',
+    'meta_revision' => '#:revisionCount reviziya',
+    'meta_created' => ':timeLength da yaratilgan',
+    'meta_created_name' => ':user tomonidan :timeLength da yaratilgan',
+    'meta_updated' => ':timeLength da yangilangan',
+    'meta_updated_name' => ':user tomonidan :timeLength da yangilangan',
+    'meta_owned_name' => 'Egasi :user',
+    'entity_select' => 'Entity Select',
+    'images' => 'Rasmlar',
+    'my_recent_drafts' => 'Mening oxirgi qoralamalarim',
+    'my_recently_viewed' => 'Mening oxirgi ko\'rganlarim',
+    'my_most_viewed_favourites' => 'Mening eng oxirgi sevimliga qo\'shganlarim',
+    'my_favourites' => 'Mening sevimlilarim',
+    'no_pages_viewed' => 'Siz hech qaysi sahifani ko\'rmagansiz',
+    'no_pages_recently_created' => 'Siz hali hech qanday sahifa yaratmagansiz',
+    'no_pages_recently_updated' => 'Siz hali sahifalarni yangilamagansiz',
+    'export' => 'Eksport',
+    'export_html' => 'HTML fayl sifatida',
+    'export_pdf' => 'PDF fayl sifatida',
+    'export_text' => 'Oddiy matn fayli',
+    'export_md' => 'Markdown fayli sifatida',
+
+    // Permissions and restrictions
+    'permissions' => 'Huquqlar',
+    'permissions_intro' => 'Once enabled, These permissions will take priority over any set role permissions.',
+    'permissions_enable' => 'Enable Custom Permissions',
+    'permissions_save' => 'Save Permissions',
+    'permissions_owner' => 'Egasi',
+
+    // Search
+    'search_results' => 'Qidiruv natijalari',
+    'search_total_results_found' => ':count result found|:count total results found',
+    'search_clear' => 'Qidiruvni tozalash',
+    'search_no_pages' => 'Qidiruvga mos sahifalar topilmadi',
+    'search_for_term' => ':term bo\'yicha qidiruv',
+    'search_more' => 'Qo\'shimcha natijalar',
+    'search_advanced' => 'Kengaytirilgan qidiruv',
+    'search_terms' => 'Qidiruv parametrlari',
+    'search_content_type' => 'Kontent turi',
+    'search_exact_matches' => 'Mos kelgan natijalar',
+    'search_tags' => 'Teg qidiruvi',
+    'search_options' => 'Opsiyalar',
+    'search_viewed_by_me' => 'Men tomonimdan ko\'rilgan',
+    'search_not_viewed_by_me' => 'Men tomonimdan ko\'rilmagan',
+    'search_permissions_set' => 'Permissions set',
+    'search_created_by_me' => 'Created by me',
+    'search_updated_by_me' => 'Updated by me',
+    'search_owned_by_me' => 'Owned by me',
+    'search_date_options' => 'Date Options',
+    'search_updated_before' => 'Updated before',
+    'search_updated_after' => 'Updated after',
+    'search_created_before' => 'Created before',
+    'search_created_after' => 'Created after',
+    'search_set_date' => 'Set Date',
+    'search_update' => 'Update Search',
+
+    // Shelves
+    'shelf' => 'Shelf',
+    'shelves' => 'Shelves',
+    'x_shelves' => ':count Shelf|:count Shelves',
+    'shelves_long' => 'Bookshelves',
+    'shelves_empty' => 'No shelves have been created',
+    'shelves_create' => 'Create New Shelf',
+    'shelves_popular' => 'Popular Shelves',
+    'shelves_new' => 'New Shelves',
+    'shelves_new_action' => 'New Shelf',
+    'shelves_popular_empty' => 'The most popular shelves will appear here.',
+    'shelves_new_empty' => 'The most recently created shelves will appear here.',
+    'shelves_save' => 'Save Shelf',
+    'shelves_books' => 'Books on this shelf',
+    'shelves_add_books' => 'Add books to this shelf',
+    'shelves_drag_books' => 'Drag books here to add them to this shelf',
+    'shelves_empty_contents' => 'This shelf has no books assigned to it',
+    'shelves_edit_and_assign' => 'Edit shelf to assign books',
+    'shelves_edit_named' => 'Edit Bookshelf :name',
+    'shelves_edit' => 'Edit Bookshelf',
+    'shelves_delete' => 'Delete Bookshelf',
+    'shelves_delete_named' => 'Delete Bookshelf :name',
+    'shelves_delete_explain' => "This will delete the bookshelf with the name ':name'. Contained books will not be deleted.",
+    'shelves_delete_confirmation' => 'Are you sure you want to delete this bookshelf?',
+    'shelves_permissions' => 'Bookshelf Permissions',
+    'shelves_permissions_updated' => 'Bookshelf Permissions Updated',
+    'shelves_permissions_active' => 'Bookshelf Permissions Active',
+    'shelves_permissions_cascade_warning' => 'Permissions on bookshelves do not automatically cascade to contained books. This is because a book can exist on multiple shelves. Permissions can however be copied down to child books using the option found below.',
+    'shelves_copy_permissions_to_books' => 'Copy Permissions to Books',
+    'shelves_copy_permissions' => 'Copy Permissions',
+    'shelves_copy_permissions_explain' => 'This will apply the current permission settings of this bookshelf to all books contained within. Before activating, ensure any changes to the permissions of this bookshelf have been saved.',
+    'shelves_copy_permission_success' => 'Bookshelf permissions copied to :count books',
+
+    // Books
+    'book' => 'Book',
+    'books' => 'Books',
+    'x_books' => ':count Book|:count Books',
+    'books_empty' => 'Kitob yaratilmagan',
+    'books_popular' => 'Ommabop kitoblar',
+    'books_recent' => 'Oxirgi kitoblar',
+    'books_new' => 'Yangi kitoblar',
+    'books_new_action' => 'Yangi kitob',
+    'books_popular_empty' => 'Eng ommabop kitoblar shu yerda aks etadi.',
+    'books_new_empty' => 'Eng oxirgi yaratilgan kitoblar bu yerda aks etadi.',
+    'books_create' => 'Yangi kitob yaratish',
+    'books_delete' => 'Kitobni o\'chirish',
+    'books_delete_named' => ':bookName kitobni o\'chirish',
+    'books_delete_explain' => 'This will delete the book with the name \':bookName\'. All pages and chapters will be removed.',
+    'books_delete_confirmation' => 'Are you sure you want to delete this book?',
+    'books_edit' => 'Edit Book',
+    'books_edit_named' => 'Edit Book :bookName',
+    'books_form_book_name' => 'Book Name',
+    'books_save' => 'Save Book',
+    'books_permissions' => 'Book Permissions',
+    'books_permissions_updated' => 'Book Permissions Updated',
+    'books_empty_contents' => 'No pages or chapters have been created for this book.',
+    'books_empty_create_page' => 'Create a new page',
+    'books_empty_sort_current_book' => 'Sort the current book',
+    'books_empty_add_chapter' => 'Add a chapter',
+    'books_permissions_active' => 'Book Permissions Active',
+    'books_search_this' => 'Search this book',
+    'books_navigation' => 'Book Navigation',
+    'books_sort' => 'Sort Book Contents',
+    'books_sort_named' => 'Sort Book :bookName',
+    'books_sort_name' => 'Sort by Name',
+    'books_sort_created' => 'Sort by Created Date',
+    'books_sort_updated' => 'Sort by Updated Date',
+    'books_sort_chapters_first' => 'Chapters First',
+    'books_sort_chapters_last' => 'Chapters Last',
+    'books_sort_show_other' => 'Show Other Books',
+    'books_sort_save' => 'Save New Order',
+    'books_copy' => 'Copy Book',
+    'books_copy_success' => 'Book successfully copied',
+
+    // Chapters
+    'chapter' => 'Chapter',
+    'chapters' => 'Chapters',
+    'x_chapters' => ':count Chapter|:count Chapters',
+    'chapters_popular' => 'Popular Chapters',
+    'chapters_new' => 'New Chapter',
+    'chapters_create' => 'Create New Chapter',
+    'chapters_delete' => 'Delete Chapter',
+    'chapters_delete_named' => 'Delete Chapter :chapterName',
+    'chapters_delete_explain' => 'This will delete the chapter with the name \':chapterName\'. All pages that exist within this chapter will also be deleted.',
+    'chapters_delete_confirm' => 'Are you sure you want to delete this chapter?',
+    'chapters_edit' => 'Edit Chapter',
+    'chapters_edit_named' => 'Edit Chapter :chapterName',
+    'chapters_save' => 'Save Chapter',
+    'chapters_move' => 'Move Chapter',
+    'chapters_move_named' => 'Move Chapter :chapterName',
+    'chapter_move_success' => 'Chapter moved to :bookName',
+    'chapters_copy' => 'Copy Chapter',
+    'chapters_copy_success' => 'Chapter successfully copied',
+    'chapters_permissions' => 'Chapter Permissions',
+    'chapters_empty' => 'No pages are currently in this chapter.',
+    'chapters_permissions_active' => 'Chapter Permissions Active',
+    'chapters_permissions_success' => 'Chapter Permissions Updated',
+    'chapters_search_this' => 'Search this chapter',
+
+    // Pages
+    'page' => 'Page',
+    'pages' => 'Pages',
+    'x_pages' => ':count Page|:count Pages',
+    'pages_popular' => 'Popular Pages',
+    'pages_new' => 'New Page',
+    'pages_attachments' => 'Attachments',
+    'pages_navigation' => 'Page Navigation',
+    'pages_delete' => 'Delete Page',
+    'pages_delete_named' => 'Delete Page :pageName',
+    'pages_delete_draft_named' => 'Delete Draft Page :pageName',
+    'pages_delete_draft' => 'Delete Draft Page',
+    'pages_delete_success' => 'Page deleted',
+    'pages_delete_draft_success' => 'Draft page deleted',
+    'pages_delete_confirm' => 'Are you sure you want to delete this page?',
+    'pages_delete_draft_confirm' => 'Are you sure you want to delete this draft page?',
+    'pages_editing_named' => 'Editing Page :pageName',
+    'pages_edit_draft_options' => 'Draft Options',
+    'pages_edit_save_draft' => 'Save Draft',
+    'pages_edit_draft' => 'Edit Page Draft',
+    'pages_editing_draft' => 'Editing Draft',
+    'pages_editing_page' => 'Editing Page',
+    'pages_edit_draft_save_at' => 'Draft saved at ',
+    'pages_edit_delete_draft' => 'Delete Draft',
+    'pages_edit_discard_draft' => 'Discard Draft',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
+    'pages_edit_set_changelog' => 'Set Changelog',
+    'pages_edit_enter_changelog_desc' => 'Enter a brief description of the changes you\'ve made',
+    'pages_edit_enter_changelog' => 'Enter Changelog',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
+    'pages_save' => 'Save Page',
+    'pages_title' => 'Page Title',
+    'pages_name' => 'Page Name',
+    'pages_md_editor' => 'Editor',
+    'pages_md_preview' => 'Preview',
+    'pages_md_insert_image' => 'Insert Image',
+    'pages_md_insert_link' => 'Insert Entity Link',
+    'pages_md_insert_drawing' => 'Insert Drawing',
+    'pages_not_in_chapter' => 'Page is not in a chapter',
+    'pages_move' => 'Move Page',
+    'pages_move_success' => 'Page moved to ":parentName"',
+    'pages_copy' => 'Copy Page',
+    'pages_copy_desination' => 'Copy Destination',
+    'pages_copy_success' => 'Page successfully copied',
+    'pages_permissions' => 'Page Permissions',
+    'pages_permissions_success' => 'Page permissions updated',
+    'pages_revision' => 'Revision',
+    'pages_revisions' => 'Page Revisions',
+    'pages_revisions_named' => 'Page Revisions for :pageName',
+    'pages_revision_named' => 'Page Revision for :pageName',
+    'pages_revision_restored_from' => 'Restored from #:id; :summary',
+    'pages_revisions_created_by' => 'Created By',
+    'pages_revisions_date' => 'Revision Date',
+    'pages_revisions_number' => '#',
+    'pages_revisions_numbered' => 'Revision #:id',
+    'pages_revisions_numbered_changes' => 'Revision #:id Changes',
+    'pages_revisions_editor' => 'Editor Type',
+    'pages_revisions_changelog' => 'Changelog',
+    'pages_revisions_changes' => 'Changes',
+    'pages_revisions_current' => 'Current Version',
+    'pages_revisions_preview' => 'Preview',
+    'pages_revisions_restore' => 'Restore',
+    'pages_revisions_none' => 'This page has no revisions',
+    'pages_copy_link' => 'Copy Link',
+    'pages_edit_content_link' => 'Edit Content',
+    'pages_permissions_active' => 'Page Permissions Active',
+    'pages_initial_revision' => 'Initial publish',
+    'pages_initial_name' => 'New Page',
+    'pages_editing_draft_notification' => 'You are currently editing a draft that was last saved :timeDiff.',
+    'pages_draft_edited_notification' => 'This page has been updated by since that time. It is recommended that you discard this draft.',
+    'pages_draft_page_changed_since_creation' => 'This page has been updated since this draft was created. It is recommended that you discard this draft or take care not to overwrite any page changes.',
+    'pages_draft_edit_active' => [
+        'start_a' => ':count users have started editing this page',
+        'start_b' => ':userName has started editing this page',
+        'time_a' => 'since the page was last updated',
+        'time_b' => 'in the last :minCount minutes',
+        'message' => ':start :time. Take care not to overwrite each other\'s updates!',
+    ],
+    'pages_draft_discarded' => 'Draft discarded, The editor has been updated with the current page content',
+    'pages_specific' => 'Specific Page',
+    'pages_is_template' => 'Page Template',
+
+    // Editor Sidebar
+    'page_tags' => 'Page Tags',
+    'chapter_tags' => 'Chapter Tags',
+    'book_tags' => 'Book Tags',
+    'shelf_tags' => 'Shelf Tags',
+    'tag' => 'Tag',
+    'tags' =>  'Tags',
+    'tag_name' =>  'Tag Name',
+    'tag_value' => 'Tag Value (Optional)',
+    'tags_explain' => "Add some tags to better categorise your content. \n You can assign a value to a tag for more in-depth organisation.",
+    'tags_add' => 'Add another tag',
+    'tags_remove' => 'Remove this tag',
+    'tags_usages' => 'Total tag usages',
+    'tags_assigned_pages' => 'Assigned to Pages',
+    'tags_assigned_chapters' => 'Assigned to Chapters',
+    'tags_assigned_books' => 'Assigned to Books',
+    'tags_assigned_shelves' => 'Assigned to Shelves',
+    'tags_x_unique_values' => ':count unique values',
+    'tags_all_values' => 'All values',
+    'tags_view_tags' => 'View Tags',
+    'tags_view_existing_tags' => 'View existing tags',
+    'tags_list_empty_hint' => 'Tags can be assigned via the page editor sidebar or while editing the details of a book, chapter or shelf.',
+    'attachments' => 'Attachments',
+    'attachments_explain' => 'Upload some files or attach some links to display on your page. These are visible in the page sidebar.',
+    'attachments_explain_instant_save' => 'Changes here are saved instantly.',
+    'attachments_items' => 'Attached Items',
+    'attachments_upload' => 'Upload File',
+    'attachments_link' => 'Attach Link',
+    'attachments_set_link' => 'Set Link',
+    'attachments_delete' => 'Are you sure you want to delete this attachment?',
+    'attachments_dropzone' => 'Drop files or click here to attach a file',
+    'attachments_no_files' => 'No files have been uploaded',
+    'attachments_explain_link' => 'You can attach a link if you\'d prefer not to upload a file. This can be a link to another page or a link to a file in the cloud.',
+    'attachments_link_name' => 'Link Name',
+    'attachment_link' => 'Attachment link',
+    'attachments_link_url' => 'Link to file',
+    'attachments_link_url_hint' => 'Url of site or file',
+    'attach' => 'Attach',
+    'attachments_insert_link' => 'Add Attachment Link to Page',
+    'attachments_edit_file' => 'Edit File',
+    'attachments_edit_file_name' => 'File Name',
+    'attachments_edit_drop_upload' => 'Drop files or click here to upload and overwrite',
+    'attachments_order_updated' => 'Attachment order updated',
+    'attachments_updated_success' => 'Attachment details updated',
+    'attachments_deleted' => 'Attachment deleted',
+    'attachments_file_uploaded' => 'File successfully uploaded',
+    'attachments_file_updated' => 'File successfully updated',
+    'attachments_link_attached' => 'Link successfully attached to page',
+    'templates' => 'Templates',
+    'templates_set_as_template' => 'Page is a template',
+    'templates_explain_set_as_template' => 'You can set this page as a template so its contents be utilized when creating other pages. Other users will be able to use this template if they have view permissions for this page.',
+    'templates_replace_content' => 'Replace page content',
+    'templates_append_content' => 'Append to page content',
+    'templates_prepend_content' => 'Prepend to page content',
+
+    // Profile View
+    'profile_user_for_x' => 'User for :time',
+    'profile_created_content' => 'Created Content',
+    'profile_not_created_pages' => ':userName has not created any pages',
+    'profile_not_created_chapters' => ':userName has not created any chapters',
+    'profile_not_created_books' => ':userName has not created any books',
+    'profile_not_created_shelves' => ':userName has not created any shelves',
+
+    // Comments
+    'comment' => 'Comment',
+    'comments' => 'Comments',
+    'comment_add' => 'Add Comment',
+    'comment_placeholder' => 'Leave a comment here',
+    'comment_count' => '{0} No Comments|{1} 1 Comment|[2,*] :count Comments',
+    'comment_save' => 'Save Comment',
+    'comment_saving' => 'Saving comment...',
+    'comment_deleting' => 'Deleting comment...',
+    'comment_new' => 'New Comment',
+    'comment_created' => 'commented :createDiff',
+    'comment_updated' => 'Updated :updateDiff by :username',
+    'comment_deleted_success' => 'Comment deleted',
+    'comment_created_success' => 'Comment added',
+    'comment_updated_success' => 'Comment updated',
+    'comment_delete_confirm' => 'Are you sure you want to delete this comment?',
+    'comment_in_reply_to' => 'In reply to :commentId',
+
+    // Revision
+    'revision_delete_confirm' => 'Are you sure you want to delete this revision?',
+    'revision_restore_confirm' => 'Are you sure you want to restore this revision? The current page contents will be replaced.',
+    'revision_delete_success' => 'Revision deleted',
+    'revision_cannot_delete_latest' => 'Cannot delete the latest revision.',
+
+    // Copy view
+    'copy_consider' => 'Please consider the below when copying content.',
+    'copy_consider_permissions' => 'Custom permission settings will not be copied.',
+    'copy_consider_owner' => 'You will become the owner of all copied content.',
+    'copy_consider_images' => 'Page image files will not be duplicated & the original images will retain their relation to the page they were originally uploaded to.',
+    'copy_consider_attachments' => 'Page attachments will not be copied.',
+    'copy_consider_access' => 'A change of location, owner or permissions may result in this content being accessible to those previously without access.',
+];
diff --git a/resources/lang/uz/errors.php b/resources/lang/uz/errors.php
new file mode 100644 (file)
index 0000000..f023b6b
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Text shown in error messaging.
+ */
+return [
+
+    // Permissions
+    'permission' => 'You do not have permission to access the requested page.',
+    'permissionJson' => 'You do not have permission to perform the requested action.',
+
+    // Auth
+    'error_user_exists_different_creds' => 'A user with the email :email already exists but with different credentials.',
+    'email_already_confirmed' => 'Email has already been confirmed, Try logging in.',
+    'email_confirmation_invalid' => 'This confirmation token is not valid or has already been used, Please try registering again.',
+    'email_confirmation_expired' => 'The confirmation token has expired, A new confirmation email has been sent.',
+    'email_confirmation_awaiting' => 'The email address for the account in use needs to be confirmed',
+    'ldap_fail_anonymous' => 'LDAP access failed using anonymous bind',
+    'ldap_fail_authed' => 'LDAP access failed using given dn & password details',
+    'ldap_extension_not_installed' => 'LDAP PHP extension not installed',
+    'ldap_cannot_connect' => 'Cannot connect to ldap server, Initial connection failed',
+    'saml_already_logged_in' => 'Already logged in',
+    'saml_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
+    'saml_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
+    'saml_invalid_response_id' => 'The request from the external authentication system is not recognised by a process started by this application. Navigating back after a login could cause this issue.',
+    'saml_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
+    'oidc_already_logged_in' => 'Already logged in',
+    'oidc_user_not_registered' => 'The user :name is not registered and automatic registration is disabled',
+    'oidc_no_email_address' => 'Could not find an email address, for this user, in the data provided by the external authentication system',
+    'oidc_fail_authed' => 'Login using :system failed, system did not provide successful authorization',
+    'social_no_action_defined' => 'No action defined',
+    'social_login_bad_response' => "Error received during :socialAccount login: \n:error",
+    'social_account_in_use' => 'This :socialAccount account is already in use, Try logging in via the :socialAccount option.',
+    'social_account_email_in_use' => 'The email :email is already in use. If you already have an account you can connect your :socialAccount account from your profile settings.',
+    'social_account_existing' => 'This :socialAccount is already attached to your profile.',
+    'social_account_already_used_existing' => 'This :socialAccount account is already used by another user.',
+    'social_account_not_used' => 'This :socialAccount account is not linked to any users. Please attach it in your profile settings. ',
+    'social_account_register_instructions' => 'If you do not yet have an account, You can register an account using the :socialAccount option.',
+    'social_driver_not_found' => 'Social driver not found',
+    'social_driver_not_configured' => 'Your :socialAccount social settings are not configured correctly.',
+    'invite_token_expired' => 'This invitation link has expired. You can instead try to reset your account password.',
+
+    // System
+    'path_not_writable' => 'File path :filePath could not be uploaded to. Ensure it is writable to the server.',
+    'cannot_get_image_from_url' => 'Cannot get image from :url',
+    'cannot_create_thumbs' => 'The server cannot create thumbnails. Please check you have the GD PHP extension installed.',
+    'server_upload_limit' => 'The server does not allow uploads of this size. Please try a smaller file size.',
+    'uploaded'  => 'The server does not allow uploads of this size. Please try a smaller file size.',
+    'image_upload_error' => 'An error occurred uploading the image',
+    'image_upload_type_error' => 'The image type being uploaded is invalid',
+    'file_upload_timeout' => 'The file upload has timed out.',
+
+    // Attachments
+    'attachment_not_found' => 'Attachment not found',
+
+    // Pages
+    'page_draft_autosave_fail' => 'Failed to save draft. Ensure you have internet connection before saving this page',
+    'page_custom_home_deletion' => 'Cannot delete a page while it is set as a homepage',
+
+    // Entities
+    'entity_not_found' => 'Entity not found',
+    'bookshelf_not_found' => 'Bookshelf not found',
+    'book_not_found' => 'Book not found',
+    'page_not_found' => 'Page not found',
+    'chapter_not_found' => 'Chapter not found',
+    'selected_book_not_found' => 'The selected book was not found',
+    'selected_book_chapter_not_found' => 'The selected Book or Chapter was not found',
+    'guests_cannot_save_drafts' => 'Guests cannot save drafts',
+
+    // Users
+    'users_cannot_delete_only_admin' => 'You cannot delete the only admin',
+    'users_cannot_delete_guest' => 'You cannot delete the guest user',
+
+    // Roles
+    'role_cannot_be_edited' => 'This role cannot be edited',
+    'role_system_cannot_be_deleted' => 'This role is a system role and cannot be deleted',
+    'role_registration_default_cannot_delete' => 'This role cannot be deleted while set as the default registration role',
+    'role_cannot_remove_only_admin' => 'This user is the only user assigned to the administrator role. Assign the administrator role to another user before attempting to remove it here.',
+
+    // Comments
+    'comment_list' => 'An error occurred while fetching the comments.',
+    'cannot_add_comment_to_draft' => 'You cannot add comments to a draft.',
+    'comment_add' => 'An error occurred while adding / updating the comment.',
+    'comment_delete' => 'An error occurred while deleting the comment.',
+    'empty_comment' => 'Cannot add an empty comment.',
+
+    // Error pages
+    '404_page_not_found' => 'Page Not Found',
+    'sorry_page_not_found' => 'Sorry, The page you were looking for could not be found.',
+    'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.',
+    'image_not_found' => 'Image Not Found',
+    'image_not_found_subtitle' => 'Sorry, The image file you were looking for could not be found.',
+    'image_not_found_details' => 'If you expected this image to exist it might have been deleted.',
+    'return_home' => 'Return to home',
+    'error_occurred' => 'An Error Occurred',
+    'app_down' => ':appName is down right now',
+    'back_soon' => 'It will be back up soon.',
+
+    // API errors
+    'api_no_authorization_found' => 'No authorization token found on the request',
+    'api_bad_authorization_format' => 'An authorization token was found on the request but the format appeared incorrect',
+    'api_user_token_not_found' => 'No matching API token was found for the provided authorization token',
+    'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect',
+    'api_user_no_api_permission' => 'The owner of the used API token does not have permission to make API calls',
+    'api_user_token_expired' => 'The authorization token used has expired',
+
+    // Settings & Maintenance
+    'maintenance_test_email_failure' => 'Error thrown when sending a test email:',
+
+];
diff --git a/resources/lang/uz/pagination.php b/resources/lang/uz/pagination.php
new file mode 100644 (file)
index 0000000..428cc86
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Pagination Language Lines
+ * The following language lines are used by the paginator library to build
+ * the simple pagination links.
+ */
+return [
+
+    'previous' => '&laquo; Avvalgi',
+    'next'     => 'Keyingi &raquo;',
+
+];
diff --git a/resources/lang/uz/passwords.php b/resources/lang/uz/passwords.php
new file mode 100644 (file)
index 0000000..b408f3c
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Password Reminder Language Lines
+ * The following language lines are the default lines which match reasons
+ * that are given by the password broker for a password update attempt has failed.
+ */
+return [
+
+    'password' => 'Passwords must be at least eight characters and match the confirmation.',
+    'user' => "We can't find a user with that e-mail address.",
+    'token' => 'The password reset token is invalid for this email address.',
+    'sent' => 'We have e-mailed your password reset link!',
+    'reset' => 'Your password has been reset!',
+
+];
diff --git a/resources/lang/uz/settings.php b/resources/lang/uz/settings.php
new file mode 100644 (file)
index 0000000..af2dcc1
--- /dev/null
@@ -0,0 +1,308 @@
+<?php
+/**
+ * Settings text strings
+ * Contains all text strings used in the general settings sections of BookStack
+ * including users and roles.
+ */
+return [
+
+    // Common Messages
+    'settings' => 'Settings',
+    'settings_save' => 'Save Settings',
+    'settings_save_success' => 'Settings saved',
+    'system_version' => 'System Version',
+    'categories' => 'Categories',
+
+    // App Settings
+    'app_customization' => 'Customization',
+    'app_features_security' => 'Features & Security',
+    'app_name' => 'Application Name',
+    'app_name_desc' => 'This name is shown in the header and in any system-sent emails.',
+    'app_name_header' => 'Show name in header',
+    'app_public_access' => 'Public Access',
+    'app_public_access_desc' => 'Enabling this option will allow visitors, that are not logged-in, to access content in your BookStack instance.',
+    'app_public_access_desc_guest' => 'Access for public visitors can be controlled through the "Guest" user.',
+    'app_public_access_toggle' => 'Allow public access',
+    'app_public_viewing' => 'Allow public viewing?',
+    'app_secure_images' => 'Higher Security Image Uploads',
+    'app_secure_images_toggle' => 'Enable higher security image uploads',
+    'app_secure_images_desc' => 'For performance reasons, all images are public. This option adds a random, hard-to-guess string in front of image urls. Ensure directory indexes are not enabled to prevent easy access.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
+    'app_custom_html' => 'Custom HTML Head Content',
+    'app_custom_html_desc' => 'Any content added here will be inserted into the bottom of the <head> section of every page. This is handy for overriding styles or adding analytics code.',
+    'app_custom_html_disabled_notice' => 'Custom HTML head content is disabled on this settings page to ensure any breaking changes can be reverted.',
+    'app_logo' => 'Application Logo',
+    'app_logo_desc' => 'This image should be 43px in height. <br>Large images will be scaled down.',
+    'app_primary_color' => 'Application Primary Color',
+    'app_primary_color_desc' => 'Sets the primary color for the application including the banner, buttons, and links.',
+    'app_homepage' => 'Application Homepage',
+    'app_homepage_desc' => 'Select a view to show on the homepage instead of the default view. Page permissions are ignored for selected pages.',
+    'app_homepage_select' => 'Select a page',
+    'app_footer_links' => 'Footer Links',
+    'app_footer_links_desc' => 'Add links to show within the site footer. These will be displayed at the bottom of most pages, including those that do not require login. You can use a label of "trans::<key>" to use system-defined translations. For example: Using "trans::common.privacy_policy" will provide the translated text "Privacy Policy" and "trans::common.terms_of_service" will provide the translated text "Terms of Service".',
+    'app_footer_links_label' => 'Link Label',
+    'app_footer_links_url' => 'Link URL',
+    'app_footer_links_add' => 'Add Footer Link',
+    'app_disable_comments' => 'Disable Comments',
+    'app_disable_comments_toggle' => 'Disable comments',
+    'app_disable_comments_desc' => 'Disables comments across all pages in the application. <br> Existing comments are not shown.',
+
+    // Color settings
+    'content_colors' => 'Content Colors',
+    'content_colors_desc' => 'Sets colors for all elements in the page organisation hierarchy. Choosing colors with a similar brightness to the default colors is recommended for readability.',
+    'bookshelf_color' => 'Shelf Color',
+    'book_color' => 'Book Color',
+    'chapter_color' => 'Chapter Color',
+    'page_color' => 'Page Color',
+    'page_draft_color' => 'Page Draft Color',
+
+    // Registration Settings
+    'reg_settings' => 'Registration',
+    'reg_enable' => 'Enable Registration',
+    'reg_enable_toggle' => 'Enable registration',
+    'reg_enable_desc' => 'When registration is enabled user will be able to sign themselves up as an application user. Upon registration they are given a single, default user role.',
+    'reg_default_role' => 'Default user role after registration',
+    'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.',
+    'reg_email_confirmation' => 'Email Confirmation',
+    'reg_email_confirmation_toggle' => 'Require email confirmation',
+    'reg_confirm_email_desc' => 'If domain restriction is used then email confirmation will be required and this option will be ignored.',
+    'reg_confirm_restrict_domain' => 'Domain Restriction',
+    'reg_confirm_restrict_domain_desc' => 'Enter a comma separated list of email domains you would like to restrict registration to. Users will be sent an email to confirm their address before being allowed to interact with the application. <br> Note that users will be able to change their email addresses after successful registration.',
+    'reg_confirm_restrict_domain_placeholder' => 'No restriction set',
+
+    // Maintenance settings
+    'maint' => 'Maintenance',
+    'maint_image_cleanup' => 'Cleanup Images',
+    'maint_image_cleanup_desc' => 'Scans page & revision content to check which images and drawings are currently in use and which images are redundant. Ensure you create a full database and image backup before running this.',
+    'maint_delete_images_only_in_revisions' => 'Also delete images that only exist in old page revisions',
+    'maint_image_cleanup_run' => 'Run Cleanup',
+    'maint_image_cleanup_warning' => ':count potentially unused images were found. Are you sure you want to delete these images?',
+    'maint_image_cleanup_success' => ':count potentially unused images found and deleted!',
+    'maint_image_cleanup_nothing_found' => 'No unused images found, Nothing deleted!',
+    'maint_send_test_email' => 'Send a Test Email',
+    'maint_send_test_email_desc' => 'This sends a test email to your email address specified in your profile.',
+    'maint_send_test_email_run' => 'Send test email',
+    'maint_send_test_email_success' => 'Email sent to :address',
+    'maint_send_test_email_mail_subject' => 'Test Email',
+    'maint_send_test_email_mail_greeting' => 'Email delivery seems to work!',
+    'maint_send_test_email_mail_text' => 'Congratulations! As you received this email notification, your email settings seem to be configured properly.',
+    'maint_recycle_bin_desc' => 'Deleted shelves, books, chapters & pages are sent to the recycle bin so they can be restored or permanently deleted. Older items in the recycle bin may be automatically removed after a while depending on system configuration.',
+    'maint_recycle_bin_open' => 'Open Recycle Bin',
+
+    // Recycle Bin
+    'recycle_bin' => 'Recycle Bin',
+    'recycle_bin_desc' => 'Here you can restore items that have been deleted or choose to permanently remove them from the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.',
+    'recycle_bin_deleted_item' => 'Deleted Item',
+    'recycle_bin_deleted_parent' => 'Parent',
+    'recycle_bin_deleted_by' => 'Deleted By',
+    'recycle_bin_deleted_at' => 'Deletion Time',
+    'recycle_bin_permanently_delete' => 'Permanently Delete',
+    'recycle_bin_restore' => 'Restore',
+    'recycle_bin_contents_empty' => 'The recycle bin is currently empty',
+    'recycle_bin_empty' => 'Empty Recycle Bin',
+    'recycle_bin_empty_confirm' => 'This will permanently destroy all items in the recycle bin including content contained within each item. Are you sure you want to empty the recycle bin?',
+    'recycle_bin_destroy_confirm' => 'This action will permanently delete this item, along with any child elements listed below, from the system and you will not be able to restore this content. Are you sure you want to permanently delete this item?',
+    'recycle_bin_destroy_list' => 'Items to be Destroyed',
+    'recycle_bin_restore_list' => 'Items to be Restored',
+    'recycle_bin_restore_confirm' => 'This action will restore the deleted item, including any child elements, to their original location. If the original location has since been deleted, and is now in the recycle bin, the parent item will also need to be restored.',
+    'recycle_bin_restore_deleted_parent' => 'The parent of this item has also been deleted. These will remain deleted until that parent is also restored.',
+    'recycle_bin_restore_parent' => 'Restore Parent',
+    'recycle_bin_destroy_notification' => 'Deleted :count total items from the recycle bin.',
+    'recycle_bin_restore_notification' => 'Restored :count total items from the recycle bin.',
+
+    // Audit Log
+    'audit' => 'Audit Log',
+    'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.',
+    'audit_event_filter' => 'Event Filter',
+    'audit_event_filter_no_filter' => 'No Filter',
+    'audit_deleted_item' => 'Deleted Item',
+    'audit_deleted_item_name' => 'Name: :name',
+    'audit_table_user' => 'User',
+    'audit_table_event' => 'Event',
+    'audit_table_related' => 'Related Item or Detail',
+    'audit_table_ip' => 'IP Address',
+    'audit_table_date' => 'Activity Date',
+    'audit_date_from' => 'Date Range From',
+    'audit_date_to' => 'Date Range To',
+
+    // Role Settings
+    'roles' => 'Roles',
+    'role_user_roles' => 'User Roles',
+    'role_create' => 'Create New Role',
+    'role_create_success' => 'Role successfully created',
+    'role_delete' => 'Delete Role',
+    'role_delete_confirm' => 'This will delete the role with the name \':roleName\'.',
+    'role_delete_users_assigned' => 'This role has :userCount users assigned to it. If you would like to migrate the users from this role select a new role below.',
+    'role_delete_no_migration' => "Don't migrate users",
+    'role_delete_sure' => 'Are you sure you want to delete this role?',
+    'role_delete_success' => 'Role successfully deleted',
+    'role_edit' => 'Edit Role',
+    'role_details' => 'Role Details',
+    'role_name' => 'Role Name',
+    'role_desc' => 'Short Description of Role',
+    'role_mfa_enforced' => 'Requires Multi-Factor Authentication',
+    'role_external_auth_id' => 'External Authentication IDs',
+    'role_system' => 'System Permissions',
+    'role_manage_users' => 'Manage users',
+    'role_manage_roles' => 'Manage roles & role permissions',
+    'role_manage_entity_permissions' => 'Manage all book, chapter & page permissions',
+    'role_manage_own_entity_permissions' => 'Manage permissions on own book, chapter & pages',
+    'role_manage_page_templates' => 'Manage page templates',
+    'role_access_api' => 'Access system API',
+    'role_manage_settings' => 'Manage app settings',
+    'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
+    'role_asset' => 'Asset Permissions',
+    'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.',
+    'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.',
+    'role_asset_admins' => 'Admins are automatically given access to all content but these options may show or hide UI options.',
+    'role_all' => 'All',
+    'role_own' => 'Own',
+    'role_controlled_by_asset' => 'Controlled by the asset they are uploaded to',
+    'role_save' => 'Save Role',
+    'role_update_success' => 'Role successfully updated',
+    'role_users' => 'Users in this role',
+    'role_users_none' => 'No users are currently assigned to this role',
+
+    // Users
+    'users' => 'Users',
+    'user_profile' => 'User Profile',
+    'users_add_new' => 'Add New User',
+    'users_search' => 'Search Users',
+    'users_latest_activity' => 'Latest Activity',
+    'users_details' => 'User Details',
+    'users_details_desc' => 'Set a display name and an email address for this user. The email address will be used for logging into the application.',
+    'users_details_desc_no_email' => 'Set a display name for this user so others can recognise them.',
+    'users_role' => 'User Roles',
+    'users_role_desc' => 'Select which roles this user will be assigned to. If a user is assigned to multiple roles the permissions from those roles will stack and they will receive all abilities of the assigned roles.',
+    'users_password' => 'User Password',
+    'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 8 characters long.',
+    'users_send_invite_text' => 'You can choose to send this user an invitation email which allows them to set their own password otherwise you can set their password yourself.',
+    'users_send_invite_option' => 'Send user invite email',
+    'users_external_auth_id' => 'External Authentication ID',
+    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
+    'users_password_warning' => 'Only fill the below if you would like to change your password.',
+    'users_system_public' => 'This user represents any guest users that visit your instance. It cannot be used to log in but is assigned automatically.',
+    'users_delete' => 'Delete User',
+    'users_delete_named' => 'Delete user :userName',
+    'users_delete_warning' => 'This will fully delete this user with the name \':userName\' from the system.',
+    'users_delete_confirm' => 'Are you sure you want to delete this user?',
+    'users_migrate_ownership' => 'Migrate Ownership',
+    'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.',
+    'users_none_selected' => 'No user selected',
+    'users_edit' => 'Edit User',
+    'users_edit_profile' => 'Edit Profile',
+    'users_avatar' => 'User Avatar',
+    'users_avatar_desc' => 'Select an image to represent this user. This should be approx 256px square.',
+    'users_preferred_language' => 'Preferred Language',
+    'users_preferred_language_desc' => 'This option will change the language used for the user-interface of the application. This will not affect any user-created content.',
+    'users_social_accounts' => 'Social Accounts',
+    'users_social_accounts_info' => 'Here you can connect your other accounts for quicker and easier login. Disconnecting an account here does not revoke previously authorized access. Revoke access from your profile settings on the connected social account.',
+    'users_social_connect' => 'Connect Account',
+    'users_social_disconnect' => 'Disconnect Account',
+    'users_social_connected' => ':socialAccount account was successfully attached to your profile.',
+    'users_social_disconnected' => ':socialAccount account was successfully disconnected from your profile.',
+    'users_api_tokens' => 'API Tokens',
+    'users_api_tokens_none' => 'No API tokens have been created for this user',
+    'users_api_tokens_create' => 'Create Token',
+    'users_api_tokens_expires' => 'Expires',
+    'users_api_tokens_docs' => 'API Documentation',
+    'users_mfa' => 'Multi-Factor Authentication',
+    'users_mfa_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
+    'users_mfa_x_methods' => ':count method configured|:count methods configured',
+    'users_mfa_configure' => 'Configure Methods',
+
+    // API Tokens
+    'user_api_token_create' => 'Create API Token',
+    'user_api_token_name' => 'Name',
+    'user_api_token_name_desc' => 'Give your token a readable name as a future reminder of its intended purpose.',
+    'user_api_token_expiry' => 'Expiry Date',
+    'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.',
+    'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.',
+    'user_api_token_create_success' => 'API token successfully created',
+    'user_api_token_update_success' => 'API token successfully updated',
+    'user_api_token' => 'API Token',
+    'user_api_token_id' => 'Token ID',
+    'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.',
+    'user_api_token_secret' => 'Token Secret',
+    'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.',
+    'user_api_token_created' => 'Token created :timeAgo',
+    'user_api_token_updated' => 'Token updated :timeAgo',
+    'user_api_token_delete' => 'Delete Token',
+    'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.',
+    'user_api_token_delete_confirm' => 'Are you sure you want to delete this API token?',
+    'user_api_token_delete_success' => 'API token successfully deleted',
+
+    // Webhooks
+    'webhooks' => 'Webhooks',
+    'webhooks_create' => 'Create New Webhook',
+    'webhooks_none_created' => 'No webhooks have yet been created.',
+    'webhooks_edit' => 'Edit Webhook',
+    'webhooks_save' => 'Save Webhook',
+    'webhooks_details' => 'Webhook Details',
+    'webhooks_details_desc' => 'Provide a user friendly name and a POST endpoint as a location for the webhook data to be sent to.',
+    'webhooks_events' => 'Webhook Events',
+    'webhooks_events_desc' => 'Select all the events that should trigger this webhook to be called.',
+    'webhooks_events_warning' => 'Keep in mind that these events will be triggered for all selected events, even if custom permissions are applied. Ensure that use of this webhook won\'t expose confidential content.',
+    'webhooks_events_all' => 'All system events',
+    'webhooks_name' => 'Webhook Name',
+    'webhooks_timeout' => 'Webhook Request Timeout (Seconds)',
+    'webhooks_endpoint' => 'Webhook Endpoint',
+    'webhooks_active' => 'Webhook Active',
+    'webhook_events_table_header' => 'Events',
+    'webhooks_delete' => 'Delete Webhook',
+    'webhooks_delete_warning' => 'This will fully delete this webhook, with the name \':webhookName\', from the system.',
+    'webhooks_delete_confirm' => 'Are you sure you want to delete this webhook?',
+    'webhooks_format_example' => 'Webhook Format Example',
+    'webhooks_format_example_desc' => 'Webhook data is sent as a POST request to the configured endpoint as JSON following the format below. The "related_item" and "url" properties are optional and will depend on the type of event triggered.',
+    'webhooks_status' => 'Webhook Status',
+    'webhooks_last_called' => 'Last Called:',
+    'webhooks_last_errored' => 'Last Errored:',
+    'webhooks_last_error_message' => 'Last Error Message:',
+
+
+    //! If editing translations files directly please ignore this in all
+    //! languages apart from en. Content will be auto-copied from en.
+    //!////////////////////////////////
+    'language_select' => [
+        'en' => 'English',
+        'ar' => 'العربية',
+        'bg' => 'Bǎlgarski',
+        'bs' => 'Bosanski',
+        'ca' => 'Català',
+        'cs' => 'Česky',
+        'da' => 'Dansk',
+        'de' => 'Deutsch (Sie)',
+        'de_informal' => 'Deutsch (Du)',
+        'es' => 'Español',
+        'es_AR' => 'Español Argentina',
+        'et' => 'Eesti keel',
+        'eu' => 'Euskara',
+        'fr' => 'Français',
+        'he' => 'עברית',
+        'hr' => 'Hrvatski',
+        'hu' => 'Magyar',
+        'id' => 'Bahasa Indonesia',
+        'it' => 'Italian',
+        'ja' => '日本語',
+        'ko' => '한국어',
+        'lt' => 'Lietuvių Kalba',
+        'lv' => 'Latviešu Valoda',
+        'nl' => 'Nederlands',
+        'nb' => 'Norsk (Bokmål)',
+        'pl' => 'Polski',
+        'pt' => 'Português',
+        'pt_BR' => 'Português do Brasil',
+        'ru' => 'Русский',
+        'sk' => 'Slovensky',
+        'sl' => 'Slovenščina',
+        'sv' => 'Svenska',
+        'tr' => 'Türkçe',
+        'uk' => 'Українська',
+        'vi' => 'Tiếng Việt',
+        'zh_CN' => '简体中文',
+        'zh_TW' => '繁體中文',
+    ],
+    //!////////////////////////////////
+];
diff --git a/resources/lang/uz/validation.php b/resources/lang/uz/validation.php
new file mode 100644 (file)
index 0000000..2a676c7
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Validation Lines
+ * The following language lines contain the default error messages used by
+ * the validator class. Some of these rules have multiple versions such
+ * as the size rules. Feel free to tweak each of these messages here.
+ */
+return [
+
+    // Standard laravel validation lines
+    'accepted'             => 'The :attribute must be accepted.',
+    'active_url'           => 'The :attribute is not a valid URL.',
+    'after'                => 'The :attribute must be a date after :date.',
+    'alpha'                => 'The :attribute may only contain letters.',
+    'alpha_dash'           => 'The :attribute may only contain letters, numbers, dashes and underscores.',
+    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
+    'array'                => 'The :attribute must be an array.',
+    'backup_codes'         => 'The provided code is not valid or has already been used.',
+    'before'               => 'The :attribute must be a date before :date.',
+    'between'              => [
+        'numeric' => 'The :attribute must be between :min and :max.',
+        'file'    => 'The :attribute must be between :min and :max kilobytes.',
+        'string'  => 'The :attribute must be between :min and :max characters.',
+        'array'   => 'The :attribute must have between :min and :max items.',
+    ],
+    'boolean'              => 'The :attribute field must be true or false.',
+    'confirmed'            => 'The :attribute confirmation does not match.',
+    'date'                 => 'The :attribute is not a valid date.',
+    'date_format'          => 'The :attribute does not match the format :format.',
+    'different'            => 'The :attribute and :other must be different.',
+    'digits'               => 'The :attribute must be :digits digits.',
+    'digits_between'       => 'The :attribute must be between :min and :max digits.',
+    'email'                => 'The :attribute must be a valid email address.',
+    'ends_with' => 'The :attribute must end with one of the following: :values',
+    'file'                 => 'The :attribute must be provided as a valid file.',
+    'filled'               => 'The :attribute field is required.',
+    '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.',
+    ],
+    'exists'               => 'The selected :attribute is invalid.',
+    'image'                => 'The :attribute must be an image.',
+    'image_extension'      => 'The :attribute must have a valid & supported image extension.',
+    'in'                   => 'The selected :attribute is invalid.',
+    'integer'              => 'The :attribute must be an integer.',
+    'ip'                   => 'The :attribute must be a valid IP address.',
+    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
+    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
+    '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'                  => [
+        'numeric' => 'The :attribute may not be greater than :max.',
+        'file'    => 'The :attribute may not be greater than :max kilobytes.',
+        'string'  => 'The :attribute may not be greater than :max characters.',
+        'array'   => 'The :attribute may not have more than :max items.',
+    ],
+    'mimes'                => 'The :attribute must be a file of type: :values.',
+    'min'                  => [
+        'numeric' => 'The :attribute must be at least :min.',
+        'file'    => 'The :attribute must be at least :min kilobytes.',
+        'string'  => 'The :attribute must be at least :min characters.',
+        'array'   => 'The :attribute must have at least :min items.',
+    ],
+    'not_in'               => 'The selected :attribute is invalid.',
+    'not_regex'            => 'The :attribute format is invalid.',
+    'numeric'              => 'The :attribute must be a number.',
+    'regex'                => 'The :attribute format is invalid.',
+    'required'             => 'The :attribute field is required.',
+    'required_if'          => 'The :attribute field is required when :other is :value.',
+    'required_with'        => 'The :attribute field is required when :values is present.',
+    'required_with_all'    => 'The :attribute field is required when :values is present.',
+    'required_without'     => 'The :attribute field is required when :values is not present.',
+    'required_without_all' => 'The :attribute field is required when none of :values are present.',
+    'same'                 => 'The :attribute and :other must match.',
+    'safe_url'             => 'The provided link may not be safe.',
+    'size'                 => [
+        'numeric' => 'The :attribute must be :size.',
+        'file'    => 'The :attribute must be :size kilobytes.',
+        'string'  => 'The :attribute must be :size characters.',
+        'array'   => 'The :attribute must contain :size items.',
+    ],
+    'string'               => 'The :attribute must be a string.',
+    'timezone'             => 'The :attribute must be a valid zone.',
+    'totp'                 => 'The provided code is not valid or has expired.',
+    'unique'               => 'The :attribute has already been taken.',
+    'url'                  => 'The :attribute format is invalid.',
+    'uploaded'             => 'The file could not be uploaded. The server may not accept files of this size.',
+
+    // Custom validation lines
+    'custom' => [
+        'password-confirm' => [
+            'required_with' => 'Password confirmation required',
+        ],
+    ],
+
+    // Custom validation attributes
+    'attributes' => [],
+];
index 7dfbe52561595e075248673105f3fa692f441ba7..52a4d4520def13e6b117d4b0ce0ccf4597b6b6c7 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => 'Bản nháp đã lưu lúc ',
     'pages_edit_delete_draft' => 'Xóa Bản nháp',
     'pages_edit_discard_draft' => 'Hủy bỏ Bản nháp',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => 'Đặt Changelog',
     'pages_edit_enter_changelog_desc' => 'Viết mô tả ngắn gọn cho các thay đổi mà bạn tạo',
     'pages_edit_enter_changelog' => 'Viết Changelog',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => 'Lưu Trang',
     'pages_title' => 'Tiêu đề Trang',
     'pages_name' => 'Tên Trang',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => 'Phiên bản #:id',
     'pages_revisions_numbered_changes' => 'Các thay đổi của phiên bản #:id',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => 'Nhật ký thay đổi',
     'pages_revisions_changes' => 'Các thay đổi',
     'pages_revisions_current' => 'Phiên bản hiện tại',
index 7740c24877a19991b6b08008dcd13cbefaf74ce1..b59727b1680dc2f808f8f593dfb9f4976c9624a0 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => 'Bảo mật tốt hơn cho việc tải lên ảnh',
     'app_secure_images_toggle' => 'Bật bảo mật tốt hơn cho các ảnh được tải lên',
     'app_secure_images_desc' => 'Vì lí do hiệu năng, tất cả các ảnh đều được truy cập công khai. Tùy chọn này thêm một chuỗi ngẫu nhiên, khó đoán vào phần liên kết đến ảnh. Đảm bảo rằng tránh việc index thư mục để ngăn chặn việc truy cập đến ảnh một cách dễ dàng.',
-    'app_editor' => 'Soạn thảo Trang',
-    'app_editor_desc' => 'Chọn trình soạn thảo nào sẽ được sử dụng bởi tất cả người dùng để chỉnh sửa trang.',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => 'Tùy chọn nội dung Head HTML',
     'app_custom_html_desc' => 'Bất cứ nội dung nào được thêm vào đây sẽ được đưa vào phần cuối của khu vực <head> của mỗi trang. Tiện cho việc ghi đè style hoặc thêm mã phân tích dữ liệu.',
     'app_custom_html_disabled_notice' => 'Nội dung tùy biến HTML head bị tắt tại trang cài đặt này để đảm bảo mọi thay đổi làm hỏng hệ thống có để được khôi phục.',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => 'Truy cập đến API hệ thống',
     'role_manage_settings' => 'Quản lý cài đặt của ứng dụng',
     'role_export_content' => 'Export content',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => 'Quyền tài sản (asset)',
     'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.',
     'role_asset_desc' => 'Các quyền này điều khiển truy cập mặc định tới tài sản (asset) nằm trong hệ thống. Quyền tại Sách, Chường và Trang se ghi đè các quyền này.',
index 81d46a0593a422cdffd416d86362f3d502ff7244..80f6335e2f635d90e625d15c0eaafe1d71c2c772 100644 (file)
@@ -24,7 +24,7 @@ return [
     'width' => '宽度',
     'height' => '高度',
     'More' => '更多',
-    'select' => 'Select...',
+    'select' => '选择...',
 
     // Toolbar
     'formats' => '格式',
@@ -53,10 +53,10 @@ return [
     'align_left' => '左对齐',
     'align_center' => '居中',
     'align_right' => '右对齐',
-    'align_justify' => 'Justify',
+    'align_justify' => '两端对齐',
     'list_bullet' => '无序列表',
     'list_numbered' => '有序列表',
-    'list_task' => 'Task list',
+    'list_task' => '任务列表',
     'indent_increase' => '增加缩进',
     'indent_decrease' => '减少缩进',
     'table' => '表格',
@@ -93,10 +93,10 @@ return [
     'cell_properties_title' => '单元格属性',
     'cell_type' => '单元格类型',
     'cell_type_cell' => '单元格',
-    'cell_scope' => 'Scope',
+    'cell_scope' => '范围',
     'cell_type_header' => '表头',
-    'merge_cells' => 'Merge cells',
-    'split_cell' => 'Split cell',
+    'merge_cells' => '合并单元格',
+    'split_cell' => '拆分单元格',
     'table_row_group' => '按行分组',
     'table_column_group' => '按列分组',
     'horizontal_align' => '水平对齐',
@@ -124,16 +124,16 @@ return [
     'caption' => '标题',
     'show_caption' => '显示标题',
     'constrain' => '保持宽高比',
-    'cell_border_solid' => 'Solid',
-    'cell_border_dotted' => 'Dotted',
-    'cell_border_dashed' => 'Dashed',
-    'cell_border_double' => 'Double',
-    'cell_border_groove' => 'Groove',
-    'cell_border_ridge' => 'Ridge',
-    'cell_border_inset' => 'Inset',
-    'cell_border_outset' => 'Outset',
-    'cell_border_none' => 'None',
-    'cell_border_hidden' => 'Hidden',
+    'cell_border_solid' => '实线',
+    'cell_border_dotted' => '点虚线',
+    'cell_border_dashed' => '短虚线',
+    'cell_border_double' => '双实线',
+    'cell_border_groove' => '浮入',
+    'cell_border_ridge' => '浮出',
+    'cell_border_inset' => '陷入',
+    'cell_border_outset' => '突出',
+    'cell_border_none' => '无边框',
+    'cell_border_hidden' => '隐藏边框',
 
     // Images, links, details/summary & embed
     'source' => '来源',
@@ -154,7 +154,7 @@ return [
     'toggle_label' => '切换标签',
 
     // About view
-    'about' => 'About the editor',
+    'about' => '关于编辑器',
     'about_title' => '关于所见即所得(WYSIWYG)编辑器',
     'editor_license' => '编辑器许可证与版权信息',
     'editor_tiny_license' => '此编辑器是在 LGPL v2.1 许可证下使用 :tinyLink 构建的。',
index 7a6654c823c31346575f66672941288c199fa574..c93577798d9224b8bbdf21b1fc32c0fe13004e5c 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => '草稿保存于 ',
     'pages_edit_delete_draft' => '删除草稿',
     'pages_edit_discard_draft' => '放弃草稿',
+    'pages_edit_switch_to_markdown' => '切换到 Markdown 编辑器',
+    'pages_edit_switch_to_markdown_clean' => '(清除内容)',
+    'pages_edit_switch_to_markdown_stable' => '(保留内容)',
+    'pages_edit_switch_to_wysiwyg' => '切换到所见即所得编辑器',
     'pages_edit_set_changelog' => '更新说明',
     'pages_edit_enter_changelog_desc' => '输入对您所做更改的简要说明',
     'pages_edit_enter_changelog' => '输入更新说明',
+    'pages_editor_switch_title' => '切换编辑器',
+    'pages_editor_switch_are_you_sure' => '您确定要更改此页面的编辑器吗?',
+    'pages_editor_switch_consider_following' => '更改编辑器时请注意以下事项:',
+    'pages_editor_switch_consideration_a' => '一旦保存,任何未来的编辑都将使用新的编辑器,包括那些可能无法自行更改编辑器类型的编辑器。',
+    'pages_editor_switch_consideration_b' => '这可能导致在某些情况下失去细节和语法。',
+    'pages_editor_switch_consideration_c' => '此次修改不会保存上次保存后修改的标签和更改日志。',
     'pages_save' => '保存页面',
     'pages_title' => '页面标题',
     'pages_name' => '页面名',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => '修订 #:id',
     'pages_revisions_numbered_changes' => '修改 #:id ',
+    'pages_revisions_editor' => '编辑器类型',
     'pages_revisions_changelog' => '更新说明',
     'pages_revisions_changes' => '查看更改',
     'pages_revisions_current' => '当前版本',
index dacb82d83881296eba2aa12f908d89e84cad5dd8..bef4d20f5082ffc4b886a791e7889494a2d26e86 100755 (executable)
@@ -10,8 +10,8 @@ return [
     'settings' => '设置',
     'settings_save' => '保存设置',
     'settings_save_success' => '设置已保存',
-    'system_version' => 'System Version',
-    'categories' => 'Categories',
+    'system_version' => '系统版本',
+    'categories' => '类别',
 
     // App Settings
     'app_customization' => '定制',
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => '启用更高安全性的图片上传?',
     'app_secure_images_toggle' => '启用更高安全性的图片上传',
     'app_secure_images_desc' => '出于性能原因,所有图像都是公开的。这个选项会在图像的网址前添加一个随机的,难以猜测的字符串,从而使直接访问变得困难。',
-    'app_editor' => '页面编辑器',
-    'app_editor_desc' => '选择所有用户将使用哪个编辑器来编辑页面。',
+    'app_default_editor' => '默认页面编辑器',
+    'app_default_editor_desc' => '选择在编辑新页面时默认使用哪个编辑器。这可以在页面权限处覆盖。',
     'app_custom_html' => '自定义HTML头部内容',
     'app_custom_html_desc' => '此处添加的任何内容都将插入到每个页面的<head>部分的底部,这对于覆盖样式或添加分析代码很方便。',
     'app_custom_html_disabled_notice' => '在此设置页面上禁用了自定义HTML标题内容,以确保可以恢复所有重大更改。',
@@ -121,7 +121,7 @@ return [
     'audit_table_user' => '用户',
     'audit_table_event' => '事件',
     'audit_table_related' => '相关项目或详细信息',
-    'audit_table_ip' => 'IP地址',
+    'audit_table_ip' => 'IP 地址',
     'audit_table_date' => '活动日期',
     'audit_date_from' => '日期范围从',
     'audit_date_to' => '日期范围至',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => '访问系统 API',
     'role_manage_settings' => '管理App设置',
     'role_export_content' => '导出内容',
+    'role_editor_change' => '更改页面编辑器',
     'role_asset' => '资源许可',
     'roles_system_warning' => '请注意,拥有上述三个权限中的任何一个都可以允许用户更改自己的权限或系统中其他人的权限。 请只将拥有这些权限的角色分配给你信任的用户。',
     'role_asset_desc' => '对系统内资源的默认访问许可将由这些权限控制。单独设置在书籍,章节和页面上的权限将覆盖这里的权限设定。',
index b051deda52849229c433f56ccf985a0b495937a6..4977d1ec2b74625e4aefad01ebc9ef380ce18fd2 100644 (file)
@@ -21,7 +21,7 @@ return [
     'email' => '電子郵件',
     'password' => '密碼',
     'password_confirm' => '確認密碼',
-    'password_hint' => 'Must be at least 8 characters',
+    'password_hint' => '密碼必須至少8個字元',
     'forgot_password' => '忘記密碼?',
     'remember_me' => '記住我',
     'ldap_email_hint' => '請輸入此帳號使用的電子郵件。',
@@ -54,7 +54,7 @@ return [
     'email_confirm_text' => '請點選下面的按鈕來確認您的電子郵件地址:',
     'email_confirm_action' => '確認電子郵件',
     'email_confirm_send_error' => '需要電子郵件驗證,但系統無法傳送電子郵件。請與管理員聯絡以確保電子郵件正確設定。',
-    'email_confirm_success' => 'Your email has been confirmed! You should now be able to login using this email address.',
+    'email_confirm_success' => '您的電子郵箱已確認成功!您可以使用該電子郵箱地址進行登入了。',
     'email_confirm_resent' => '確認電子郵件已重新傳送。請檢查您的收件匣。',
 
     'email_not_confirmed' => '電子郵件地址未確認',
@@ -71,20 +71,20 @@ return [
     'user_invite_page_welcome' => '歡迎使用 :appName!',
     'user_invite_page_text' => '要完成設定您的帳號並取得存取權,您必須設定密碼,此密碼將用於登入 :appName。',
     'user_invite_page_confirm_button' => '確認密碼',
-    'user_invite_success_login' => 'Password set, you should now be able to login using your set password to access :appName!',
+    'user_invite_success_login' => '密碼已設定完成,您可以使用改密碼來登入 :appName!',
 
     // Multi-factor Authentication
-    'mfa_setup' => 'Setup Multi-Factor Authentication',
-    'mfa_setup_desc' => 'Setup multi-factor authentication as an extra layer of security for your user account.',
-    'mfa_setup_configured' => 'Already configured',
-    'mfa_setup_reconfigure' => 'Reconfigure',
-    'mfa_setup_remove_confirmation' => 'Are you sure you want to remove this multi-factor authentication method?',
-    'mfa_setup_action' => 'Setup',
-    'mfa_backup_codes_usage_limit_warning' => 'You have less than 5 backup codes remaining, Please generate and store a new set before you run out of codes to prevent being locked out of your account.',
-    'mfa_option_totp_title' => 'Mobile App',
-    'mfa_option_totp_desc' => 'To use multi-factor authentication you\'ll need a mobile application that supports TOTP such as Google Authenticator, Authy or Microsoft Authenticator.',
-    'mfa_option_backup_codes_title' => 'Backup Codes',
-    'mfa_option_backup_codes_desc' => 'Securely store a set of one-time-use backup codes which you can enter to verify your identity.',
+    'mfa_setup' => '設定雙重身份驗證',
+    'mfa_setup_desc' => '設定雙重身份驗證為您的帳戶多增加了一道防線',
+    'mfa_setup_configured' => '設定完成',
+    'mfa_setup_reconfigure' => '重新設定',
+    'mfa_setup_remove_confirmation' => '您確定要移除雙重身份驗證嗎?',
+    'mfa_setup_action' => '設置',
+    'mfa_backup_codes_usage_limit_warning' => '您只剩下不到5組備用驗證碼了,請重新生成新的備用驗證碼並妥善保存,以免日後無法登入您的賬號。',
+    'mfa_option_totp_title' => '手機App',
+    'mfa_option_totp_desc' => '您必須在行動裝置上安裝了支援TOTP的身份驗證程式(例如Google Authenticator, Authy 或是 Microsoft Authenticator)才能使用雙重身份驗證。',
+    'mfa_option_backup_codes_title' => '備用驗證碼',
+    'mfa_option_backup_codes_desc' => '妥善保存好您的一次性備用驗證碼,以便日後驗證您的身份。',
     'mfa_gen_confirm_and_enable' => 'Confirm and Enable',
     'mfa_gen_backup_codes_title' => 'Backup Codes Setup',
     'mfa_gen_backup_codes_desc' => 'Store the below list of codes in a safe place. When accessing the system you\'ll be able to use one of the codes as a second authentication mechanism.',
@@ -100,9 +100,9 @@ return [
     'mfa_verify_access_desc' => 'Your user account requires you to confirm your identity via an additional level of verification before you\'re granted access. Verify using one of your configured methods to continue.',
     'mfa_verify_no_methods' => 'No Methods Configured',
     'mfa_verify_no_methods_desc' => 'No multi-factor authentication methods could be found for your account. You\'ll need to set up at least one method before you gain access.',
-    'mfa_verify_use_totp' => 'Verify using a mobile app',
-    'mfa_verify_use_backup_codes' => 'Verify using a backup code',
-    'mfa_verify_backup_code' => 'Backup Code',
+    'mfa_verify_use_totp' => '使用您的行動裝置進行驗證',
+    'mfa_verify_use_backup_codes' => '使用您的備用驗證碼進行驗證',
+    'mfa_verify_backup_code' => '備用驗證碼',
     'mfa_verify_backup_code_desc' => 'Enter one of your remaining backup codes below:',
     'mfa_verify_backup_code_enter_here' => 'Enter backup code here',
     'mfa_verify_totp_desc' => 'Enter the code, generated using your mobile app, below:',
index 0b10aaa8301df570350aecc420ae20d4e7240cc1..a42946b990c3e8596796fd8acb11bb7b28174cab 100644 (file)
@@ -196,9 +196,19 @@ return [
     'pages_edit_draft_save_at' => '草稿儲存於 ',
     'pages_edit_delete_draft' => '刪除草稿',
     'pages_edit_discard_draft' => '放棄草稿',
+    'pages_edit_switch_to_markdown' => 'Switch to Markdown Editor',
+    'pages_edit_switch_to_markdown_clean' => '(Clean Content)',
+    'pages_edit_switch_to_markdown_stable' => '(Stable Content)',
+    'pages_edit_switch_to_wysiwyg' => 'Switch to WYSIWYG Editor',
     'pages_edit_set_changelog' => '設定變更日誌',
     'pages_edit_enter_changelog_desc' => '輸入對您所做變動的簡易描述',
     'pages_edit_enter_changelog' => '輸入變更日誌',
+    'pages_editor_switch_title' => 'Switch Editor',
+    'pages_editor_switch_are_you_sure' => 'Are you sure you want to change the editor for this page?',
+    'pages_editor_switch_consider_following' => 'Consider the following when changing editors:',
+    'pages_editor_switch_consideration_a' => 'Once saved, the new editor option will be used by any future editors, including those that may not be able to change editor type themselves.',
+    'pages_editor_switch_consideration_b' => 'This can potentially lead to a loss of detail and syntax in certain circumstances.',
+    'pages_editor_switch_consideration_c' => 'Tag or changelog changes, made since last save, won\'t persist across this change.',
     'pages_save' => '儲存頁面',
     'pages_title' => '頁面標題',
     'pages_name' => '頁面名稱',
@@ -225,6 +235,7 @@ return [
     'pages_revisions_number' => '#',
     'pages_revisions_numbered' => '修訂版本 #:id',
     'pages_revisions_numbered_changes' => '修訂版本 #:id 變更',
+    'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_changelog' => '變動日誌',
     'pages_revisions_changes' => '變動',
     'pages_revisions_current' => '目前版本',
index aa4dde1f468080d439a6ae9e52661ec7fcac1dc8..2dd9d55774c1e9368b7a532331058f67789909bb 100644 (file)
@@ -27,8 +27,8 @@ return [
     'app_secure_images' => '更高安全性的圖片上傳',
     'app_secure_images_toggle' => '啟用更高安全性的圖片上傳',
     'app_secure_images_desc' => '因為效能因素,所有圖片都是公開的。此選項會在圖片的網址前加入一串隨機且難以猜測的字串。確保未啟用目錄索引,讓直接進入變得更困難。',
-    'app_editor' => '頁面編輯器',
-    'app_editor_desc' => '選取所有使用者將使用哪個編輯器來編輯頁面。',
+    'app_default_editor' => 'Default Page Editor',
+    'app_default_editor_desc' => 'Select which editor will be used by default when editing new pages. This can be overridden at a page level where permissions allow.',
     'app_custom_html' => '自訂 HTML 標題內容',
     'app_custom_html_desc' => '此處加入的任何內容都將插入到每個頁面的 <head> 部分的底部,這對於覆蓋樣式或加入分析程式碼很方便。',
     'app_custom_html_disabled_notice' => '在此設定頁面上停用了自訂 HTML 標題內容,以確保任何重大變更都能被還原。',
@@ -152,6 +152,7 @@ return [
     'role_access_api' => '存取系統 API',
     'role_manage_settings' => '管理應用程式設定',
     'role_export_content' => '匯入內容',
+    'role_editor_change' => 'Change page editor',
     'role_asset' => '資源權限',
     'roles_system_warning' => '請注意,有上述三項權限中的任一項的使用者都可以更改自己或系統中其他人的權限。有這些權限的角色只應分配給受信任的使用者。',
     'role_asset_desc' => '對系統內資源的預設權限將由這裡的權限控制。若有單獨設定在書本、章節和頁面上的權限,將會覆寫這裡的權限設定。',
index 95ba81520bc431eaac45a9b7dba22931126505a4..bce456cf2ce1e1b82147ae45e8f368ac83a91e83 100644 (file)
     width: 800px;
     max-width: 90%;
   }
+  &.very-small {
+    margin: 2% auto;
+    width: 600px;
+    max-width: 90%;
+  }
   &:before {
     display: flex;
     align-self: flex-start;
index 9cff52972bbcf00d7a10d3d209f37bfe696213f0..26d12a25da42949cbced533fd25ac66caac1bf9c 100644 (file)
@@ -593,13 +593,22 @@ ul.pagination {
   li.active a {
     font-weight: 600;
   }
-  a, button {
-    display: block;
-    padding: $-xs $-m;
+  button {
+    width: 100%;
+    text-align: start;
+  }
+  li.border-bottom {
+    border-bottom: 1px solid #DDD;
+  }
+  li hr {
+    margin: $-xs 0;
+  }
+  .icon-item, .text-item, .label-item {
+    padding: 8px $-m;
     @include lightDark(color, #555, #eee);
     fill: currentColor;
     white-space: nowrap;
-    line-height: 1.6;
+    line-height: 1.4;
     cursor: pointer;
     &:hover, &:focus {
       text-decoration: none;
@@ -616,15 +625,30 @@ ul.pagination {
       width: 16px;
     }
   }
-  button {
-    width: 100%;
-    text-align: start;
+  .text-item {
+    display: block;
   }
-  li.border-bottom {
-    border-bottom: 1px solid #DDD;
+  .label-item {
+    display: grid;
+    align-items: center;
+    grid-template-columns: auto min-content;
+    gap: $-m;
   }
-  li hr {
-    margin: $-xs 0;
+  .label-item > *:nth-child(2) {
+    opacity: 0.7;
+    &:hover {
+      opacity: 1;
+    }
+  }
+  .icon-item {
+    display: grid;
+    align-items: start;
+    grid-template-columns: 16px auto;
+    gap: $-m;
+    svg {
+      margin-inline-end: 0;
+      margin-block-start: 1px;
+    }
   }
 }
 
index 884808bb44daac5a9585c13302aab568a8ecf3b3..51f3156143c381271eec6e3f8b839fe6ca1daab0 100644 (file)
@@ -163,7 +163,6 @@ em, i, .italic {
 
 small, p.small, span.small, .text-small {
   font-size: 0.75rem;
-  @include lightDark(color, #5e5e5e, #999);
 }
 
 sup, .superscript {
index b48fde9c01d90c0efe6341fcf88c7ec5d1b5d8a4..ebb1c24aadf4eca14effc513f10d8c34dc406518 100644 (file)
@@ -28,7 +28,7 @@
                             class="drag-card-action text-center text-neg">@icon('close')</button>
                     <div refs="dropdown@menu" class="dropdown-menu">
                         <p class="text-neg small px-m mb-xs">{{ trans('entities.attachments_delete') }}</p>
-                        <button refs="ajax-delete-row@delete" type="button" class="text-primary small delete">{{ trans('common.confirm') }}</button>
+                        <button refs="ajax-delete-row@delete" type="button" class="text-primary small delete text-item">{{ trans('common.confirm') }}</button>
                     </div>
                 </div>
             </div>
index 9f4a12357156cb41b65f08f61955c9d636e7d763..6189c65d41e7fab03103ff4eec1d447d8425faf4 100644 (file)
                         <button type="button" refs="dropdown@toggle" aria-haspopup="true" aria-expanded="false" class="text-button" title="{{ trans('common.delete') }}">@icon('delete')</button>
                         <ul refs="dropdown@menu" class="dropdown-menu" role="menu">
                             <li class="px-m text-small text-muted pb-s">{{trans('entities.comment_delete_confirm')}}</li>
-                            <li><button action="delete" type="button" class="text-button text-neg" >@icon('delete'){{ trans('common.delete') }}</button></li>
+                            <li>
+                                <button action="delete" type="button" class="text-button text-neg icon-item">
+                                    @icon('delete')
+                                    <div>{{ trans('common.delete') }}</div>
+                                </button>
+                            </li>
                         </ul>
                     </div>
                 @endif
diff --git a/resources/views/common/confirm-dialog.blade.php b/resources/views/common/confirm-dialog.blade.php
new file mode 100644 (file)
index 0000000..28587d4
--- /dev/null
@@ -0,0 +1,21 @@
+<div components="popup confirm-dialog"
+     refs="confirm-dialog@popup {{ $ref }}"
+     class="popup-background">
+    <div class="popup-body very-small" tabindex="-1">
+
+        <div class="popup-header primary-background">
+            <div class="popup-title">{{ $title }}</div>
+            <button refs="popup@hide" type="button" class="popup-header-close">x</button>
+        </div>
+
+        <div class="px-m py-m">
+            {{ $slot }}
+
+            <div class="text-right">
+                <button type="button" class="button outline" refs="popup@hide">{{ trans('common.cancel') }}</button>
+                <button type="button" class="button" refs="confirm-dialog@confirm">{{ trans('common.continue') }}</button>
+            </div>
+        </div>
+
+    </div>
+</div>
\ No newline at end of file
index ee10637dddf4e0a0022f2feb4e78bc08d38a165f..1dfa6bb45b63ef9d299d1bd15123b48fcf7802af 100644 (file)
@@ -1,5 +1,5 @@
 <style>
-    @if (!app()->environment('testing'))
+    @if (!app()->runningUnitTests())
         {!! file_get_contents(public_path('/dist/export-styles.css')) !!}
     @endif
 </style>
index d55f3ae2dacd179a7749d362035a9ed0f2498922..b5ac520c18f37755388da0be91cd2a43cf01bc11 100644 (file)
                         </span>
                         <ul refs="dropdown@menu" class="dropdown-menu" role="menu">
                             <li>
-                                <a href="{{ url('/favourites') }}">@icon('star'){{ trans('entities.my_favourites') }}</a>
+                                <a href="{{ url('/favourites') }}" class="icon-item">
+                                    @icon('star')
+                                    <div>{{ trans('entities.my_favourites') }}</div>
+                                </a>
                             </li>
                             <li>
-                                <a href="{{ $currentUser->getProfileUrl() }}">@icon('user'){{ trans('common.view_profile') }}</a>
+                                <a href="{{ $currentUser->getProfileUrl() }}" class="icon-item">
+                                    @icon('user')
+                                    <div>{{ trans('common.view_profile') }}</div>
+                                </a>
                             </li>
                             <li>
-                                <a href="{{ $currentUser->getEditUrl() }}">@icon('edit'){{ trans('common.edit_profile') }}</a>
+                                <a href="{{ $currentUser->getEditUrl() }}" class="icon-item">
+                                    @icon('edit')
+                                    <div>{{ trans('common.edit_profile') }}</div>
+                                </a>
                             </li>
                             <li>
                                 <form action="{{ url(config('auth.method') === 'saml2' ? '/saml2/logout' : '/logout') }}"
                                       method="post">
                                     {{ csrf_field() }}
-                                    <button class="text-muted icon-list-item text-primary">
-                                        @icon('logout'){{ trans('auth.logout') }}
+                                    <button class="icon-item">
+                                        @icon('logout')
+                                        <div>{{ trans('auth.logout') }}</div>
                                     </button>
                                 </form>
                             </li>
                             <li><hr></li>
                             <li>
-                                @include('common.dark-mode-toggle')
+                                @include('common.dark-mode-toggle', ['classes' => 'icon-item'])
                             </li>
                         </ul>
                     </div>
index 2b0f5c19dd84b9b88130afe5ee289545eae0100a..dd7231095b8f6ebf3e7e14ec9d9674adfbceb999 100644 (file)
@@ -5,9 +5,9 @@
         <span>{{ trans('entities.export') }}</span>
     </div>
     <ul refs="dropdown@menu" class="wide dropdown-menu" role="menu">
-        <li><a href="{{ $entity->getUrl('/export/html') }}" target="_blank" rel="noopener">{{ trans('entities.export_html') }} <span class="text-muted float right">.html</span></a></li>
-        <li><a href="{{ $entity->getUrl('/export/pdf') }}" target="_blank" rel="noopener">{{ trans('entities.export_pdf') }} <span class="text-muted float right">.pdf</span></a></li>
-        <li><a href="{{ $entity->getUrl('/export/plaintext') }}" target="_blank" rel="noopener">{{ trans('entities.export_text') }} <span class="text-muted float right">.txt</span></a></li>
-        <li><a href="{{ $entity->getUrl('/export/markdown') }}" target="_blank" rel="noopener">{{ trans('entities.export_md') }} <span class="text-muted float right">.md</span></a></li>
+        <li><a href="{{ $entity->getUrl('/export/html') }}" target="_blank" class="label-item"><span>{{ trans('entities.export_html') }}</span><span>.html</span></a></li>
+        <li><a href="{{ $entity->getUrl('/export/pdf') }}" target="_blank" class="label-item"><span>{{ trans('entities.export_pdf') }}</span><span>.pdf</span></a></li>
+        <li><a href="{{ $entity->getUrl('/export/plaintext') }}" target="_blank" class="label-item"><span>{{ trans('entities.export_text') }}</span><span>.txt</span></a></li>
+        <li><a href="{{ $entity->getUrl('/export/markdown') }}" target="_blank" class="label-item"><span>{{ trans('entities.export_md') }}</span><span>.md</span></a></li>
     </ul>
 </div>
index bf90873975c7b89e483a82210ea67c263b20a79c..f81ed797f652f940a28cef225357ad751e3360a1 100644 (file)
@@ -16,7 +16,7 @@
                 <div refs="dropdown@toggle" aria-haspopup="true" aria-expanded="false" aria-label="{{ trans('common.sort_options') }}" tabindex="0">{{ $options[$selectedSort] }}</div>
                 <ul refs="dropdown@menu" class="dropdown-menu">
                     @foreach($options as $key => $label)
-                        <li @if($key === $selectedSort) class="active" @endif><a href="#" data-sort-value="{{$key}}">{{ $label }}</a></li>
+                        <li @if($key === $selectedSort) class="active" @endif><a href="#" data-sort-value="{{$key}}" class="text-item">{{ $label }}</a></li>
                     @endforeach
                 </ul>
             </div>
index f6a337e5054d4bd7b978fc08c626253270d278ed..6435e4ebdc0f760801fa8c9dd6ded8bedf58f681 100644 (file)
         </div>
     </div>
 
+    <script nonce="{{ $cspNonce }}">
+        setTimeout(async () => {
+            const result = await window.components["confirm-dialog"][0].show();
+            console.log({result});
+        }, 1000);
+    </script>
+
     <div class="container" id="home-default">
         <div class="grid third gap-xxl no-row-gap" >
             <div>
index e195174c1b40c486706b4e062a183ab778e438ff..271ec1bf48d5c35762f76bdff8c643f91fce6afa 100644 (file)
@@ -19,7 +19,7 @@
                     <form action="{{ url('/mfa/' . $method . '/remove') }}" method="post">
                         {{ csrf_field() }}
                         {{ method_field('delete') }}
-                        <button class="text-primary small delete">{{ trans('common.confirm') }}</button>
+                        <button class="text-primary small text-item">{{ trans('common.confirm') }}</button>
                     </form>
                 </div>
             </div>
index 30158e852afdb3f368ce9202991c06c64eedb7e5..cd9635758060fe77f58a99427138d81075ca9749 100644 (file)
@@ -1,9 +1,5 @@
 @extends('layouts.base')
 
-@section('head')
-    <script src="{{ url('/libs/tinymce/tinymce.min.js?ver=5.10.2') }}" nonce="{{ $cspNonce }}"></script>
-@stop
-
 @section('body-class', 'flexbox')
 
 @section('content')
@@ -12,9 +8,7 @@
         <form action="{{ $page->getUrl() }}" autocomplete="off" data-page-id="{{ $page->id }}" method="POST" class="flex flex-fill">
             {{ csrf_field() }}
 
-            @if(!isset($isDraft))
-                <input type="hidden" name="_method" value="PUT">
-            @endif
+            @if(!$isDraft) {{ method_field('PUT') }} @endif
             @include('pages.parts.form', ['model' => $page])
             @include('pages.parts.editor-toolbox')
         </form>
diff --git a/resources/views/pages/parts/editor-toolbar.blade.php b/resources/views/pages/parts/editor-toolbar.blade.php
new file mode 100644 (file)
index 0000000..4846f4b
--- /dev/null
@@ -0,0 +1,86 @@
+<div class="primary-background-light toolbar page-edit-toolbar">
+    <div class="grid third no-break v-center">
+
+        <div class="action-buttons text-left px-m py-xs">
+            <a href="{{ $isDraft ? $page->getParent()->getUrl() : $page->getUrl() }}"
+               class="text-button text-primary">@icon('back')<span class="hide-under-l">{{ trans('common.back') }}</span></a>
+        </div>
+
+        <div class="text-center px-m">
+            <div component="dropdown"
+                 option:dropdown:move-menu="true"
+                 class="dropdown-container draft-display text {{ $draftsEnabled ? '' : 'hidden' }}">
+                <button type="button" refs="dropdown@toggle" aria-haspopup="true" aria-expanded="false" title="{{ trans('entities.pages_edit_draft_options') }}" class="text-primary text-button py-s px-m"><span refs="page-editor@draftDisplay" class="faded-text"></span>&nbsp; @icon('more')</button>
+                @icon('check-circle', ['class' => 'text-pos draft-notification svg-icon', 'refs' => 'page-editor@draftDisplayIcon'])
+                <ul refs="dropdown@menu" class="dropdown-menu" role="menu">
+                    <li>
+                        <button refs="page-editor@saveDraft" type="button" class="text-pos icon-item">
+                            @icon('save')
+                            <div>{{ trans('entities.pages_edit_save_draft') }}</div>
+                        </button>
+                    </li>
+                    @if($isDraft)
+                        <li>
+                            <a href="{{ $model->getUrl('/delete') }}" class="text-neg icon-item">
+                                @icon('delete')
+                                {{ trans('entities.pages_edit_delete_draft') }}
+                            </a>
+                        </li>
+                    @endif
+                    <li refs="page-editor@discardDraftWrap" class="{{ $isDraftRevision ? '' : 'hidden' }}">
+                        <button refs="page-editor@discardDraft" type="button" class="text-neg icon-item">
+                            @icon('cancel')
+                            <div>{{ trans('entities.pages_edit_discard_draft') }}</div>
+                        </button>
+                    </li>
+                    @if(userCan('editor-change'))
+                        <li>
+                            @if($editor === 'wysiwyg')
+                                <a href="{{ $model->getUrl($isDraft ? '' : '/edit') }}?editor=markdown-clean" refs="page-editor@changeEditor" class="icon-item">
+                                    @icon('swap-horizontal')
+                                    <div>
+                                        {{ trans('entities.pages_edit_switch_to_markdown') }}
+                                        <br>
+                                        <small>{{ trans('entities.pages_edit_switch_to_markdown_clean') }}</small>
+                                    </div>
+                                </a>
+                                <a href="{{ $model->getUrl($isDraft ? '' : '/edit') }}?editor=markdown-stable" refs="page-editor@changeEditor" class="icon-item">
+                                    @icon('swap-horizontal')
+                                    <div>
+                                        {{ trans('entities.pages_edit_switch_to_markdown') }}
+                                        <br>
+                                        <small>{{ trans('entities.pages_edit_switch_to_markdown_stable') }}</small>
+                                    </div>
+                                </a>
+                            @else
+                                <a href="{{ $model->getUrl($isDraft ? '' : '/edit') }}?editor=wysiwyg" refs="page-editor@changeEditor" class="icon-item">
+                                    @icon('swap-horizontal')
+                                    <div>{{ trans('entities.pages_edit_switch_to_wysiwyg') }}</div>
+                                </a>
+                            @endif
+                        </li>
+                    @endif
+                </ul>
+            </div>
+        </div>
+
+        <div class="action-buttons px-m py-xs">
+            <div component="dropdown" dropdown-move-menu class="dropdown-container">
+                <button refs="dropdown@toggle" type="button" aria-haspopup="true" aria-expanded="false" class="text-primary text-button">@icon('edit') <span refs="page-editor@changelogDisplay">{{ trans('entities.pages_edit_set_changelog') }}</span></button>
+                <ul refs="dropdown@menu" class="wide dropdown-menu">
+                    <li class="px-l py-m">
+                        <p class="text-muted pb-s">{{ trans('entities.pages_edit_enter_changelog_desc') }}</p>
+                        <input refs="page-editor@changelogInput"
+                               name="summary"
+                               id="summary-input"
+                               type="text"
+                               placeholder="{{ trans('entities.pages_edit_enter_changelog') }}" />
+                    </li>
+                </ul>
+                <span>{{-- Prevents button jumping on menu show --}}</span>
+            </div>
+
+            <button type="submit" id="save-button" class="float-left text-primary text-button text-pos-hover hide-under-m">@icon('save')<span>{{ trans('entities.pages_save') }}</span></button>
+        </div>
+    </div>
+</div>
\ No newline at end of file
index 01f68a6c5cf0dfa5ab18e9c6fbbc0c4c5451e3a1..8da5cbf39887af42f3ca1a172e411bfdf2c4b95b 100644 (file)
@@ -1,71 +1,22 @@
 <div component="page-editor" class="page-editor flex-fill flex"
      option:page-editor:drafts-enabled="{{ $draftsEnabled ? 'true' : 'false' }}"
      @if(config('services.drawio'))
-        drawio-url="{{ is_string(config('services.drawio')) ? config('services.drawio') : 'https://embed.diagrams.net/?embed=1&proto=json&spin=1' }}"
+        drawio-url="{{ is_string(config('services.drawio')) ? config('services.drawio') : 'https://embed.diagrams.net/?embed=1&proto=json&spin=1&configure=1' }}"
      @endif
      @if($model->name === trans('entities.pages_initial_name'))
         option:page-editor:has-default-title="true"
      @endif
-     option:page-editor:editor-type="{{ setting('app-editor') }}"
+     option:page-editor:editor-type="{{ $editor }}"
      option:page-editor:page-id="{{ $model->id ?? '0' }}"
-     option:page-editor:page-new-draft="{{ ($model->draft ?? false) ? 'true' : 'false' }}"
-     option:page-editor:draft-text="{{ ($model->draft || $model->isDraft) ? trans('entities.pages_editing_draft') : trans('entities.pages_editing_page') }}"
+     option:page-editor:page-new-draft="{{ $isDraft ? 'true' : 'false' }}"
+     option:page-editor:draft-text="{{ ($isDraft || $isDraftRevision) ? trans('entities.pages_editing_draft') : trans('entities.pages_editing_page') }}"
      option:page-editor:autosave-fail-text="{{ trans('errors.page_draft_autosave_fail') }}"
      option:page-editor:editing-page-text="{{ trans('entities.pages_editing_page') }}"
      option:page-editor:draft-discarded-text="{{ trans('entities.pages_draft_discarded') }}"
      option:page-editor:set-changelog-text="{{ trans('entities.pages_edit_set_changelog') }}">
 
-    {{--Header Bar--}}
-    <div class="primary-background-light toolbar page-edit-toolbar">
-        <div class="grid third no-break v-center">
-
-            <div class="action-buttons text-left px-m py-xs">
-                <a href="{{ $page->draft ? $page->getParent()->getUrl() : $page->getUrl() }}"
-                   class="text-button text-primary">@icon('back')<span class="hide-under-l">{{ trans('common.back') }}</span></a>
-            </div>
-
-            <div class="text-center px-m py-xs">
-                <div component="dropdown"
-                     option:dropdown:move-menu="true"
-                     class="dropdown-container draft-display text {{ $draftsEnabled ? '' : 'hidden' }}">
-                    <button type="button" refs="dropdown@toggle" aria-haspopup="true" aria-expanded="false" title="{{ trans('entities.pages_edit_draft_options') }}" class="text-primary text-button"><span refs="page-editor@draftDisplay" class="faded-text"></span>&nbsp; @icon('more')</button>
-                    @icon('check-circle', ['class' => 'text-pos draft-notification svg-icon', 'refs' => 'page-editor@draftDisplayIcon'])
-                    <ul refs="dropdown@menu" class="dropdown-menu" role="menu">
-                        <li>
-                            <button refs="page-editor@saveDraft" type="button" class="text-pos">@icon('save'){{ trans('entities.pages_edit_save_draft') }}</button>
-                        </li>
-                        @if ($model->draft)
-                        <li>
-                            <a href="{{ $model->getUrl('/delete') }}" class="text-neg">@icon('delete'){{ trans('entities.pages_edit_delete_draft') }}</a>
-                        </li>
-                        @endif
-                        <li refs="page-editor@discardDraftWrap" class="{{ ($model->isDraft ?? false) ? '' : 'hidden' }}">
-                            <button refs="page-editor@discardDraft" type="button" class="text-neg">@icon('cancel'){{ trans('entities.pages_edit_discard_draft') }}</button>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-
-            <div class="action-buttons px-m py-xs">
-                <div component="dropdown" dropdown-move-menu class="dropdown-container">
-                    <button refs="dropdown@toggle" type="button" aria-haspopup="true" aria-expanded="false" class="text-primary text-button">@icon('edit') <span refs="page-editor@changelogDisplay">{{ trans('entities.pages_edit_set_changelog') }}</span></button>
-                    <ul refs="dropdown@menu" class="wide dropdown-menu">
-                        <li class="px-l py-m">
-                            <p class="text-muted pb-s">{{ trans('entities.pages_edit_enter_changelog_desc') }}</p>
-                            <input refs="page-editor@changelogInput"
-                                   name="summary"
-                                   id="summary-input"
-                                   type="text"
-                                   placeholder="{{ trans('entities.pages_edit_enter_changelog') }}" />
-                        </li>
-                    </ul>
-                    <span>{{-- Prevents button jumping on menu show --}}</span>
-                </div>
-
-                <button type="submit" id="save-button" class="float-left text-primary text-button text-pos-hover hide-under-m">@icon('save')<span>{{ trans('entities.pages_save') }}</span></button>
-            </div>
-        </div>
-    </div>
+    {{--Header Toolbar--}}
+    @include('pages.parts.editor-toolbar', ['model' => $model, 'editor' => $editor, 'isDraft' => $isDraft, 'draftsEnabled' => $draftsEnabled])
 
     {{--Title input--}}
     <div class="title-input page-title clearfix">
     <div class="edit-area flex-fill flex">
 
         {{--WYSIWYG Editor--}}
-        @if(setting('app-editor') === 'wysiwyg')
+        @if($editor === 'wysiwyg')
             @include('pages.parts.wysiwyg-editor', ['model' => $model])
         @endif
 
         {{--Markdown Editor--}}
-        @if(setting('app-editor') === 'markdown')
+        @if($editor === 'markdown')
             @include('pages.parts.markdown-editor', ['model' => $model])
         @endif
 
     </div>
 
+    {{--Mobile Save Button--}}
     <button type="submit"
             id="save-button-mobile"
             title="{{ trans('entities.pages_save') }}"
             class="text-primary text-button hide-over-m page-save-mobile-button">@icon('save')</button>
+
+    {{--Editor Change Dialog--}}
+    @component('common.confirm-dialog', ['title' => trans('entities.pages_editor_switch_title'), 'ref' => 'page-editor@switchDialog'])
+        <p>
+            {{ trans('entities.pages_editor_switch_are_you_sure') }}
+            <br>
+            {{ trans('entities.pages_editor_switch_consider_following') }}
+        </p>
+
+        <ul>
+            <li>{{ trans('entities.pages_editor_switch_consideration_a') }}</li>
+            <li>{{ trans('entities.pages_editor_switch_consideration_b') }}</li>
+            <li>{{ trans('entities.pages_editor_switch_consideration_c') }}</li>
+        </ul>
+    @endcomponent
 </div>
\ No newline at end of file
index 29a4b6532b596f32e3e44606d934bd4ec49e377a..d8ca7493980ec1438839effd8981d7d08fdd6173 100644 (file)
@@ -1,3 +1,7 @@
+@push('head')
+    <script src="{{ url('/libs/tinymce/tinymce.min.js?ver=5.10.2') }}" nonce="{{ $cspNonce }}"></script>
+@endpush
+
 <div component="wysiwyg-editor"
      option:wysiwyg-editor:language="{{ config('app.lang') }}"
      option:wysiwyg-editor:page-id="{{ $model->id ?? 0 }}"
index 5508f362d3fab131afd4b70e4370394c974361ec..fb9e891bbcf8c34f918cc2a03cc1621fb655ce3c 100644 (file)
 
                 <table class="table">
                     <tr>
-                        <th width="3%">{{ trans('entities.pages_revisions_number') }}</th>
-                        <th width="23%">{{ trans('entities.pages_name') }}</th>
-                        <th colspan="2" width="8%">{{ trans('entities.pages_revisions_created_by') }}</th>
-                        <th width="15%">{{ trans('entities.pages_revisions_date') }}</th>
-                        <th width="25%">{{ trans('entities.pages_revisions_changelog') }}</th>
-                        <th width="20%">{{ trans('common.actions') }}</th>
+                        <th width="40">{{ trans('entities.pages_revisions_number') }}</th>
+                        <th>
+                            {{ trans('entities.pages_name') }} / {{ trans('entities.pages_revisions_editor') }}
+                        </th>
+                        <th colspan="2">{{ trans('entities.pages_revisions_created_by') }} / {{ trans('entities.pages_revisions_date') }}</th>
+                        <th>{{ trans('entities.pages_revisions_changelog') }}</th>
+                        <th class="text-right">{{ trans('common.actions') }}</th>
                     </tr>
                     @foreach($page->revisions as $index => $revision)
                         <tr>
                             <td>{{ $revision->revision_number == 0 ? '' : $revision->revision_number }}</td>
-                            <td>{{ $revision->name }}</td>
-                            <td style="line-height: 0;">
+                            <td>
+                                {{ $revision->name }}
+                                <br>
+                                <small class="text-muted">({{ $revision->markdown ? 'Markdown' : 'WYSIWYG' }})</small>
+                            </td>
+                            <td style="line-height: 0;" width="30">
                                 @if($revision->createdBy)
                                     <img class="avatar" src="{{ $revision->createdBy->getAvatar(30) }}" alt="{{ $revision->createdBy->name }}">
                                 @endif
                             </td>
-                            <td> @if($revision->createdBy) {{ $revision->createdBy->name }} @else {{ trans('common.deleted_user') }} @endif</td>
-                            <td><small>{{ $revision->created_at->formatLocalized('%e %B %Y %H:%M:%S') }} <br> ({{ $revision->created_at->diffForHumans() }})</small></td>
-                            <td>{{ $revision->summary }}</td>
-                            <td class="actions">
+                            <td width="260">
+                                @if($revision->createdBy) {{ $revision->createdBy->name }} @else {{ trans('common.deleted_user') }} @endif
+                                    <br>
+                                <div class="text-muted">
+                                    <small>{{ $revision->created_at->formatLocalized('%e %B %Y %H:%M:%S') }}</small>
+                                    <small>({{ $revision->created_at->diffForHumans() }})</small>
+                                </div>
+                            </td>
+                            <td>
+                                {{ $revision->summary }}
+                            </td>
+                            <td class="actions text-small text-right">
                                 <a href="{{ $revision->getUrl('changes') }}" target="_blank" rel="noopener">{{ trans('entities.pages_revisions_changes') }}</a>
                                 <span class="text-muted">&nbsp;|&nbsp;</span>
 
                                                 <form action="{{ $revision->getUrl('/restore') }}" method="POST">
                                                     {!! csrf_field() !!}
                                                     <input type="hidden" name="_method" value="PUT">
-                                                    <button type="submit" class="text-button text-primary">@icon('history'){{ trans('entities.pages_revisions_restore') }}</button>
+                                                    <button type="submit" class="text-primary icon-item">
+                                                        @icon('history')
+                                                        <div>{{ trans('entities.pages_revisions_restore') }}</div>
+                                                    </button>
                                                 </form>
                                             </li>
                                         </ul>
                                                 <form action="{{ $revision->getUrl('/delete/') }}" method="POST">
                                                     {!! csrf_field() !!}
                                                     <input type="hidden" name="_method" value="DELETE">
-                                                    <button type="submit" class="text-button text-neg">@icon('delete'){{ trans('common.delete') }}</button>
+                                                    <button type="submit" class="text-neg icon-item">
+                                                        @icon('delete')
+                                                        <div>{{ trans('common.delete') }}</div>
+                                                    </button>
                                                 </form>
                                             </li>
                                         </ul>
index ca5dba527cb46cfe89ff191aa4d3148e122e7477..506a735a2c59552825334a2d4729bbc73831fb4d 100644 (file)
@@ -14,9 +14,9 @@
                 <label for="">{{ trans('settings.audit_event_filter') }}</label>
                 <button refs="dropdown@toggle" aria-haspopup="true" aria-expanded="false" aria-label="{{ trans('common.sort_options') }}" class="input-base text-left">{{ $listDetails['event'] ?: trans('settings.audit_event_filter_no_filter') }}</button>
                 <ul refs="dropdown@menu" class="dropdown-menu">
-                    <li @if($listDetails['event'] === '') class="active" @endif><a href="{{ sortUrl('/settings/audit', $listDetails, ['event' => '']) }}">{{ trans('settings.audit_event_filter_no_filter') }}</a></li>
+                    <li @if($listDetails['event'] === '') class="active" @endif><a href="{{ sortUrl('/settings/audit', $listDetails, ['event' => '']) }}" class="text-item">{{ trans('settings.audit_event_filter_no_filter') }}</a></li>
                     @foreach($activityTypes as $type)
-                        <li @if($type === $listDetails['event']) class="active" @endif><a href="{{ sortUrl('/settings/audit', $listDetails, ['event' => $type]) }}">{{ $type }}</a></li>
+                        <li @if($type === $listDetails['event']) class="active" @endif><a href="{{ sortUrl('/settings/audit', $listDetails, ['event' => $type]) }}" class="text-item">{{ $type }}</a></li>
                     @endforeach
                 </ul>
             </div>
index 2bc3531d75c762ecb2c5c882d6c396348349b0a0..b7be95b4a1519ac53da4b746c942300627b308a3 100644 (file)
                 </div>
             </div>
 
-            <div class="grid half gap-xl">
+            <div class="grid half gap-xl items-center">
                 <div>
-                    <label class="setting-list-label">{{ trans('settings.app_editor') }}</label>
-                    <p class="small">{{ trans('settings.app_editor_desc') }}</p>
+                    <label class="setting-list-label" for="setting-app-editor">{{ trans('settings.app_default_editor') }}</label>
+                    <p class="small">{{ trans('settings.app_default_editor_desc') }}</p>
                 </div>
-                <div class="pt-xs">
+                <div>
                     <select name="setting-app-editor" id="setting-app-editor">
                         <option @if(setting('app-editor') === 'wysiwyg') selected @endif value="wysiwyg">WYSIWYG</option>
                         <option @if(setting('app-editor') === 'markdown') selected @endif value="markdown">Markdown</option>
                 </div>
             </div>
 
-            <div homepage-control id="homepage-control" class="grid half gap-xl">
+            <div homepage-control id="homepage-control" class="grid half gap-xl items-center">
                 <div>
-                    <label for="setting-app-homepage" class="setting-list-label">{{ trans('settings.app_homepage') }}</label>
+                    <label for="setting-app-homepage-type" class="setting-list-label">{{ trans('settings.app_homepage') }}</label>
                     <p class="small">{{ trans('settings.app_homepage_desc') }}</p>
                 </div>
-                <div class="pt-xs">
+                <div>
                     <select name="setting-app-homepage-type" id="setting-app-homepage-type">
                         <option @if(setting('app-homepage-type') === 'default') selected @endif value="default">{{ trans('common.default') }}</option>
                         <option @if(setting('app-homepage-type') === 'books') selected @endif value="books">{{ trans('entities.books') }}</option>
index 5f2ec333fce479ee1e2dfcb660e0db79eb06e3b8..56e2437fe0d88987776cc8d84edcbc41553ac92c 100644 (file)
@@ -22,7 +22,7 @@
 
                             <form action="{{ url('/settings/recycle-bin/empty') }}" method="POST">
                                 {!! csrf_field() !!}
-                                <button type="submit" class="text-primary small delete">{{ trans('common.confirm') }}</button>
+                                <button type="submit" class="text-primary small delete text-item">{{ trans('common.confirm') }}</button>
                             </form>
                         </div>
                     </div>
@@ -93,8 +93,8 @@
                         <div component="dropdown" class="dropdown-container">
                             <button type="button" refs="dropdown@toggle" class="button outline">{{ trans('common.actions') }}</button>
                             <ul refs="dropdown@menu" class="dropdown-menu">
-                                <li><a class="block" href="{{ $deletion->getUrl('/restore') }}">{{ trans('settings.recycle_bin_restore') }}</a></li>
-                                <li><a class="block" href="{{ $deletion->getUrl('/destroy') }}">{{ trans('settings.recycle_bin_permanently_delete') }}</a></li>
+                                <li><a class="text-item" href="{{ $deletion->getUrl('/restore') }}">{{ trans('settings.recycle_bin_restore') }}</a></li>
+                                <li><a class="text-item" href="{{ $deletion->getUrl('/destroy') }}">{{ trans('settings.recycle_bin_permanently_delete') }}</a></li>
                             </ul>
                         </div>
                     </td>
index a15117e5e8df0336ddb2d6eb658117a86d9c2bb3..aeaa39a6da7b5ea8cdfa574cd3e1899d98e823a8 100644 (file)
@@ -37,6 +37,7 @@
                 <div>@include('settings.roles.parts.checkbox', ['permission' => 'templates-manage', 'label' => trans('settings.role_manage_page_templates')])</div>
                 <div>@include('settings.roles.parts.checkbox', ['permission' => 'access-api', 'label' => trans('settings.role_access_api')])</div>
                 <div>@include('settings.roles.parts.checkbox', ['permission' => 'content-export', 'label' => trans('settings.role_export_content')])</div>
+                <div>@include('settings.roles.parts.checkbox', ['permission' => 'editor-change', 'label' => trans('settings.role_editor_change')])</div>
             </div>
             <div>
                 <div>@include('settings.roles.parts.checkbox', ['permission' => 'settings-manage', 'label' => trans('settings.role_manage_settings')])</div>
index a87169ee51b805144f2bbfdda85dc9ba5e1b827b..20e167d70934c0d35104014986780a4c2160a510 100644 (file)
@@ -9,6 +9,7 @@ use BookStack\Http\Controllers\Api\ChapterApiController;
 use BookStack\Http\Controllers\Api\ChapterExportApiController;
 use BookStack\Http\Controllers\Api\PageApiController;
 use BookStack\Http\Controllers\Api\PageExportApiController;
+use BookStack\Http\Controllers\Api\RecycleBinApiController;
 use BookStack\Http\Controllers\Api\SearchApiController;
 use BookStack\Http\Controllers\Api\UserApiController;
 use Illuminate\Support\Facades\Route;
@@ -72,3 +73,7 @@ Route::post('users', [UserApiController::class, 'create']);
 Route::get('users/{id}', [UserApiController::class, 'read']);
 Route::put('users/{id}', [UserApiController::class, 'update']);
 Route::delete('users/{id}', [UserApiController::class, 'delete']);
+
+Route::get('recycle-bin', [RecycleBinApiController::class, 'list']);
+Route::put('recycle-bin/{deletionId}', [RecycleBinApiController::class, 'restore']);
+Route::delete('recycle-bin/{deletionId}', [RecycleBinApiController::class, 'destroy']);
index d7625c93823b9cc00f35b314ce69a788c022d046..a343370161616503938bf566cb02ee60e0474553 100644 (file)
@@ -5,6 +5,7 @@ namespace Tests\Api;
 use BookStack\Entities\Models\Page;
 use BookStack\Uploads\Attachment;
 use Illuminate\Http\UploadedFile;
+use Illuminate\Testing\AssertableJsonString;
 use Tests\TestCase;
 
 class AttachmentsApiTest extends TestCase
@@ -228,9 +229,11 @@ class AttachmentsApiTest extends TestCase
         $attachment = Attachment::query()->orderByDesc('id')->where('name', '=', $details['name'])->firstOrFail();
 
         $resp = $this->getJson("{$this->baseEndpoint}/{$attachment->id}");
-
         $resp->assertStatus(200);
-        $resp->assertJson([
+        $resp->assertHeader('Content-Type', 'application/json');
+
+        $json = new AssertableJsonString($resp->streamedContent());
+        $json->assertSubset([
             'id'          => $attachment->id,
             'content'     => base64_encode(file_get_contents(storage_path($attachment->path))),
             'external'    => false,
index 9625c9f2db840c17f017f9e309334f24aa3ee63f..9fe8f8215bc6f201d26d669a360e28135228953a 100644 (file)
@@ -110,7 +110,7 @@ class BooksApiTest extends TestCase
         DB::table('books')->where('id', '=', $book->id)->update(['updated_at' => Carbon::now()->subWeek()]);
 
         $details = [
-            'tags' => [['name' => 'Category', 'value' => 'Testing']]
+            'tags' => [['name' => 'Category', 'value' => 'Testing']],
         ];
 
         $this->putJson($this->baseEndpoint . "/{$book->id}", $details);
index 6f00f9eade1c8596c8719be837f38eed0f0bcac0..8d31500ebc19ce3360cddfd7d823eab03fe4cab4 100644 (file)
@@ -156,7 +156,7 @@ class ChaptersApiTest extends TestCase
         DB::table('chapters')->where('id', '=', $chapter->id)->update(['updated_at' => Carbon::now()->subWeek()]);
 
         $details = [
-            'tags' => [['name' => 'Category', 'value' => 'Testing']]
+            'tags' => [['name' => 'Category', 'value' => 'Testing']],
         ];
 
         $this->putJson($this->baseEndpoint . "/{$chapter->id}", $details);
index b91d96d892c74402e9ac79990bbcdcad663d56f0..539a7da4e25087c6e1cf8c59e7421135ce81bf9a 100644 (file)
@@ -249,10 +249,12 @@ class PagesApiTest extends TestCase
         DB::table('pages')->where('id', '=', $page->id)->update(['updated_at' => Carbon::now()->subWeek()]);
 
         $details = [
-            'tags' => [['name' => 'Category', 'value' => 'Testing']]
+            'tags' => [['name' => 'Category', 'value' => 'Testing']],
         ];
 
-        $this->putJson($this->baseEndpoint . "/{$page->id}", $details);
+        $resp = $this->putJson($this->baseEndpoint . "/{$page->id}", $details);
+        $resp->assertOk();
+
         $page->refresh();
         $this->assertGreaterThan(Carbon::now()->subDay()->unix(), $page->updated_at->unix());
     }
diff --git a/tests/Api/RecycleBinApiTest.php b/tests/Api/RecycleBinApiTest.php
new file mode 100644 (file)
index 0000000..83cd824
--- /dev/null
@@ -0,0 +1,184 @@
+<?php
+
+namespace Tests\Api;
+
+use BookStack\Entities\Models\Book;
+use BookStack\Entities\Models\Deletion;
+use BookStack\Entities\Models\Page;
+use Illuminate\Support\Collection;
+use Tests\TestCase;
+
+class RecycleBinApiTest extends TestCase
+{
+    use TestsApi;
+
+    protected string $baseEndpoint = '/api/recycle-bin';
+
+    protected array $endpointMap = [
+        ['get', '/api/recycle-bin'],
+        ['put', '/api/recycle-bin/1'],
+        ['delete', '/api/recycle-bin/1'],
+    ];
+
+    public function test_settings_manage_permission_needed_for_all_endpoints()
+    {
+        $editor = $this->getEditor();
+        $this->giveUserPermissions($editor, ['settings-manage']);
+        $this->actingAs($editor);
+
+        foreach ($this->endpointMap as [$method, $uri]) {
+            $resp = $this->json($method, $uri);
+            $resp->assertStatus(403);
+            $resp->assertJson($this->permissionErrorResponse());
+        }
+    }
+
+    public function test_restrictions_manage_all_permission_needed_for_all_endpoints()
+    {
+        $editor = $this->getEditor();
+        $this->giveUserPermissions($editor, ['restrictions-manage-all']);
+        $this->actingAs($editor);
+
+        foreach ($this->endpointMap as [$method, $uri]) {
+            $resp = $this->json($method, $uri);
+            $resp->assertStatus(403);
+            $resp->assertJson($this->permissionErrorResponse());
+        }
+    }
+
+    public function test_index_endpoint_returns_expected_page()
+    {
+        $admin = $this->getAdmin();
+
+        $page = Page::query()->first();
+        $book = Book::query()->first();
+        $this->actingAs($admin)->delete($page->getUrl());
+        $this->delete($book->getUrl());
+
+        $deletions = Deletion::query()->orderBy('id')->get();
+
+        $resp = $this->getJson($this->baseEndpoint);
+
+        $expectedData = $deletions
+            ->zip([$page, $book])
+            ->map(function (Collection $data) use ($admin) {
+                return [
+                    'id'                => $data[0]->id,
+                    'deleted_by'        => $admin->id,
+                    'created_at'        => $data[0]->created_at->toJson(),
+                    'updated_at'        => $data[0]->updated_at->toJson(),
+                    'deletable_type'    => $data[1]->getMorphClass(),
+                    'deletable_id'      => $data[1]->id,
+                    'deletable'         => [
+                        'name' => $data[1]->name,
+                    ],
+                ];
+            });
+
+        $resp->assertJson([
+            'data'  => $expectedData->values()->all(),
+            'total' => 2,
+        ]);
+    }
+
+    public function test_index_endpoint_returns_children_count()
+    {
+        $admin = $this->getAdmin();
+
+        $book = Book::query()->whereHas('pages')->whereHas('chapters')->withCount(['pages', 'chapters'])->first();
+        $this->actingAs($admin)->delete($book->getUrl());
+
+        $deletion = Deletion::query()->orderBy('id')->first();
+
+        $resp = $this->getJson($this->baseEndpoint);
+
+        $expectedData = [
+            [
+                'id'             => $deletion->id,
+                'deletable'      => [
+                    'pages_count'    => $book->pages_count,
+                    'chapters_count' => $book->chapters_count,
+                ],
+            ],
+        ];
+
+        $resp->assertJson([
+            'data'  => $expectedData,
+            'total' => 1,
+        ]);
+    }
+
+    public function test_index_endpoint_returns_parent()
+    {
+        $admin = $this->getAdmin();
+        $page = Page::query()->whereHas('chapter')->with('chapter')->first();
+
+        $this->actingAs($admin)->delete($page->getUrl());
+        $deletion = Deletion::query()->orderBy('id')->first();
+
+        $resp = $this->getJson($this->baseEndpoint);
+
+        $expectedData = [
+            [
+                'id'             => $deletion->id,
+                'deletable'      => [
+                    'parent' => [
+                        'id'   => $page->chapter->id,
+                        'name' => $page->chapter->name,
+                        'type' => 'chapter',
+                    ],
+                ],
+            ],
+        ];
+
+        $resp->assertJson([
+            'data'  => $expectedData,
+            'total' => 1,
+        ]);
+    }
+
+    public function test_restore_endpoint()
+    {
+        $page = Page::query()->first();
+        $this->asAdmin()->delete($page->getUrl());
+        $page->refresh();
+
+        $deletion = Deletion::query()->orderBy('id')->first();
+
+        $this->assertDatabaseHas('pages', [
+            'id'            => $page->id,
+            'deleted_at'    => $page->deleted_at,
+        ]);
+
+        $resp = $this->putJson($this->baseEndpoint . '/' . $deletion->id);
+        $resp->assertJson([
+            'restore_count' => 1,
+        ]);
+
+        $this->assertDatabaseHas('pages', [
+            'id'            => $page->id,
+            'deleted_at'    => null,
+        ]);
+    }
+
+    public function test_destroy_endpoint()
+    {
+        $page = Page::query()->first();
+        $this->asAdmin()->delete($page->getUrl());
+        $page->refresh();
+
+        $deletion = Deletion::query()->orderBy('id')->first();
+
+        $this->assertDatabaseHas('pages', [
+            'id'            => $page->id,
+            'deleted_at'    => $page->deleted_at,
+        ]);
+
+        $resp = $this->deleteJson($this->baseEndpoint . '/' . $deletion->id);
+        $resp->assertJson([
+            'delete_count' => 1,
+        ]);
+
+        $this->assertDatabaseMissing('pages', ['id' => $page->id]);
+    }
+}
index 5953b0c0dc5bad57a0e1c52cb9e8a429dc2ca31e..034d4bc289eddf62194c75618c4e2f46323af201 100644 (file)
@@ -120,7 +120,7 @@ class ShelvesApiTest extends TestCase
         DB::table('bookshelves')->where('id', '=', $shelf->id)->update(['updated_at' => Carbon::now()->subWeek()]);
 
         $details = [
-            'tags' => [['name' => 'Category', 'value' => 'Testing']]
+            'tags' => [['name' => 'Category', 'value' => 'Testing']],
         ];
 
         $this->putJson($this->baseEndpoint . "/{$shelf->id}", $details);
index 141f072f8f27b3ff5bb695f9110adb2bf23d19bd..08d0921111fdb88a908867af8f228a9c1280e175 100644 (file)
@@ -362,42 +362,6 @@ class ExportTest extends TestCase
         $resp->assertSee("# Dogcat\n\nSome **bold** text");
     }
 
-    public function test_page_markdown_export_does_not_convert_callouts()
-    {
-        $page = Page::query()->first()->forceFill([
-            'markdown' => '',
-            'html'     => '<h1>Dogcat</h1><p class="callout info">Some callout text</p><p>Another line</p>',
-        ]);
-        $page->save();
-
-        $resp = $this->asEditor()->get($page->getUrl('/export/markdown'));
-        $resp->assertSee("# Dogcat\n\n<p class=\"callout info\">Some callout text</p>\n\nAnother line", false);
-    }
-
-    public function test_page_markdown_export_handles_bookstacks_wysiwyg_codeblock_format()
-    {
-        $page = Page::query()->first()->forceFill([
-            'markdown' => '',
-            'html'     => '<h1>Dogcat</h1>' . "\r\n" . '<pre id="bkmrk-var-a-%3D-%27cat%27%3B"><code class="language-JavaScript">var a = \'cat\';</code></pre><p>Another line</p>',
-        ]);
-        $page->save();
-
-        $resp = $this->asEditor()->get($page->getUrl('/export/markdown'));
-        $resp->assertSee("# Dogcat\n\n```JavaScript\nvar a = 'cat';\n```\n\nAnother line", false);
-    }
-
-    public function test_page_markdown_export_handles_tasklist_checkboxes()
-    {
-        $page = Page::query()->first()->forceFill([
-            'markdown' => '',
-            'html'     => '<ul><li><input type="checkbox" checked="checked">Item A</li><li><input type="checkbox">Item B</li></ul>',
-        ]);
-        $page->save();
-
-        $resp = $this->asEditor()->get($page->getUrl('/export/markdown'));
-        $resp->assertSee("- [x] Item A\n- [ ] Item B", false);
-    }
-
     public function test_chapter_markdown_export()
     {
         $chapter = Chapter::query()->first();
diff --git a/tests/Entity/MarkdownToHtmlTest.php b/tests/Entity/MarkdownToHtmlTest.php
new file mode 100644 (file)
index 0000000..158103c
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+
+namespace Tests\Entity;
+
+use BookStack\Entities\Tools\Markdown\HtmlToMarkdown;
+use Tests\TestCase;
+
+class MarkdownToHtmlTest extends TestCase
+{
+    public function test_basic_formatting_conversion()
+    {
+        $this->assertConversion(
+            '<h1>Dogcat</h1><p>Some <strong>bold</strong> text</p>',
+            "# Dogcat\n\nSome **bold** text"
+        );
+    }
+
+    public function test_callouts_remain_html()
+    {
+        $this->assertConversion(
+            '<h1>Dogcat</h1><p class="callout info">Some callout text</p><p>Another line</p>',
+            "# Dogcat\n\n<p class=\"callout info\">Some callout text</p>\n\nAnother line"
+        );
+    }
+
+    public function test_wysiwyg_code_format_handled_cleanly()
+    {
+        $this->assertConversion(
+            '<h1>Dogcat</h1>' . "\r\n" . '<pre id="bkmrk-var-a-%3D-%27cat%27%3B"><code class="language-JavaScript">var a = \'cat\';</code></pre><p>Another line</p>',
+            "# Dogcat\n\n```JavaScript\nvar a = 'cat';\n```\n\nAnother line"
+        );
+    }
+
+    public function test_tasklist_checkboxes_are_handled()
+    {
+        $this->assertConversion(
+            '<ul><li><input type="checkbox" checked="checked">Item A</li><li><input type="checkbox">Item B</li></ul>',
+            "- [x] Item A\n- [ ] Item B"
+        );
+    }
+
+    public function test_drawing_blocks_remain_html()
+    {
+        $this->assertConversion(
+            '<div drawio-diagram="190" id="bkmrk--0" contenteditable="false"><img src="http://example.com/uploads/images/drawio/2022-04/drawing-1.png" alt="" /></div>Some text',
+            '<div drawio-diagram="190"><img src="http://example.com/uploads/images/drawio/2022-04/drawing-1.png" alt=""/></div>' . "\n\nSome text"
+        );
+    }
+
+    public function test_summary_tags_have_newlines_after_to_separate_content()
+    {
+        $this->assertConversion(
+            '<details><summary>Toggle</summary><p>Test</p></details>',
+            "<details><summary>Toggle</summary>\n\nTest\n\n</details>"
+        );
+    }
+
+    public function test_iframes_tags_have_newlines_after_to_separate_content()
+    {
+        $this->assertConversion(
+            '<iframe src="https://example.com"></iframe><p>Beans</p>',
+            "<iframe src=\"https://example.com\"></iframe>\n\nBeans"
+        );
+    }
+
+    protected function assertConversion(string $html, string $expectedMarkdown, bool $partialMdMatch = false)
+    {
+        $markdown = (new HtmlToMarkdown($html))->convert();
+
+        if ($partialMdMatch) {
+            static::assertStringContainsString($expectedMarkdown, $markdown);
+        } else {
+            static::assertEquals($expectedMarkdown, $markdown);
+        }
+    }
+}
index c06aa5bf125406fc0160b581d3dc5f2fe6e648e0..d4e5654359860098dfaf3fbd3008390ac53231d9 100644 (file)
@@ -18,36 +18,39 @@ class PageEditorTest extends TestCase
         $this->page = Page::query()->first();
     }
 
-    public function test_default_editor_is_wysiwyg()
+    public function test_default_editor_is_wysiwyg_for_new_pages()
     {
         $this->assertEquals('wysiwyg', setting('app-editor'));
-        $this->asAdmin()->get($this->page->getUrl() . '/edit')
-            ->assertElementExists('#html-editor');
+        $resp = $this->asAdmin()->get($this->page->book->getUrl('/create-page'));
+        $this->followRedirects($resp)->assertElementExists('#html-editor');
     }
 
-    public function test_markdown_setting_shows_markdown_editor()
+    public function test_markdown_setting_shows_markdown_editor_for_new_pages()
     {
         $this->setSettings(['app-editor' => 'markdown']);
-        $this->asAdmin()->get($this->page->getUrl() . '/edit')
+
+        $resp = $this->asAdmin()->get($this->page->book->getUrl('/create-page'));
+        $this->followRedirects($resp)
             ->assertElementNotExists('#html-editor')
             ->assertElementExists('#markdown-editor');
     }
 
     public function test_markdown_content_given_to_editor()
     {
-        $this->setSettings(['app-editor' => 'markdown']);
-
         $mdContent = '# hello. This is a test';
         $this->page->markdown = $mdContent;
+        $this->page->editor = 'markdown';
         $this->page->save();
 
-        $this->asAdmin()->get($this->page->getUrl() . '/edit')
+        $this->asAdmin()->get($this->page->getUrl('/edit'))
             ->assertElementContains('[name="markdown"]', $mdContent);
     }
 
     public function test_html_content_given_to_editor_if_no_markdown()
     {
-        $this->setSettings(['app-editor' => 'markdown']);
+        $this->page->editor = 'markdown';
+        $this->page->save();
+
         $this->asAdmin()->get($this->page->getUrl() . '/edit')
             ->assertElementContains('[name="markdown"]', $this->page->html);
     }
@@ -102,4 +105,101 @@ class PageEditorTest extends TestCase
         $resp = $this->get($draft->getUrl('/edit'));
         $resp->assertElementContains('a[href="' . $draft->getUrl() . '"]', 'Back');
     }
+
+    public function test_switching_from_html_to_clean_markdown_works()
+    {
+        /** @var Page $page */
+        $page = Page::query()->first();
+        $page->html = '<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>';
+        $page->save();
+
+        $resp = $this->asAdmin()->get($page->getUrl('/edit?editor=markdown-clean'));
+        $resp->assertStatus(200);
+        $resp->assertSee("## A Header\n\nSome **bold** content.");
+        $resp->assertElementExists('#markdown-editor');
+    }
+
+    public function test_switching_from_html_to_stable_markdown_works()
+    {
+        /** @var Page $page */
+        $page = Page::query()->first();
+        $page->html = '<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>';
+        $page->save();
+
+        $resp = $this->asAdmin()->get($page->getUrl('/edit?editor=markdown-stable'));
+        $resp->assertStatus(200);
+        $resp->assertSee('<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>', true);
+        $resp->assertElementExists('[component="markdown-editor"]');
+    }
+
+    public function test_switching_from_markdown_to_wysiwyg_works()
+    {
+        /** @var Page $page */
+        $page = Page::query()->first();
+        $page->html = '';
+        $page->markdown = "## A Header\n\nSome content with **bold** text!";
+        $page->save();
+
+        $resp = $this->asAdmin()->get($page->getUrl('/edit?editor=wysiwyg'));
+        $resp->assertStatus(200);
+        $resp->assertElementExists('[component="wysiwyg-editor"]');
+        $resp->assertSee("<h2>A Header</h2>\n<p>Some content with <strong>bold</strong> text!</p>", true);
+    }
+
+    public function test_page_editor_changes_with_editor_property()
+    {
+        $resp = $this->asAdmin()->get($this->page->getUrl('/edit'));
+        $resp->assertElementExists('[component="wysiwyg-editor"]');
+
+        $this->page->markdown = "## A Header\n\nSome content with **bold** text!";
+        $this->page->editor = 'markdown';
+        $this->page->save();
+
+        $resp = $this->asAdmin()->get($this->page->getUrl('/edit'));
+        $resp->assertElementExists('[component="markdown-editor"]');
+    }
+
+    public function test_editor_type_switch_options_show()
+    {
+        $resp = $this->asAdmin()->get($this->page->getUrl('/edit'));
+        $editLink = $this->page->getUrl('/edit') . '?editor=';
+        $resp->assertElementContains("a[href=\"${editLink}markdown-clean\"]", '(Clean Content)');
+        $resp->assertElementContains("a[href=\"${editLink}markdown-stable\"]", '(Stable Content)');
+
+        $resp = $this->asAdmin()->get($this->page->getUrl('/edit?editor=markdown-stable'));
+        $editLink = $this->page->getUrl('/edit') . '?editor=';
+        $resp->assertElementContains("a[href=\"${editLink}wysiwyg\"]", 'Switch to WYSIWYG Editor');
+    }
+
+    public function test_editor_type_switch_options_dont_show_if_without_change_editor_permissions()
+    {
+        $resp = $this->asEditor()->get($this->page->getUrl('/edit'));
+        $editLink = $this->page->getUrl('/edit') . '?editor=';
+        $resp->assertElementNotExists("a[href*=\"${editLink}\"]");
+    }
+
+    public function test_page_editor_type_switch_does_not_work_without_change_editor_permissions()
+    {
+        /** @var Page $page */
+        $page = Page::query()->first();
+        $page->html = '<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>';
+        $page->save();
+
+        $resp = $this->asEditor()->get($page->getUrl('/edit?editor=markdown-stable'));
+        $resp->assertStatus(200);
+        $resp->assertElementExists('[component="wysiwyg-editor"]');
+        $resp->assertElementNotExists('[component="markdown-editor"]');
+    }
+
+    public function test_page_save_does_not_change_active_editor_without_change_editor_permissions()
+    {
+        /** @var Page $page */
+        $page = Page::query()->first();
+        $page->html = '<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>';
+        $page->editor = 'wysiwyg';
+        $page->save();
+
+        $this->asEditor()->put($page->getUrl(), ['name' => $page->name, 'markdown' => '## Updated content abc']);
+        $this->assertEquals('wysiwyg', $page->refresh()->editor);
+    }
 }
index fc6678788636df222c405f34e58823643b4c3be2..ce203ea36d65a1805e13b4d106b2dc7dd5849d32 100644 (file)
@@ -203,4 +203,19 @@ class PageRevisionTest extends TestCase
         $revisionCount = $page->revisions()->count();
         $this->assertEquals(12, $revisionCount);
     }
+
+    public function test_revision_list_shows_editor_type()
+    {
+        /** @var Page $page */
+        $page = Page::first();
+        $this->asAdmin()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html']);
+
+        $resp = $this->get($page->refresh()->getUrl('/revisions'));
+        $resp->assertElementContains('td', '(WYSIWYG)');
+        $resp->assertElementNotContains('td', '(Markdown)');
+
+        $this->asAdmin()->put($page->getUrl(), ['name' => 'Updated page', 'markdown' => '# Some markdown content']);
+        $resp = $this->get($page->refresh()->getUrl('/revisions'));
+        $resp->assertElementContains('td', '(Markdown)');
+    }
 }
diff --git a/tests/Unit/UrlTest.php b/tests/Unit/UrlTest.php
deleted file mode 100644 (file)
index fff5414..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace Tests\Unit;
-
-use Tests\TestCase;
-
-class UrlTest extends TestCase
-{
-    public function test_url_helper_takes_custom_url_into_account()
-    {
-        $this->runWithEnv('APP_URL', 'http://example.com/bookstack', function () {
-            $this->assertEquals('http://example.com/bookstack/books', url('/books'));
-        });
-    }
-
-    public function test_url_helper_sets_correct_scheme_even_when_request_scheme_is_different()
-    {
-        $this->runWithEnv('APP_URL', 'https://example.com/', function () {
-            $this->get('http://example.com/login')->assertSee('https://example.com/dist/styles.css');
-        });
-    }
-}
index 5545edf13255d1bf1df24e8c7e4e370b0f21f545..27a23bcaeed3d385ebce0dd27f31aa5f3ef12f5e 100644 (file)
@@ -128,7 +128,8 @@ class AttachmentTest extends TestCase
         $pageGet->assertSee($attachment->getUrl());
 
         $attachmentGet = $this->get($attachment->getUrl());
-        $attachmentGet->assertSee('Hi, This is a test file for testing the upload process.');
+        $content = $attachmentGet->streamedContent();
+        $this->assertStringContainsString('Hi, This is a test file for testing the upload process.', $content);
 
         $this->deleteUploads();
     }
index 1fc3d1049282f2552f4a74bcf3efdd9f1fa54d98..2ed4da7cadc6a9ff65525e6afb5b623c737709a6 100644 (file)
@@ -71,7 +71,7 @@ class DrawioTest extends TestCase
         $editor = $this->getEditor();
 
         $resp = $this->actingAs($editor)->get($page->getUrl('/edit'));
-        $resp->assertSee('drawio-url="https://embed.diagrams.net/?embed=1&amp;proto=json&amp;spin=1"', false);
+        $resp->assertSee('drawio-url="https://embed.diagrams.net/?embed=1&amp;proto=json&amp;spin=1&amp;configure=1"', false);
 
         config()->set('services.drawio', false);
         $resp = $this->actingAs($editor)->get($page->getUrl('/edit'));
diff --git a/tests/UrlTest.php b/tests/UrlTest.php
new file mode 100644 (file)
index 0000000..90215d5
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+namespace Tests;
+
+use BookStack\Http\Request;
+use function request;
+use function url;
+
+class UrlTest extends TestCase
+{
+    public function test_url_helper_takes_custom_url_into_account()
+    {
+        $this->runWithEnv('APP_URL', 'http://example.com/bookstack', function () {
+            $this->assertEquals('http://example.com/bookstack/books', url('/books'));
+        });
+    }
+
+    public function test_url_helper_sets_correct_scheme_even_when_request_scheme_is_different()
+    {
+        $this->runWithEnv('APP_URL', 'https://example.com/', function () {
+            $this->get('http://example.com/login')->assertSee('https://example.com/dist/styles.css');
+        });
+    }
+
+    public function test_app_url_forces_overrides_on_base_request()
+    {
+        config()->set('app.url', 'https://donkey.example.com:8091/cool/docs');
+
+        // Have to manually get and wrap request in our custom type due to testing mechanics
+        $this->get('/login');
+        $bsRequest = Request::createFrom(request());
+
+        $this->assertEquals('https://donkey.example.com:8091', $bsRequest->getSchemeAndHttpHost());
+        $this->assertEquals('/cool/docs', $bsRequest->getBaseUrl());
+        $this->assertEquals('https://donkey.example.com:8091/cool/docs/login', $bsRequest->getUri());
+    }
+}