]> BookStack Code Mirror - bookstack/commitdiff
Merge branch 'master' into release
authorDan Brown <redacted>
Sat, 26 Sep 2020 16:50:25 +0000 (17:50 +0100)
committerDan Brown <redacted>
Sat, 26 Sep 2020 16:50:25 +0000 (17:50 +0100)
35 files changed:
.github/translators.txt
.github/workflows/test-migrations.yml [new file with mode: 0644]
app/Auth/Access/RegistrationService.php
app/Entities/Entity.php
app/Entities/Managers/BookContents.php
database/migrations/2020_09_19_094251_add_activity_indexes.php
package-lock.json
package.json
resources/lang/cs/auth.php
resources/lang/cs/common.php
resources/lang/cs/components.php
resources/lang/cs/entities.php
resources/lang/cs/errors.php
resources/lang/cs/settings.php
resources/lang/cs/validation.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/es_AR/entities.php
resources/lang/ru/entities.php
resources/lang/ru/settings.php
resources/lang/zh_CN/entities.php
resources/lang/zh_CN/settings.php
resources/sass/_blocks.scss
resources/sass/_codemirror.scss
resources/sass/_forms.scss
resources/sass/_layout.scss
resources/sass/_variables.scss
resources/views/pages/markdown-editor.blade.php
resources/views/settings/index.blade.php
resources/views/settings/maintenance.blade.php
resources/views/settings/navbar-with-version.blade.php [new file with mode: 0644]
tests/Auth/Saml2Test.php
tests/Entity/PageContentTest.php

index e9ea8ffbacf256c773d90d263986eb66030e7417..6f06c8844b076837fad34f54853ff694d4ef02d6 100644 (file)
@@ -119,4 +119,6 @@ Simsimpicpic :: French
 Zenahr Barzani (Zenahr) :: German; Japanese; Dutch; German Informal
 tatsuya.info :: Japanese
 fadiapp :: Arabic
-Jakub “Jéžiš” Bouček (jakubboucek) :: Czech
+Jakub Bouček (jakubboucek) :: Czech
+Marco (cdrfun) :: German
+10935336 :: Chinese Simplified
diff --git a/.github/workflows/test-migrations.yml b/.github/workflows/test-migrations.yml
new file mode 100644 (file)
index 0000000..bff6f70
--- /dev/null
@@ -0,0 +1,58 @@
+name: test-migrations
+
+on:
+  push:
+    branches:
+      - master
+      - release
+  pull_request:
+    branches:
+      - '*'
+      - '*/*'
+      - '!l10n_master'
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        php: [7.2, 7.4]
+    steps:
+      - uses: actions/checkout@v1
+
+      - name: Get Composer Cache Directory
+        id: composer-cache
+        run: |
+          echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Cache composer packages
+        uses: actions/cache@v1
+        with:
+          path: ${{ steps.composer-cache.outputs.dir }}
+          key: ${{ runner.os }}-composer-${{ matrix.php }}
+
+      - name: Start MySQL
+        run: |
+          sudo /etc/init.d/mysql start
+
+      - name: Create database & user
+        run: |
+          mysql -uroot -proot -e 'CREATE DATABASE IF NOT EXISTS `bookstack-test`;'
+          mysql -uroot -proot -e "CREATE USER 'bookstack-test'@'localhost' IDENTIFIED BY 'bookstack-test';"
+          mysql -uroot -proot -e "GRANT ALL ON \`bookstack-test\`.* TO 'bookstack-test'@'localhost';"
+          mysql -uroot -proot -e 'FLUSH PRIVILEGES;'
+
+      - name: Install composer dependencies
+        run: composer install --prefer-dist --no-interaction --ansi
+
+      - name: Start migration test
+        run: |
+          php${{ matrix.php }} artisan migrate --force -n --database=mysql_testing
+
+      - name: Start migration:rollback test
+        run: |
+          php${{ matrix.php }} artisan migrate:rollback --force -n --database=mysql_testing
+
+      - name: Start migration rerun test
+        run: |
+          php${{ matrix.php }} artisan migrate --force -n --database=mysql_testing
index b85f7ffd83c24a0aa84b97997ee75f41735fc3b6..ecc92c117d46ccb84de50a8c2defc2c75322a3a7 100644 (file)
@@ -57,7 +57,7 @@ class RegistrationService
         // Ensure user does not already exist
         $alreadyUser = !is_null($this->userRepo->getByEmail($userEmail));
         if ($alreadyUser) {
-            throw new UserRegistrationException(trans('errors.error_user_exists_different_creds', ['email' => $userEmail]));
+            throw new UserRegistrationException(trans('errors.error_user_exists_different_creds', ['email' => $userEmail]), '/login');
         }
 
         // Create the user
index 120290d8ff12317529bd9d60d05519189098d0c8..cc7df46d4f653e201f9ba17c72a09c0b45046577 100644 (file)
@@ -201,12 +201,10 @@ class Entity extends Ownable
     }
 
     /**
-     * Allows checking of the exact class, Used to check entity type.
-     * Cleaner method for is_a.
-     * @param $type
-     * @return bool
+     * Check if this instance or class is a certain type of entity.
+     * Examples of $type are 'page', 'book', 'chapter'
      */
-    public static function isA($type)
+    public static function isA(string $type): bool
     {
         return static::getType() === strtolower($type);
     }
index 8b8d02c1dd0481539b17dcd2286e963e85581196..52447e43bf0b397d4c69782fed8453793e3a13bf 100644 (file)
@@ -41,7 +41,6 @@ class BookContents
 
     /**
      * Get the contents as a sorted collection tree.
-     * TODO - Support $renderPages option
      */
     public function getTree(bool $showDrafts = false, bool $renderPages = false): Collection
     {
@@ -60,8 +59,12 @@ class BookContents
             }
         });
 
-        $all->each(function (Entity $entity) {
+        $all->each(function (Entity $entity) use ($renderPages) {
             $entity->setRelation('book', $this->book);
+
+            if ($renderPages && $entity->isA('page')) {
+                $entity->html = (new PageContent($entity))->render();
+            }
         });
 
         return collect($chapters)->concat($lonePages)->sortBy($this->bookChildSortFunc());
index 544b01e1fc989bc96b52bd42566150e55a00f16c..7d6a270a919c911213d6e0292c016e8f7ee6bad5 100644 (file)
@@ -27,8 +27,8 @@ class AddActivityIndexes extends Migration
     public function down()
     {
         Schema::table('activities', function(Blueprint $table) {
-            $table->dropIndex('key');
-            $table->dropIndex('created_at');
+            $table->dropIndex('activities_key_index');
+            $table->dropIndex('activities_created_at_index');
         });
     }
 }
index c5b9fc3933262ed7c357927c14264861d87d87d8..cea03187cd0532014cef6e0ef355c29ad4f0b2a7 100644 (file)
       }
     },
     "codemirror": {
-      "version": "5.57.0",
-      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.57.0.tgz",
-      "integrity": "sha512-WGc6UL7Hqt+8a6ZAsj/f1ApQl3NPvHY/UQSzG6fB6l4BjExgVdhFaxd7mRTw1UCiYe/6q86zHP+kfvBQcZGvUg=="
+      "version": "5.58.1",
+      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.58.1.tgz",
+      "integrity": "sha512-UGb/ueu20U4xqWk8hZB3xIfV2/SFqnSLYONiM3wTMDqko0bsYrsAkGGhqUzbRkYm89aBKPyHtuNEbVWF9FTFzw=="
     },
     "color-convert": {
       "version": "1.9.3",
index a8ec0df93d45591a493fd1d4fda4c862b9cfbd71..0c3c69a07be6df87325c535b5f018a6125e08701 100644 (file)
@@ -24,7 +24,7 @@
   },
   "dependencies": {
     "clipboard": "^2.0.6",
-    "codemirror": "^5.57.0",
+    "codemirror": "^5.58.1",
     "dropzone": "^5.7.2",
     "markdown-it": "^11.0.0",
     "markdown-it-task-lists": "^2.1.1",
index c59ee85d90e70a77a9fc424c74443ecec4bd902e..a9f36c390b9cff31c109da8256f95574e8569932 100644 (file)
@@ -20,7 +20,7 @@ return [
     'username' => 'Uživatelské jméno',
     'email' => 'E-mail',
     'password' => 'Heslo',
-    'password_confirm' => 'Oveření hesla',
+    'password_confirm' => 'Potvrdit heslo',
     'password_hint' => 'Musí mít více než 7 znaků',
     'forgot_password' => 'Zapomněli jste heslo?',
     'remember_me' => 'Zapamatovat si mě',
@@ -74,4 +74,4 @@ return [
     'user_invite_page_text' => 'Pro dokončení vašeho účtu a získání přístupu musíte nastavit heslo, které bude použito k přihlášení do :appName při budoucích návštěvách.',
     'user_invite_page_confirm_button' => 'Potvrdit heslo',
     'user_invite_success' => 'Heslo nastaveno, nyní máte přístup k :appName!'
-];
+];
\ No newline at end of file
index bdfaa2eea3d940fd879015adf675877cea2fd716..342610f5d9942ea73b3bd123cbed7b44c1d7073d 100644 (file)
@@ -33,7 +33,7 @@ return [
     'copy' => 'Kopírovat',
     'reply' => 'Odpovědět',
     'delete' => 'Odstranit',
-    'delete_confirm' => 'Confirm Deletion',
+    'delete_confirm' => 'Potvrdit odstranění',
     'search' => 'Hledat',
     'search_clear' => 'Vymazat hledání',
     'reset' => 'Obnovit',
index 178f92149489058a476e9d3bc38e2eff61c7c1ff..e06462b0021c9f9a493cc6ef52cbae494e97caf7 100644 (file)
@@ -15,7 +15,7 @@ return [
     'image_load_more' => 'Načíst další',
     'image_image_name' => 'Název obrázku',
     'image_delete_used' => 'Tento obrázek je použit na níže uvedených stránkách.',
-    'image_delete_confirm_text' => 'Are you sure you want to delete this image?',
+    'image_delete_confirm_text' => 'Opravdu chcete odstranit tento obrázek?',
     'image_select_image' => 'Vyberte obrázek',
     'image_dropzone' => 'Přetáhněte obrázky nebo klikněte sem pro nahrání',
     'images_deleted' => 'Obrázky odstraněny',
index f8597ebb5961a43118c43f86c8c1c0c7466a2d9b..719d8cbc10aeba2935927cd157ae1353428e08ce 100644 (file)
@@ -146,7 +146,7 @@ return [
     'chapters_create' => 'Vytvořit novou kapitolu',
     'chapters_delete' => 'Smazat kapitolu',
     'chapters_delete_named' => 'Smazat kapitolu :chapterName',
-    'chapters_delete_explain' => "Kapitola ':chapterName' bude smazána. Všechny stránky v ní obsažené budou přesunuty přímo pod samotnou knihu.",
+    'chapters_delete_explain' => 'Kapitola \':chapterName\' bude smazána. Všechny stránky v ní obsažené budou přesunuty přímo pod samotnou knihu.',
     'chapters_delete_confirm' => 'Opravdu chcete tuto kapitolu smazat?',
     'chapters_edit' => 'Upravit kapitolu',
     'chapters_edit_named' => 'Upravit kapitolu :chapterName',
@@ -233,7 +233,7 @@ return [
         'time_b' => 'v posledních minutách (:minCount min.)',
         'message' => ':start :time. Dávejte pozor abyste nepřepsali změny ostatním!',
     ],
-    'pages_draft_discarded' => 'Koncept byl zahozen. Editor nyní obsahuje aktuální verzi stránky.',
+    'pages_draft_discarded' => 'Koncept zahozen. Editor nyní obsahuje aktuální verzi stránky.',
     'pages_specific' => 'Konkrétní stránka',
     'pages_is_template' => 'Šablona stránky',
 
@@ -256,16 +256,16 @@ return [
     'attachments_upload' => 'Nahrát soubor',
     'attachments_link' => 'Připojit odkaz',
     'attachments_set_link' => 'Nastavit odkaz',
-    'attachments_delete' => 'Are you sure you want to delete this attachment?',
+    'attachments_delete' => 'Jste si jisti, že chcete odstranit tuto přílohu?',
     'attachments_dropzone' => 'Přetáhněte sem soubory myší nebo sem kliknětě pro vybrání souboru.',
     'attachments_no_files' => 'Žádné soubory nebyli nahrány',
-    'attachments_explain_link' => 'Můžete pouze připojit odkaz, pokud nechcete nahrávat soubor přímo. Může to být odkaz na jinou stránku nebo na soubor v cloudu.',
+    'attachments_explain_link' => 'Můžete pouze připojit odkaz pokud nechcete nahrávat soubor přímo. Může to být odkaz na jinou stránku nebo na soubor v cloudu.',
     'attachments_link_name' => 'Název odkazu',
     'attachment_link' => 'Odkaz na přílohu',
     'attachments_link_url' => 'Odkaz na soubor',
     'attachments_link_url_hint' => 'URL stránky nebo souboru',
     'attach' => 'Připojit',
-    'attachments_insert_link' => 'Add Attachment Link to Page',
+    'attachments_insert_link' => 'Přidat odkaz na přílohu do stránky',
     'attachments_edit_file' => 'Upravit soubor',
     'attachments_edit_file_name' => 'Název souboru',
     'attachments_edit_drop_upload' => 'Přetáhněte sem soubor myší nebo klikněte pro nahrání nového a následné přepsání starého.',
@@ -294,7 +294,7 @@ return [
     'comment' => 'Komentář',
     'comments' => 'Komentáře',
     'comment_add' => 'Přidat komentář',
-    'comment_placeholder' => 'Zanechte komentář zde',
+    'comment_placeholder' => 'Zanechat komentář zde',
     'comment_count' => '{0} Bez komentářů|{1} 1 komentář|[2,4] :count komentáře|[5,*] :count komentářů',
     'comment_save' => 'Uložit komentář',
     'comment_saving' => 'Ukládání komentáře...',
@@ -313,4 +313,4 @@ return [
     'revision_restore_confirm' => 'Jste si jisti, že chcete obnovit tuto revizi? Aktuální obsah stránky bude nahrazen.',
     'revision_delete_success' => 'Revize smazána',
     'revision_cannot_delete_latest' => 'Nelze smazat poslední revizi.'
-];
+];
\ No newline at end of file
index a498906cb90b450de1ccad39373052ff0ea59dfb..43ba536f0496236363baa7f18e1ff4cf17b398e3 100644 (file)
@@ -9,8 +9,8 @@ return [
     'permissionJson' => 'Nemáte povolení k provedení požadované akce.',
 
     // Auth
-    'error_user_exists_different_creds' => 'Uživatel s e-mailem :email již existuje ale s jinými přihlašovacími údaji.',
-    'email_already_confirmed' => 'E-mailová adresa již byla potvrzena. Zkuste se přihlásit.',
+    'error_user_exists_different_creds' => 'Uživatel s emailem :email již existuje ale s jinými přihlašovacími údaji.',
+    'email_already_confirmed' => 'Emailová adresa již byla potvrzena. Zkuste se přihlásit.',
     'email_confirmation_invalid' => 'Tento potvrzovací odkaz již neplatí nebo už byl použit. Zkuste prosím registraci znovu.',
     'email_confirmation_expired' => 'Potvrzovací odkaz už neplatí, email s novým odkazem už byl poslán.',
     'email_confirmation_awaiting' => 'E-mailová adresa pro používaný účet musí být potvrzena',
@@ -20,20 +20,20 @@ return [
     'ldap_cannot_connect' => 'Nelze se připojit k adresáři LDAP. Prvotní připojení selhalo.',
     'saml_already_logged_in' => 'Již jste přihlášeni',
     'saml_user_not_registered' => 'Uživatel :name není registrován a automatická registrace je zakázána',
-    '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' => 'Nelze najít e-mailovou adresu pro tohoto uživatele v datech poskytnutých externím přihlašovacím systémem',
+    'saml_invalid_response_id' => 'Požadavek z externího ověřovacího systému nebyl rozpoznám procesem, který tato aplikace spustila. Tento problém může způsobit stisknutí tlačítka Zpět po přihlášení.',
     'saml_fail_authed' => 'Přihlášení pomocí :system selhalo, systém neposkytl úspěšnou autorizaci',
     'social_no_action_defined' => 'Nebyla zvolena žádá akce',
     'social_login_bad_response' => "Nastala chyba během přihlašování přes :socialAccount \n:error",
     'social_account_in_use' => 'Tento účet na :socialAccount se již používá. Pokuste se s ním přihlásit volbou Přihlásit přes :socialAccount.',
-    'social_account_email_in_use' => 'E-mailová adresa :email se již používá. Pokud máte již máte náš účet, můžete si jej propojit se svým účtem na :socialAccount v nastavení vašeho profilu.',
+    'social_account_email_in_use' => 'Emailová adresa :email se již používá. Pokud máte již máte náš účet, můžete si jej propojit se svým účtem na :socialAccount v nastavení vašeho profilu.',
     'social_account_existing' => 'Tento účet na :socialAccount je již propojen s vaším profilem zde.',
     'social_account_already_used_existing' => 'Tento účet na :socialAccount je již používán jiným uživatelem.',
     'social_account_not_used' => 'Tento účet na :socialAccount není spřažen s žádným uživatelem. Prosím přiřaďtě si jej v nastavení svého profilu.',
     'social_account_register_instructions' => 'Pokud ještě nemáte náš účet, můžete se zaregistrovat pomocí vašeho účtu na :socialAccount.',
     'social_driver_not_found' => 'Doplněk pro tohoto správce identity nebyl nalezen.',
     'social_driver_not_configured' => 'Nastavení vašeho účtu na :socialAccount není správné. :socialAccount musí mít vaše svolení pro naší aplikaci vás přihlásit.',
-    'invite_token_expired' => 'Odkaz v pozvánce již bohužel expiroval. Namísto toho ale můžete zkusit resetovat heslo do Vašeho účtu.',
+    'invite_token_expired' => 'Odkaz v pozvánce již bohužel vypršel. Namísto toho ale můžete zkusit resetovat heslo do Vašeho účtu.',
 
     // System
     'path_not_writable' => 'Nelze zapisovat na cestu k souboru :filePath. Zajistěte aby se dalo nahrávat na server.',
@@ -60,11 +60,11 @@ return [
     'chapter_not_found' => 'Kapitola nenalezena',
     'selected_book_not_found' => 'Vybraná kniha nebyla nalezena',
     'selected_book_chapter_not_found' => 'Zvolená kniha nebo kapitola nebyla nalezena',
-    'guests_cannot_save_drafts' => 'Nepřihlášení návštěvníci nemohou ukládat koncepty.',
+    'guests_cannot_save_drafts' => 'Návštěvníci z řad veřejnosti nemohou ukládat koncepty.',
 
     // Users
     'users_cannot_delete_only_admin' => 'Nemůžete smazat posledního administrátora',
-    'users_cannot_delete_guest' => 'Uživatele Guest není možno smazat',
+    'users_cannot_delete_guest' => 'Uživatele host není možno smazat',
 
     // Roles
     'role_cannot_be_edited' => 'Tuto roli nelze editovat',
@@ -73,16 +73,16 @@ return [
     'role_cannot_remove_only_admin' => 'Tento uživatel má roli administrátora. Přiřaďte roli administrátora někomu jinému než jí odeberete zde.',
 
     // Comments
-    'comment_list' => 'Při načítání komentářů nastala chyba.',
+    'comment_list' => 'Při dotahování komentářů nastala chyba.',
     'cannot_add_comment_to_draft' => 'Nemůžete přidávat komentáře ke konceptu.',
-    'comment_add' => 'Při přidávání / úpravě komentáře nastala chyba.',
+    'comment_add' => 'Při přidávání / aktualizaci komentáře nastala chyba.',
     'comment_delete' => 'Při mazání komentáře nastala chyba.',
     'empty_comment' => 'Nemůžete přidat prázdný komentář.',
 
     // Error pages
     '404_page_not_found' => 'Stránka nenalezena',
-    'sorry_page_not_found' => 'Omlouváme se, ale stránka, kterou hledáte, nebyla nalezena.',
-    'sorry_page_not_found_permission_warning' => 'Pokud myslíte, že by stránka měla existovat, možná jen nemáte oprávnění pro její zobrazení.',
+    'sorry_page_not_found' => 'Omlouváme se, ale stránka, kterou hledáte nebyla nalezena.',
+    'sorry_page_not_found_permission_warning' => 'Pokud očekáváte, že by stránka měla existovat, možná jen nemáte oprávnění pro její zobrazení.',
     'return_home' => 'Návrat domů',
     'error_occurred' => 'Nastala chyba',
     'app_down' => ':appName je momentálně vypnutá',
@@ -91,7 +91,7 @@ return [
     // API errors
     'api_no_authorization_found' => 'V požadavku nebyla nalezen žádný autorizační token',
     'api_bad_authorization_format' => 'V požadavku byl nalezen autorizační token, ale jeho formát se zdá být chybný',
-    'api_user_token_not_found' => 'Pro poskytnutý autorizační token nebyl nalezen žádný odpovídající API token',
+    'api_user_token_not_found' => 'Pro zadaný autorizační token nebyl nalezen žádný odpovídající API token',
     'api_incorrect_token_secret' => 'Poskytnutý Token Secret neodpovídá použitému API tokenu',
     'api_user_no_api_permission' => 'Vlastník použitého API tokenu nemá oprávnění provádět API volání',
     'api_user_token_expired' => 'Platnost autorizačního tokenu vypršela',
index 5f7e1a470c0bc1a7937857e04141be3b3b294e89..d499bff5e5f93f3123d2d5bebc97b6f84e6fe9e6 100644 (file)
@@ -9,67 +9,67 @@ return [
     // Common Messages
     'settings' => 'Nastavení',
     'settings_save' => 'Uložit nastavení',
-    'settings_save_success' => 'Nastavení bylo uloženo',
+    'settings_save_success' => 'Nastavení uloženo',
 
     // App Settings
     'app_customization' => 'Přizpůsobení',
     'app_features_security' => 'Funkce a zabezpečení',
     'app_name' => 'Název aplikace',
-    'app_name_desc' => 'Název se bude zobrazovat v záhlaví této aplikace a v odesílaných e-mailech.',
-    'app_name_header' => 'Zobrazovát název aplikace v záhlaví?',
+    'app_name_desc' => 'Název se bude zobrazovat v záhlaví této aplikace a v e-mailech odesílaných systémem.',
+    'app_name_header' => 'Zobrazovat název aplikace v záhlaví',
     'app_public_access' => 'Veřejný přístup',
-    'app_public_access_desc' => 'Povolení této volby umožní návštěvníkům, kteří nejsou přihlášeni, přístup k obsahu v instanci BookStack.',
-    'app_public_access_desc_guest' => 'Přístup veřejnosti je možné kontrolovat prostřednictvím uživatele "Guest".',
+    'app_public_access_desc' => 'Zapnutím této volby umožníte nepřihlášeným návštěvníkům přístup k Vašemu obsahu v BookStack aplikaci.',
+    'app_public_access_desc_guest' => 'Přístup pro nepřihlášené návštěvníky je možné nastavit přes uživatele "Guest".',
     'app_public_access_toggle' => 'Povolit veřejný přístup',
     'app_public_viewing' => 'Povolit prohlížení veřejností?',
-    'app_secure_images' => 'Povolit vyšší zabezpečení obrázků ?',
-    'app_secure_images_toggle' => 'Povolit vyšší zabezpečení obrázků',
-    'app_secure_images_desc' => 'Z výkonnostních důvodů jsou všechny obrázky veřejné. Tato volba přidá do adresy obrázku náhodný řetězec, aby nikdo neodhadnul adresu obrázku. Ujistěte se, že není povoleno indexování adresářů, abyste zamezili snadnému přístupu.',
+    '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_custom_html' => 'Vlastní HTML kód pro sekci hlavičky (<head>).',
+    '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' => 'Vlastní HTML hlavička je na této stránce nastavení zakázána, aby bylo možné vrátit změny zpět.',
+    '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.',
     'app_logo' => 'Logo aplikace',
-    'app_logo_desc' => 'Obrázek by měl mít 43 pixelů na výšku. <br>Větší obrázky zmenšíme na tuto velikost.',
+    'app_logo_desc' => 'Tento obrázek by měl mít výšku 43px. <br>Větší obrázky zmenšíme na tuto velikost.',
     'app_primary_color' => 'Hlavní barva aplikace',
-    'app_primary_color_desc' => 'Zápis by měl být hexa (#aabbcc). <br>Pro základní barvu nechte pole prázdné.',
+    'app_primary_color_desc' => 'Nastaví hlavní barvu aplikace včetně panelů, tlačítek a odkazů.',
     'app_homepage' => 'Úvodní stránka aplikace',
-    'app_homepage_desc' => 'Zvolte pohled, který se použije jako úvodní stránka. U zvolených stránek bude ignorováno jejich oprávnění.',
+    'app_homepage_desc' => 'Vyberte si zobrazení, které se použije jako úvodní stránka. U zvolených stránek bude ignorováno jejich oprávnění.',
     'app_homepage_select' => 'Zvolte stránku',
-    'app_disable_comments' => 'Zakázání komentářů',
-    'app_disable_comments_toggle' => 'Zakázat komentáře',
-    'app_disable_comments_desc' => 'Zakáže komentáře napříč všemi stránkami. <br> Existující komentáře se přestanou zobrazovat.',
+    'app_disable_comments' => 'Vypnutí komentářů',
+    'app_disable_comments_toggle' => 'Vypnout komentáře',
+    'app_disable_comments_desc' => 'Vypne komentáře napříč všemi stránkami. <br> Existující komentáře se přestanou zobrazovat.',
 
     // Color settings
     'content_colors' => 'Barvy obsahu',
-    'content_colors_desc' => 'Nastaví barvy pro všechny prvky v hierarchii organizace stránek. Pro čitelnost je doporučeno zvolit barvy s podobným jasem jako výchozí barvy.',
-    'bookshelf_color' => 'Barva Knihovny',
-    'book_color' => 'Barva Knihy',
-    'chapter_color' => 'Barva Kapitoly',
-    'page_color' => 'Barva Stránky',
-    'page_draft_color' => 'Page Draft Color',
+    'content_colors_desc' => 'Nastaví barvy pro všechny prvky v organizační struktuře stránky. Pro lepší čitelnost doporučujeme zvolit barvy s podobným jasem, jakou mají výchozí barvy.',
+    'bookshelf_color' => 'Barva knihovny',
+    'book_color' => 'Barva knihy',
+    'chapter_color' => 'Barva kapitoly',
+    'page_color' => 'Barva stránky',
+    'page_draft_color' => 'Barva návrhu stránky',
 
     // Registration Settings
     'reg_settings' => 'Nastavení registrace',
-    'reg_enable' => 'Povolit Registrace',
+    'reg_enable' => 'Povolení registrace',
     'reg_enable_toggle' => 'Povolit registrace',
-    'reg_enable_desc' => 'Při povolení registrace se budou moct tito uživatelé přihlásit a obdrží výchozí uživatelskou roli.',
+    'reg_enable_desc' => 'Pokud jsou povoleny registrace, bude se uživatel moci sám registrovat jako uživatel aplikace. Po registraci dostane jednu výchozí uživatelskou roli.',
     'reg_default_role' => 'Role přiřazená po registraci',
-    'reg_enable_external_warning' => 'Výše uvedená volba je ignorována, pokud je aktivní externí LDAP nebo SAML ověření. Uživatelské účty pro neexistující členy budou automaticky vytvořeny po přihlášení přes externí autentifikační systém.',
-    'reg_email_confirmation' => 'Potvrzení e-mailem',
-    'reg_email_confirmation_toggle' => 'Vyžadovat potvrzení e-mailem',
-    'reg_confirm_email_desc' => 'Pokud zapnete omezení emailové domény, tak bude ověřování emailové adresy vyžadováno vždy.',
+    'reg_enable_external_warning' => 'Pokud je povolené externí ověřování přes LDAP nebo SAML, je výše uvedená možnost ignorována. Uživatelský účet budou automaticky vytvořen i neexistujícímu uživateli, jakmile se úspěšně přihlásí přes použitý externí přihlašovací systém.',
+    'reg_email_confirmation' => 'Ověření e-mailu',
+    'reg_email_confirmation_toggle' => 'Vyžadovat ověření e-mailu',
+    'reg_confirm_email_desc' => 'Pokud je zapnuté Omezení registrace podle domény, bude e-mail ověřován vždy a tato volba bude ignorována.',
     'reg_confirm_restrict_domain' => 'Omezit registraci podle domény',
-    'reg_confirm_restrict_domain_desc' => 'Zadejte emailové domény, kterým bude povolena registrace uživatelů. Oddělujete čárkou. Uživatelům bude odeslán email s odkazem pro potvrzení vlastnictví emailové adresy. Bez potvrzení nebudou moci aplikaci používat. <br> Pozn.: Uživatelé si mohou emailovou adresu změnit po úspěšné registraci.',
+    'reg_confirm_restrict_domain_desc' => 'Zadejte seznam e-mailových domén oddělených čárkami, na které chcete registraci omezit. Registrujícímu se uživateli bude zaslán e-mail, aby ověřil svoji e-mailovou adresu před tím, než mu bude přístup do aplikace povolen. <br> Upozorňujeme, že po úspěšné registraci může uživatel svoji e-mailovou adresu změnit.',
     'reg_confirm_restrict_domain_placeholder' => 'Žádná omezení nebyla nastavena',
 
     // Maintenance settings
     'maint' => 'Údržba',
-    'maint_image_cleanup' => 'Promazání obrázků',
-    'maint_image_cleanup_desc' => 'Prohledá stránky a jejich revize, aby zjistil, které obrázky a kresby jsou momentálně používány a které jsou zbytečné. Zajistěte plnou zálohu databáze a obrázků než se do toho pustíte.',
+    'maint_image_cleanup' => 'Pročistění obrázků',
+    'maint_image_cleanup_desc' => "Prohledá stránky a jejich revize, aby zjistil, které obrázky a kresby jsou momentálně používány a které jsou zbytečné. Zajistěte plnou zálohu databáze a obrázků než se do toho pustíte.",
     'maint_image_cleanup_ignore_revisions' => 'Ignorovat obrázky v revizích',
-    'maint_image_cleanup_run' => 'Spustit Promazání',
+    'maint_image_cleanup_run' => 'Spustit pročištění',
     'maint_image_cleanup_warning' => 'Nalezeno :count potenciálně nepoužitých obrázků. Jste si jistí, že je chcete smazat?',
     'maint_image_cleanup_success' => 'Potenciálně nepoužité obrázky byly smazány. Celkem :count.',
     'maint_image_cleanup_nothing_found' => 'Žádné potenciálně nepoužité obrázky nebyly nalezeny. Nic nebylo smazáno.',
@@ -77,23 +77,23 @@ return [
     'maint_send_test_email_desc' => 'Toto pošle zkušební e-mail na vaši e-mailovou adresu uvedenou ve vašem profilu.',
     'maint_send_test_email_run' => 'Odeslat zkušební e-mail',
     'maint_send_test_email_success' => 'E-mail odeslán na :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_send_test_email_mail_subject' => 'Testovací e-mail',
+    'maint_send_test_email_mail_greeting' => 'Zdá se, že posílání e-mailů funguje!',
+    'maint_send_test_email_mail_text' => 'Gratulujeme! Protože jste dostali tento e-mail, zdá se, že nastavení e-mailů je v pořádku.',
 
     // 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_item' => 'Related Item',
-    'audit_table_date' => 'Activity Date',
-    'audit_date_from' => 'Date Range From',
-    'audit_date_to' => 'Date Range To',
+    'audit' => 'Protokol auditu',
+    'audit_desc' => 'Tento protokol auditu zobrazuje seznam činností zaznamenaných v systému. Tento seznam není filtrován na rozdíl od podobných seznamů aktivit v systému, kde jsou použity filtry podle oprávnění.',
+    'audit_event_filter' => 'Filtr událostí',
+    'audit_event_filter_no_filter' => 'Bez filtru',
+    'audit_deleted_item' => 'Odstraněná položka',
+    'audit_deleted_item_name' => 'Jméno: :name',
+    'audit_table_user' => 'Uživatel',
+    'audit_table_event' => 'Událost',
+    'audit_table_item' => 'Související položka',
+    'audit_table_date' => 'Datum aktivity',
+    'audit_date_from' => 'Časový rozsah od',
+    'audit_date_to' => 'Časový rozsah do',
 
     // Role Settings
     'roles' => 'Role',
@@ -101,9 +101,9 @@ return [
     'role_create' => 'Vytvořit novou roli',
     'role_create_success' => 'Role byla úspěšně vytvořena',
     'role_delete' => 'Smazat roli',
-    'role_delete_confirm' => "Role ':roleName' bude smazána.",
-    'role_delete_users_assigned' => 'Role je přiřazena :userCount uživatelům. Pokud je chcete přesunout do jiné role, zvolte jednu z následujících.',
-    'role_delete_no_migration' => 'Nepřiřazovat uživatelům novou roli',
+    'role_delete_confirm' => 'Role \':roleName\' bude smazána.',
+    'role_delete_users_assigned' => 'Role je přiřazena :userCount uživatelům. Pokud jim chcete náhradou přidělit jinou roli, zvolte jednu z následujících.',
+    'role_delete_no_migration' => "Nepřiřazovat uživatelům náhradní roli",
     'role_delete_sure' => 'Opravdu chcete tuto roli smazat?',
     'role_delete_success' => 'Role byla úspěšně smazána',
     'role_edit' => 'Upravit roli',
@@ -112,24 +112,24 @@ return [
     'role_desc' => 'Stručný popis role',
     'role_external_auth_id' => 'Přihlašovací identifikátory třetích stran',
     'role_system' => 'Systémová oprávnění',
-    'role_manage_users' => 'Správa úživatelů',
+    'role_manage_users' => 'Správa uživatelů',
     'role_manage_roles' => 'Správa rolí a jejich práv',
     'role_manage_entity_permissions' => 'Správa práv všech knih, kapitol a stránek',
     'role_manage_own_entity_permissions' => 'Správa práv vlastních knih, kapitol a stránek',
-    'role_manage_page_templates' => 'Spravovat šablony stránek',
-    'role_access_api' => 'Přístup k API systému',
+    'role_manage_page_templates' => 'Správa šablon stránek',
+    'role_access_api' => 'Přístup k systémovému API',
     'role_manage_settings' => 'Správa nastavení aplikace',
-    'role_asset' => 'Práva děl',
-    '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' => 'Tato práva řídí přístup k dílům v rámci systému. Specifická práva na knihách, kapitolách a stránkách překryjí tato nastavení.',
+    '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 práva řídí přístup k obsahu napříč systémem. Specifická práva na knihách, kapitolách a stránkách převáží tato nastavení.',
     'role_asset_admins' => 'Administrátoři automaticky dostávají přístup k veškerému obsahu, ale tyto volby mohou ukázat nebo skrýt volby v uživatelském rozhraní.',
     'role_all' => 'Vše',
     'role_own' => 'Vlastní',
-    'role_controlled_by_asset' => 'Řídí se obsahem do kterého jsou nahrávány',
-    'role_save' => 'Uloži roli',
-    'role_update_success' => 'Role úspěšně upravena',
-    'role_users' => 'Uživatelé, kteří mají tuto roli',
-    'role_users_none' => 'Žádný uživatel tuto roli nemá.',
+    'role_controlled_by_asset' => 'Řídí se obsahem, do kterého jsou nahrávány',
+    'role_save' => 'Uložit roli',
+    'role_update_success' => 'Role úspěšně aktualizována',
+    'role_users' => 'Uživatelé mající tuto roli',
+    'role_users_none' => 'Žádný uživatel nemá tuto roli',
 
     // Users
     'users' => 'Uživatelé',
@@ -137,38 +137,38 @@ return [
     'users_add_new' => 'Přidat nového uživatele',
     'users_search' => 'Vyhledávání uživatelů',
     'users_details' => 'Údaje o uživateli',
-    '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_details_desc' => 'Nastavte zobrazované jméno a e-mailovou adresu pro tohoto uživatele. E-mailová adresa bude použita pro přihlášení do aplikace.',
+    'users_details_desc_no_email' => 'Nastavte zobrazované jméno pro tohoto uživatele, aby jej ostatní uživatele poznali.',
     'users_role' => 'Uživatelské role',
-    'users_role_desc' => 'Vyberte, do kterých rolí bude uživatel přiřazen. Pokud je uživatel přiřazen k více rolím, oprávnění z těchto rolí se budou skládat a budou dostávat všechny schopnosti přiřazených rolí.',
-    'users_password' => 'Uživatelské heslo',
-    'users_password_desc' => 'Set a password used to log-in to the application. This must be at least 6 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' => 'Přihlašovací identifikátory třetích stran',
-    'users_external_auth_id_desc' => 'This is the ID used to match this user when communicating with your external authentication system.',
-    'users_password_warning' => 'Vyplňujte pouze v případě, že chcete heslo změnit:',
-    'users_system_public' => 'Symbolizuje každého nepřihlášeného návštěvníka, který navštívil vaší aplikaci. Nelze ho použít k přihlášení ale je přiřazen automaticky nepřihlášeným.',
+    'users_role_desc' => 'Zvolte role, do kterých chcete uživatele zařadit. Pokud bude uživatel zařazen do více rolí, oprávnění z těchto rolí se sloučí a uživateli bude dovoleno vše, k čemu mají jednotlivé role oprávnění.',
+    'users_password' => 'Heslo uživatele',
+    'users_password_desc' => 'Zadejte heslo pro přihlášení do aplikace. Heslo musí být nejméně 6 znaků dlouhé.',
+    'users_send_invite_text' => 'Uživateli můžete poslat pozvánku e-mailem, která umožní uživateli, aby si zvolil sám svoje heslo do aplikace a nebo můžete zadat heslo sami.',
+    'users_send_invite_option' => 'Poslat uživateli pozvánku e-mailem',
+    'users_external_auth_id' => 'Přihlašovací identifikátor třetích stran',
+    'users_external_auth_id_desc' => 'ID použité pro rozpoznání tohoto uživatele když komunikuje s externím přihlašovacím systémem.',
+    'users_password_warning' => 'Vyplňujte pouze v případě, že chcete heslo změnit.',
+    'users_system_public' => 'Symbolizuje každého nepřihlášeného návštěvníka, který navštívil aplikaci. Nelze ho použít k přihlášení ale je přiřazen automaticky nepřihlášeným.',
     'users_delete' => 'Smazat uživatele',
     'users_delete_named' => 'Odstranit uživatele :userName',
-    'users_delete_warning' => 'Uživatel \':userName\' bude úplně smazán ze systému.',
+    'users_delete_warning' => 'Uživatel \':userName\' bude zcela smazán ze systému.',
     'users_delete_confirm' => 'Opravdu chcete tohoto uživatele smazat?',
     'users_delete_success' => 'Uživatel byl úspěšně smazán',
     'users_edit' => 'Upravit uživatele',
     'users_edit_profile' => 'Upravit profil',
     'users_edit_success' => 'Uživatel byl úspěšně aktualizován',
     'users_avatar' => 'Obrázek uživatele',
-    'users_avatar_desc' => 'Obrázek by měl být čtverec 256 pixelů široký. Bude oříznut do kruhu.',
+    'users_avatar_desc' => 'Vyberte obrázek, který bude reprezentovat tohoto uživatele. Měl by být přibližně 256px velký ve tvaru čtverce.',
     'users_preferred_language' => 'Preferovaný jazyk',
-    'users_preferred_language_desc' => 'tato volba ovlivní pouze jazyk používaný v uživatelském rozhraní aplikace. Vobla nemá vliv na žádný uživateli vytvářený obsah.',
-    'users_social_accounts' => 'Přidružené účty ze sociálních sítí',
-    'users_social_accounts_info' => 'Zde můžete přidat vaše účty ze sociálních sítí pro pohodlnější přihlašování. Zrušení přidružení účtů neznamená, že tato aplikace ztratí práva číst detaily z vašeho účtu. Zakázat této aplikaci přístup k detailům vašeho účtu musíte přímo ve svém profilu na dané sociální síti.',
-    'users_social_connect' => 'Přidružit účet',
-    'users_social_disconnect' => 'Zrušit přidružení',
-    'users_social_connected' => 'Účet :socialAccount byl úspěšně přidružen k vašemu profilu.',
-    'users_social_disconnected' => 'Přidružení účtu :socialAccount k vašemu profilu bylo úspěšně zrušeno.',
-    'users_api_tokens' => 'API Klíče',
-    'users_api_tokens_none' => 'Pro tohoto uživatele nebyly vytvořeny žádné API klíče',
+    'users_preferred_language_desc' => 'Tato volba ovlivní pouze jazyk používaný v uživatelském rozhraní aplikace. Volba nemá vliv na žádný uživateli vytvářený obsah.',
+    'users_social_accounts' => 'Sociální účty',
+    'users_social_accounts_info' => 'Zde můžete přidat vaše účty ze sociálních sítí pro pohodlnější přihlašování. Odpojení účtů neznamená, že tato aplikace ztratí práva číst detaily z vašeho účtu. Zakázat této aplikaci přístup k detailům vašeho účtu musíte přímo ve svém profilu na dané sociální síti.',
+    'users_social_connect' => 'Připojit účet',
+    'users_social_disconnect' => 'Odpojit účet',
+    'users_social_connected' => 'Účet :socialAccount byl úspěšně připojen k vašemu profilu.',
+    'users_social_disconnected' => 'Účet :socialAccount byl úspěšně odpojen od vašeho profilu.',
+    'users_api_tokens' => 'API Tokeny',
+    'users_api_tokens_none' => 'Tento uživatel nemá vytvořené žádné API Tokeny',
     'users_api_tokens_create' => 'Vytvořit Token',
     'users_api_tokens_expires' => 'Vyprší',
     'users_api_tokens_docs' => 'API Dokumentace',
@@ -176,13 +176,13 @@ return [
     // API Tokens
     'user_api_token_create' => 'Vytvořit API Klíč',
     'user_api_token_name' => 'Název',
-    'user_api_token_name_desc' => 'Zadejte srozumitelný název tokenu, který vám později může pomoci připomenout účet, za jakým jste token vytvářeli.',
-    'user_api_token_expiry' => 'Datum expirace',
+    'user_api_token_name_desc' => 'Zadejte srozumitelný název tokenu, který vám později může pomoci připomenout účel, za jakým jste token vytvářeli.',
+    'user_api_token_expiry' => 'Platný do',
     'user_api_token_expiry_desc' => 'Zadejte datum, kdy platnost tokenu vyprší. Po tomto datu nebudou požadavky, které používají tento token, fungovat. Pokud ponecháte pole prázdné, bude tokenu nastavena platnost na dalších 100 let.',
     'user_api_token_create_secret_message' => 'Ihned po vytvoření tokenu Vám bude vygenerován a zobrazen "Token ID" a "Token Secret". Upozorňujeme, že "Token Secret" bude možné zobrazit pouze jednou, ujistěte se, že si jej poznamenáte a uložíte na bezpečné místo před tím, než budete pokračovat dále.',
-    'user_api_token_create_success' => 'API token úspěšně vytvořen',
-    'user_api_token_update_success' => 'API token úspěšně updaten',
-    'user_api_token' => 'API Token',
+    'user_api_token_create_success' => 'API klíč úspěšně vytvořen',
+    'user_api_token_update_success' => 'API klíč úspěšně aktualizován',
+    'user_api_token' => 'API Klíč',
     'user_api_token_id' => 'Token ID',
     'user_api_token_id_desc' => 'Toto je neupravitelný systémový identifikátor generovaný pro tento klíč, který musí být uveden v API requestu.',
     'user_api_token_secret' => 'Token Secret',
index 08f326d5e7a2e3fb64f16754e1b196483de3f2dd..9fc2f38ecbf59fb738ac18fd6d7376a0ae80438a 100644 (file)
@@ -105,7 +105,7 @@ return [
     // Custom validation lines
     'custom' => [
         'password-confirm' => [
-            'required_with' => 'Ověření hesla je vyžadováno',
+            'required_with' => 'Je nutné potvrdit heslo',
         ],
     ],
 
index d6578642154d3896828c770618d5d3716c45dba9..73f7ef6e07f34d682a4e088ec3373844ad940e4d 100644 (file)
@@ -265,7 +265,7 @@ return [
     'attachments_link_url' => 'Link zu einer Datei',
     'attachments_link_url_hint' => 'URL einer Seite oder Datei',
     'attach' => 'Hinzufügen',
-    'attachments_insert_link' => 'Add Attachment Link to Page',
+    'attachments_insert_link' => 'Link zum Anhang auf Seite einfügen',
     'attachments_edit_file' => 'Datei bearbeiten',
     'attachments_edit_file_name' => 'Dateiname',
     'attachments_edit_drop_upload' => 'Ziehen Sie Dateien hierher, um diese hochzuladen und zu überschreiben',
index 66307fab148dfdee2330003bbf3f4411d0466a50..226eb2ce33a0046f8055197bd33b37bea34bf35c 100644 (file)
@@ -85,18 +85,18 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'maint_send_test_email_mail_text' => 'Glückwunsch! Da Sie diese E-Mail Benachrichtigung erhalten haben, scheinen Ihre E-Mail-Einstellungen korrekt konfiguriert zu sein.',
 
     // 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' => 'Audit-Protokoll',
+    'audit_desc' => 'Dieses Audit-Protokoll zeigt eine Liste der Aktivitäten an, welche vom System protokolliert werden. Im Gegensatz zu den anderen Aktivitätslisten im System, bei denen Berechtigungen angewendet werden, ist diese Liste ungefiltert.',
+    'audit_event_filter' => 'Ereignisfilter',
+    'audit_event_filter_no_filter' => 'Kein Filter',
+    'audit_deleted_item' => 'Gelöschtes Objekt',
     'audit_deleted_item_name' => 'Name: :name',
-    'audit_table_user' => 'User',
-    'audit_table_event' => 'Event',
-    'audit_table_item' => 'Related Item',
-    'audit_table_date' => 'Activity Date',
-    'audit_date_from' => 'Date Range From',
-    'audit_date_to' => 'Date Range To',
+    'audit_table_user' => 'Benutzer',
+    'audit_table_event' => 'Ereignis',
+    'audit_table_item' => 'Verwendetes Objekt',
+    'audit_table_date' => 'Aktivitätsdatum',
+    'audit_date_from' => 'Zeitraum von',
+    'audit_date_to' => 'Zeitraum bis',
 
     // Role Settings
     'roles' => 'Rollen',
@@ -203,7 +203,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
-        'bg' => 'Bǎlgarski',
+        'bg' => 'Bulgarisch',
         'cs' => 'Česky',
         'da' => 'Dänisch',
         'de' => 'Deutsch (Sie)',
index a1b628b89f9db13d42f8af0199bdc05556ba90d4..d03504b00c4fb3f0127171b98e1aadb2b187048d 100644 (file)
@@ -265,7 +265,7 @@ return [
     'attachments_link_url' => 'Link zu einer Datei',
     'attachments_link_url_hint' => 'URL einer Seite oder Datei',
     'attach' => 'Hinzufügen',
-    'attachments_insert_link' => 'Add Attachment Link to Page',
+    'attachments_insert_link' => 'Link zum Anhang auf Seite einfügen',
     'attachments_edit_file' => 'Datei bearbeiten',
     'attachments_edit_file_name' => 'Dateiname',
     'attachments_edit_drop_upload' => 'Ziehe Dateien hierher, um diese hochzuladen und zu überschreiben',
index a0ddc5a04a8db1e4bce11ff844dd84af8261908d..0f7ebd7da8ce048f166e07ae7210d775ab9fc52c 100644 (file)
@@ -85,18 +85,18 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'maint_send_test_email_mail_text' => 'Glückwunsch! Da du diese E-Mail Benachrichtigung erhalten hast, scheinen deine E-Mail-Einstellungen korrekt konfiguriert zu sein.',
 
     // 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' => 'Audit-Protokoll',
+    'audit_desc' => 'Dieses Audit-Protokoll zeigt eine Liste der Aktivitäten an, welche vom System protokolliert werden. Im Gegensatz zu den anderen Aktivitätslisten im System, bei denen Berechtigungen angewendet werden, ist diese Liste ungefiltert.',
+    'audit_event_filter' => 'Ereignisfilter',
+    'audit_event_filter_no_filter' => 'Kein Filter',
+    'audit_deleted_item' => 'Gelöschtes Objekt',
     'audit_deleted_item_name' => 'Name: :name',
-    'audit_table_user' => 'User',
-    'audit_table_event' => 'Event',
-    'audit_table_item' => 'Related Item',
-    'audit_table_date' => 'Activity Date',
-    'audit_date_from' => 'Date Range From',
-    'audit_date_to' => 'Date Range To',
+    'audit_table_user' => 'Benutzer',
+    'audit_table_event' => 'Ereignis',
+    'audit_table_item' => 'Verwendetes Objekt',
+    'audit_table_date' => 'Aktivitätsdatum',
+    'audit_date_from' => 'Zeitraum von',
+    'audit_date_to' => 'Zeitraum bis',
 
     // Role Settings
     'roles' => 'Rollen',
@@ -203,7 +203,7 @@ Hinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung 
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
-        'bg' => 'Bǎlgarski',
+        'bg' => 'Bulgarisch',
         'cs' => 'Česky',
         'da' => 'Dänisch',
         'de' => 'Deutsch (Sie)',
index 3cd205ad9f76ce0af388d970900e38ca9e362d57..3c409f2781982f527728557d422427158a2536ff 100644 (file)
@@ -265,7 +265,7 @@ return [
     'attachments_link_url' => 'Enlace a archivo',
     'attachments_link_url_hint' => 'URL del sitio o archivo',
     'attach' => 'Adjuntar',
-    'attachments_insert_link' => 'Add Attachment Link to Page',
+    'attachments_insert_link' => 'Añadir enlace al adjunto en la página',
     'attachments_edit_file' => 'Editar archivo',
     'attachments_edit_file_name' => 'Nombre del archivo',
     'attachments_edit_drop_upload' => 'Arrastre los archivos o presione aquí para subir o sobreescribir',
index b27e041c28a880254c233055dd4cb14171b1811e..13747e36e950c24804a89f05ddcc0c676ec2708a 100644 (file)
@@ -265,7 +265,7 @@ return [
     'attachments_link_url' => 'Ссылка на файл',
     'attachments_link_url_hint' => 'URL-адрес сайта или файла',
     'attach' => 'Прикрепить',
-    'attachments_insert_link' => 'Add Attachment Link to Page',
+    'attachments_insert_link' => 'Добавить ссылку на вложение',
     'attachments_edit_file' => 'Редактировать файл',
     'attachments_edit_file_name' => 'Название файла',
     'attachments_edit_drop_upload' => 'Перетащите файлы или нажмите здесь, чтобы загрузить и перезаписать',
index b6dcf91dfad2e5b5b4e6f998c3aab60fd0f0ebb1..8456f599b4eff532a591c4cc25b2600595f33772 100755 (executable)
@@ -82,18 +82,18 @@ return [
     'maint_send_test_email_mail_text' => 'Поздравляем! Поскольку вы получили это письмо, электронная почта настроена правильно.',
 
     // 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_item' => 'Related Item',
-    'audit_table_date' => 'Activity Date',
-    'audit_date_from' => 'Date Range From',
-    'audit_date_to' => 'Date Range To',
+    'audit' => 'Журнал аудита',
+    'audit_desc' => 'Этот журнал аудита отображает список действий, отслеживаемых в системе. Этот список не отфильтрован в отличие от аналогичных списков действий в системе, где применяются фильтры разрешений.',
+    'audit_event_filter' => 'Фильтр событий',
+    'audit_event_filter_no_filter' => 'Без фильтра',
+    'audit_deleted_item' => 'Удаленный элемент',
+    'audit_deleted_item_name' => 'Имя: :name',
+    'audit_table_user' => 'Пользователь',
+    'audit_table_event' => 'Событие',
+    'audit_table_item' => 'Связанный элемент',
+    'audit_table_date' => 'Дата действия',
+    'audit_date_from' => 'Диапазон даты от',
+    'audit_date_to' => 'Диапазон даты до',
 
     // Role Settings
     'roles' => 'Роли',
index babb9f28266fcc4f6e23ed32ebe719fbde330f82..387a5b2902469873e8dad8ccdb400f3907a84148 100644 (file)
@@ -265,7 +265,7 @@ return [
     'attachments_link_url' => '链接到文件',
     'attachments_link_url_hint' => '网站或文件的网址',
     'attach' => '附加',
-    'attachments_insert_link' => 'Add Attachment Link to Page',
+    'attachments_insert_link' => '将附加链接添加到页面',
     'attachments_edit_file' => '编辑文件',
     'attachments_edit_file_name' => '文件名',
     'attachments_edit_drop_upload' => '删除文件或点击这里上传并覆盖',
index 534b5ffa9a65008be9f09ce3588358910fda153a..7b8d87b49aa34bb7593a1aa3512df64cccacffbd 100755 (executable)
@@ -82,16 +82,16 @@ return [
     'maint_send_test_email_mail_text' => '恭喜!您收到了此邮件通知,你的电子邮件设置看起来配置正确。',
 
     // 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_item' => 'Related Item',
-    'audit_table_date' => 'Activity Date',
+    'audit' => '审核日志',
+    'audit_desc' => '该审核日志显示系统中跟踪的活动列表。与系统中应用了权限过滤器的类似活动列表不同,这个表是未经过滤的。',
+    'audit_event_filter' => '事件过滤器',
+    'audit_event_filter_no_filter' => '无过滤器',
+    'audit_deleted_item' => '被删除的项目',
+    'audit_deleted_item_name' => '姓名: :name',
+    'audit_table_user' => '用户',
+    'audit_table_event' => '事件',
+    'audit_table_item' => '相关项目',
+    'audit_table_date' => '活动日期',
     'audit_date_from' => 'Date Range From',
     'audit_date_to' => 'Date Range To',
 
@@ -200,7 +200,7 @@ return [
     'language_select' => [
         'en' => 'English',
         'ar' => 'العربية',
-        'bg' => 'Bǎlgarski',
+        'bg' => '保加利亚语',
         'cs' => 'Česky',
         'da' => '丹麦',
         'de' => 'Deutsch (Sie)',
index 697286a78cf5f606ed06a695c4ebb73c9cd71bfd..5b219b9ae33ae77ad24e73d4ddd676421316608a 100644 (file)
   &.warning:before {
     background-image: url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiNiNjUzMWMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+ICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4gICAgPHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiLz48L3N2Zz4=");
   }
+  a {
+    color: inherit;
+    text-decoration: underline;
+  }
 }
 
 /**
 .sticky-sidebar {
   position: sticky;
   top: $-m;
-}
\ No newline at end of file
+}
index f65a7c42279f6214e4b268874598b4c8dca53e32..e419ab524e63112c1c383996cc326644e4b6ab4c 100644 (file)
@@ -2,8 +2,10 @@
 
 .CodeMirror {
   /* Set height, width, borders, and global font properties here */
+  font-family: monospace;
   height: 300px;
   color: black;
+  direction: ltr;
 }
 
 /* PADDING */
@@ -11,7 +13,8 @@
 .CodeMirror-lines {
   padding: 4px 0; /* Vertical padding around content */
 }
-.CodeMirror pre {
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
   padding: 0 4px; /* Horizontal padding of content */
 }
 
 .cm-fat-cursor div.CodeMirror-cursors {
   z-index: 1;
 }
-
+.cm-fat-cursor-mark {
+  background-color: rgba(20, 255, 20, 0.5);
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+}
 .cm-animate-fat-cursor {
   width: auto;
   border: 0;
@@ -89,7 +97,7 @@
 
 .CodeMirror-rulers {
   position: absolute;
-  left: 0; right: 0; top: -50px; bottom: -20px;
+  left: 0; right: 0; top: -50px; bottom: 0;
   overflow: hidden;
 }
 .CodeMirror-ruler {
 .cm-s-default .cm-property,
 .cm-s-default .cm-operator {}
 .cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
 .cm-s-default .cm-comment {color: #a50;}
 .cm-s-default .cm-string {color: #a11;}
 .cm-s-default .cm-string-2 {color: #f50;}
 
 /* Default styles for common addons */
 
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
 .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
 .CodeMirror-activeline-background {background: #e8f2ff;}
 
@@ -156,17 +164,17 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
 
 .CodeMirror-scroll {
   overflow: scroll !important; /* Things will break if this is overridden */
-  /* 30px is the magic margin used to hide the element's real scrollbars */
+  /* 50px is the magic margin used to hide the element's real scrollbars */
   /* See overflow: hidden in .CodeMirror */
-  margin-bottom: -30px; margin-right: -30px;
-  padding-bottom: 30px;
+  margin-bottom: -50px; margin-right: -50px;
+  padding-bottom: 50px;
   height: 100%;
   outline: none; /* Prevent dragging from highlighting the element */
   position: relative;
 }
 .CodeMirror-sizer {
   position: relative;
-  border-right: 30px solid transparent;
+  border-right: 50px solid transparent;
 }
 
 /* The fake, visible scrollbars. Used to force redraw during scrolling
@@ -176,6 +184,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
   position: absolute;
   z-index: 6;
   display: none;
+  outline: none;
 }
 .CodeMirror-vscrollbar {
   right: 0; top: 0;
@@ -204,7 +213,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
   height: 100%;
   display: inline-block;
   vertical-align: top;
-  margin-bottom: -30px;
+  margin-bottom: -50px;
 }
 .CodeMirror-gutter-wrapper {
   position: absolute;
@@ -229,11 +238,13 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
   cursor: text;
   min-height: 1px; /* prevents collapsing before first draw */
 }
-.CodeMirror pre {
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
   /* Reset some styles that the rest of the page might have set */
   -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
   border-width: 0;
   background: transparent;
+  font-family: inherit;
   font-size: inherit;
   margin: 0;
   white-space: pre;
@@ -246,12 +257,9 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
   -webkit-tap-highlight-color: transparent;
   -webkit-font-variant-ligatures: contextual;
   font-variant-ligatures: contextual;
-  &:after {
-    content: none;
-    display: none;
-  }
 }
-.CodeMirror-wrap pre {
+.CodeMirror-wrap pre.CodeMirror-line,
+.CodeMirror-wrap pre.CodeMirror-line-like {
   word-wrap: break-word;
   white-space: pre-wrap;
   word-break: normal;
@@ -266,7 +274,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
 .CodeMirror-linewidget {
   position: relative;
   z-index: 2;
-  overflow: auto;
+  padding: 0.1px; /* Force widget margins to stay inside of the container */
 }
 
 .CodeMirror-widget {}
@@ -321,8 +329,8 @@ div.CodeMirror-dragcursors {
 .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
 
 .cm-searching {
-  background: #ffa;
-  background: rgba(255, 255, 0, .4);
+  background-color: #ffa;
+  background-color: rgba(255, 255, 0, .4);
 }
 
 /* Used to force a border model for a node */
@@ -341,53 +349,6 @@ div.CodeMirror-dragcursors {
 /* Help users use markselection to safely style text background */
 span.CodeMirror-selectedtext { background: none; }
 
-/**
- * Codemirror Default theme
- */
-
-.cm-s-default .cm-header {color: blue;}
-.cm-s-default .cm-quote {color: #090;}
-.cm-negative {color: #d44;}
-.cm-positive {color: #292;}
-.cm-header, .cm-strong {font-weight: bold;}
-.cm-em {font-style: italic;}
-.cm-link {text-decoration: underline;}
-.cm-strikethrough {text-decoration: line-through;}
-
-.cm-s-default .cm-keyword {color: #708;}
-.cm-s-default .cm-atom {color: #219;}
-.cm-s-default .cm-number {color: #164;}
-.cm-s-default .cm-def {color: #00f;}
-.cm-s-default .cm-variable,
-.cm-s-default .cm-punctuation,
-.cm-s-default .cm-property,
-.cm-s-default .cm-operator {}
-.cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
-.cm-s-default .cm-comment {color: #a50;}
-.cm-s-default .cm-string {color: #a11;}
-.cm-s-default .cm-string-2 {color: #f50;}
-.cm-s-default .cm-meta {color: #555;}
-.cm-s-default .cm-qualifier {color: #555;}
-.cm-s-default .cm-builtin {color: #30a;}
-.cm-s-default .cm-bracket {color: #997;}
-.cm-s-default .cm-tag {color: #170;}
-.cm-s-default .cm-attribute {color: #00c;}
-.cm-s-default .cm-hr {color: #999;}
-.cm-s-default .cm-link {color: #00c;}
-
-.cm-s-default .cm-error {color: #f00;}
-.cm-invalidchar {color: #f00;}
-
-.CodeMirror-composing { border-bottom: 2px solid; }
-
-/* Default styles for common addons */
-
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
-.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
-.CodeMirror-activeline-background {background: #e8f2ff;}
-
 /* STOP */
 
 /**
@@ -461,6 +422,9 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
   border: 1px solid;
   @include lightDark(border-color, #DDD, #111);
 }
+.CodeMirror pre::after {
+  display: none;
+}
 html.dark-mode .CodeMirror pre {
   background-color: transparent;
 }
index 32d873642f46c41d7ebc8fa33c742a7014989290..11ea1cc7f89bc6b29ff52001613b10e568f868e0 100644 (file)
   body {
     background-color: #fff;
     padding-inline-start: 16px;
-    margin-inline-end: 16px;
+    padding-inline-end: 16px;
   }
   [drawio-diagram]:hover {
     outline: 2px solid var(--color-primary);
index cf2a1630e48b1de1eab30c008176463859dc5c32..519cb27ad7787f31199276fbe821d87334a76603 100644 (file)
@@ -124,6 +124,9 @@ body.flexbox {
 .flex-container-row {
   display: flex;
   flex-direction: row;
+  &.v-center {
+    align-items: center;
+  }
 }
 
 .flex-container-column {
@@ -131,9 +134,17 @@ body.flexbox {
   flex-direction: column;
 }
 
+.flex-container-column.wrap, .flex-container-row.wrap {
+  flex-wrap: wrap;
+}
+
 .flex {
   min-height: 0;
   flex: 1;
+  &.fit-content {
+    flex-basis: auto;
+    flex-grow: 0;
+  }
 }
 
 .justify-flex-end {
index 2ce6a674964deb9bbda64c37fbb7c961afa2d91c..d0d1f27d3715b0fc8599b661b671f0c604c568d7 100644 (file)
@@ -35,7 +35,7 @@ $text: -apple-system, BlinkMacSystemFont,
 "Segoe UI", "Oxygen", "Ubuntu", "Roboto", "Cantarell",
 "Fira Sans", "Droid Sans", "Helvetica Neue",
 sans-serif;
-$mono: "Lucida Console", "DejaVu Sans Mono", "Ubunto Mono", Monaco, monospace;
+$mono: "Lucida Console", "DejaVu Sans Mono", "Ubuntu Mono", Monaco, monospace;
 $heading: $text;
 $fs-m: 14px;
 $fs-s: 12px;
@@ -68,4 +68,4 @@ $bs-med: 0 1px 3px 1px rgba(76, 76, 76, 0.26);
 $bs-large: 0 1px 6px 1px rgba(22, 22, 22, 0.2);
 $bs-card: 0 1px 6px -1px rgba(0, 0, 0, 0.1);
 $bs-card-dark: 0 1px 6px -1px rgba(0, 0, 0, 0.5);
-$bs-hover: 0 2px 2px 1px rgba(0,0,0,.13);
\ No newline at end of file
+$bs-hover: 0 2px 2px 1px rgba(0,0,0,.13);
index a004dbd8be7024226d12d8b7d9b68c37a79b6359..6c1437ec1ac37b81da7e2b78ddeeceee4aad8a22 100644 (file)
@@ -35,7 +35,7 @@
         <div class="editor-toolbar">
             <div class="editor-toolbar-label">{{ trans('entities.pages_md_preview') }}</div>
         </div>
-        <iframe srcdoc="" class="markdown-display" sandbox="allow-same-origin"></iframe>
+        <iframe src="about:blank" class="markdown-display" sandbox="allow-same-origin"></iframe>
     </div>
     <input type="hidden" name="html"/>
 
index b688d96469a7df900be90cc1587f20192aec3478..8adc1045b46d15a8744e15f06d54b3992d07a3e6 100644 (file)
@@ -3,16 +3,7 @@
 @section('body')
     <div class="container small">
 
-        <div class="grid left-focus v-center no-row-gap">
-            <div class="py-m">
-                @include('settings.navbar', ['selected' => 'settings'])
-            </div>
-            <div class="text-right p-m">
-                <a target="_blank" rel="noopener noreferrer" href="https://github.com/BookStackApp/BookStack/releases">
-                    BookStack @if(strpos($version, 'v') !== 0) version @endif {{ $version }}
-                </a>
-            </div>
-        </div>
+        @include('settings.navbar-with-version', ['selected' => 'settings'])
 
         <div class="card content-wrap auto-height">
             <h2 id="features" class="list-heading">{{ trans('settings.app_features_security') }}</h2>
index 7311bbbe20c96ab7ea15fe5d48ed817985a358e8..35686ca3307e0f27a268987cc2fbad708d411071 100644 (file)
@@ -3,16 +3,7 @@
 @section('body')
 <div class="container small">
 
-    <div class="grid left-focus v-center no-row-gap">
-        <div class="py-m">
-            @include('settings.navbar', ['selected' => 'maintenance'])
-        </div>
-        <div class="text-right p-m">
-            <a target="_blank" rel="noopener noreferrer" href="https://github.com/BookStackApp/BookStack/releases">
-            BookStack @if(strpos($version, 'v') !== 0) version @endif {{ $version }}
-            </a>
-        </div>
-    </div>
+    @include('settings.navbar-with-version', ['selected' => 'maintenance'])
 
     <div id="image-cleanup" class="card content-wrap auto-height">
         <h2 class="list-heading">{{ trans('settings.maint_image_cleanup') }}</h2>
diff --git a/resources/views/settings/navbar-with-version.blade.php b/resources/views/settings/navbar-with-version.blade.php
new file mode 100644 (file)
index 0000000..c02c370
--- /dev/null
@@ -0,0 +1,15 @@
+{{--
+$selected - String name of the selected tab
+$version - Version of bookstack to display
+--}}
+<div class="flex-container-row v-center wrap">
+    <div class="py-m flex fit-content">
+        @include('settings.navbar', ['selected' => $selected])
+    </div>
+    <div class="flex"></div>
+    <div class="text-right p-m flex fit-content">
+        <a target="_blank" rel="noopener noreferrer" href="https://github.com/BookStackApp/BookStack/releases">
+            BookStack @if(strpos($version, 'v') !== 0) version @endif {{ $version }}
+        </a>
+    </div>
+</div>
\ No newline at end of file
index 7303d4bd889fb9a13493eeda76101dbe0440f7c1..d58162497bcbd05802c92dbd87ae9621e9502bc6 100644 (file)
@@ -319,6 +319,33 @@ class Saml2Test extends TestCase
         $homeGet->assertRedirect('/register/confirm/awaiting');
     }
 
+    public function test_login_where_existing_non_saml_user_shows_warning()
+    {
+        $this->post('/saml2/login');
+        config()->set(['saml2.onelogin.strict' => false]);
+
+        // Make the user pre-existing in DB with different auth_id
+        User::query()->forceCreate([
+            'email' => '[email protected]',
+            'external_auth_id' => 'old_system_user_id',
+            'email_confirmed' => false,
+            'name' => 'Barry Scott'
+        ]);
+
+        $this->withPost(['SAMLResponse' => $this->acsPostData], function () {
+            $acsPost = $this->post('/saml2/acs');
+            $acsPost->assertRedirect('/login');
+            $this->assertFalse($this->isAuthenticated());
+            $this->assertDatabaseHas('users', [
+                'email' => '[email protected]',
+                'external_auth_id' => 'old_system_user_id',
+            ]);
+
+            $loginGet = $this->get('/login');
+            $loginGet->assertSee("A user with the email [email protected] already exists but with different credentials");
+        });
+    }
+
     protected function withGet(array $options, callable $callback)
     {
         return $this->withGlobal($_GET, $options, $callback);
index d3b6224c4192b653586c55644154c0d4f62f8074..69b46b06e4e73b43bbfa290dd93faa9716977107 100644 (file)
@@ -71,6 +71,25 @@ class PageContentTest extends TestCase
         $pageResp->assertSee($content);
     }
 
+    public function test_page_includes_rendered_on_book_export()
+    {
+        $page = Page::query()->first();
+        $secondPage = Page::query()
+            ->where('book_id', '!=', $page->book_id)
+            ->first();
+
+        $content = '<p id="bkmrk-meow">my cat is awesome and scratchy</p>';
+        $secondPage->html = $content;
+        $secondPage->save();
+
+        $page->html = "{{@{$secondPage->id}#bkmrk-meow}}";
+        $page->save();
+
+        $this->asEditor();
+        $htmlContent = $this->get($page->book->getUrl('/export/html'));
+        $htmlContent->assertSee('my cat is awesome and scratchy');
+    }
+
     public function test_page_content_scripts_removed_by_default()
     {
         $this->asEditor();