diff --git a/.github/translators.txt b/.github/translators.txt index e9ea8ffba..6f06c8844 100644 --- a/.github/translators.txt +++ b/.github/translators.txt @@ -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 index 000000000..bff6f70d1 --- /dev/null +++ b/.github/workflows/test-migrations.yml @@ -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 diff --git a/app/Auth/Access/RegistrationService.php b/app/Auth/Access/RegistrationService.php index b85f7ffd8..ecc92c117 100644 --- a/app/Auth/Access/RegistrationService.php +++ b/app/Auth/Access/RegistrationService.php @@ -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 diff --git a/app/Entities/Entity.php b/app/Entities/Entity.php index 120290d8f..cc7df46d4 100644 --- a/app/Entities/Entity.php +++ b/app/Entities/Entity.php @@ -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); } diff --git a/app/Entities/Managers/BookContents.php b/app/Entities/Managers/BookContents.php index 8b8d02c1d..52447e43b 100644 --- a/app/Entities/Managers/BookContents.php +++ b/app/Entities/Managers/BookContents.php @@ -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()); diff --git a/database/migrations/2020_09_19_094251_add_activity_indexes.php b/database/migrations/2020_09_19_094251_add_activity_indexes.php index 544b01e1f..7d6a270a9 100644 --- a/database/migrations/2020_09_19_094251_add_activity_indexes.php +++ b/database/migrations/2020_09_19_094251_add_activity_indexes.php @@ -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'); }); } } diff --git a/package-lock.json b/package-lock.json index c5b9fc393..cea03187c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -139,9 +139,9 @@ } }, "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", diff --git a/package.json b/package.json index a8ec0df93..0c3c69a07 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/resources/lang/cs/auth.php b/resources/lang/cs/auth.php index c59ee85d9..a9f36c390 100644 --- a/resources/lang/cs/auth.php +++ b/resources/lang/cs/auth.php @@ -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 diff --git a/resources/lang/cs/common.php b/resources/lang/cs/common.php index bdfaa2eea..342610f5d 100644 --- a/resources/lang/cs/common.php +++ b/resources/lang/cs/common.php @@ -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', diff --git a/resources/lang/cs/components.php b/resources/lang/cs/components.php index 178f92149..e06462b00 100644 --- a/resources/lang/cs/components.php +++ b/resources/lang/cs/components.php @@ -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', diff --git a/resources/lang/cs/entities.php b/resources/lang/cs/entities.php index f8597ebb5..719d8cbc1 100644 --- a/resources/lang/cs/entities.php +++ b/resources/lang/cs/entities.php @@ -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 diff --git a/resources/lang/cs/errors.php b/resources/lang/cs/errors.php index a498906cb..43ba536f0 100644 --- a/resources/lang/cs/errors.php +++ b/resources/lang/cs/errors.php @@ -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', diff --git a/resources/lang/cs/settings.php b/resources/lang/cs/settings.php index 5f7e1a470..d499bff5e 100644 --- a/resources/lang/cs/settings.php +++ b/resources/lang/cs/settings.php @@ -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 ().', + 'app_custom_html' => 'Vlastní obsah hlavičky HTML', 'app_custom_html_desc' => 'Cokoliv sem napíšete bude přidáno na konec sekce 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.
Větší obrázky zmenšíme na tuto velikost.', + 'app_logo_desc' => 'Tento obrázek by měl mít výšku 43px.
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).
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.
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.
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.
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.
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', diff --git a/resources/lang/cs/validation.php b/resources/lang/cs/validation.php index 08f326d5e..9fc2f38ec 100644 --- a/resources/lang/cs/validation.php +++ b/resources/lang/cs/validation.php @@ -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', ], ], diff --git a/resources/lang/de/entities.php b/resources/lang/de/entities.php index d65786421..73f7ef6e0 100644 --- a/resources/lang/de/entities.php +++ b/resources/lang/de/entities.php @@ -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', diff --git a/resources/lang/de/settings.php b/resources/lang/de/settings.php index 66307fab1..226eb2ce3 100644 --- a/resources/lang/de/settings.php +++ b/resources/lang/de/settings.php @@ -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)', diff --git a/resources/lang/de_informal/entities.php b/resources/lang/de_informal/entities.php index a1b628b89..d03504b00 100644 --- a/resources/lang/de_informal/entities.php +++ b/resources/lang/de_informal/entities.php @@ -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', diff --git a/resources/lang/de_informal/settings.php b/resources/lang/de_informal/settings.php index a0ddc5a04..0f7ebd7da 100644 --- a/resources/lang/de_informal/settings.php +++ b/resources/lang/de_informal/settings.php @@ -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)', diff --git a/resources/lang/es_AR/entities.php b/resources/lang/es_AR/entities.php index 3cd205ad9..3c409f278 100644 --- a/resources/lang/es_AR/entities.php +++ b/resources/lang/es_AR/entities.php @@ -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', diff --git a/resources/lang/ru/entities.php b/resources/lang/ru/entities.php index b27e041c2..13747e36e 100644 --- a/resources/lang/ru/entities.php +++ b/resources/lang/ru/entities.php @@ -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' => 'Перетащите файлы или нажмите здесь, чтобы загрузить и перезаписать', diff --git a/resources/lang/ru/settings.php b/resources/lang/ru/settings.php index b6dcf91df..8456f599b 100755 --- a/resources/lang/ru/settings.php +++ b/resources/lang/ru/settings.php @@ -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' => 'Роли', diff --git a/resources/lang/zh_CN/entities.php b/resources/lang/zh_CN/entities.php index babb9f282..387a5b290 100644 --- a/resources/lang/zh_CN/entities.php +++ b/resources/lang/zh_CN/entities.php @@ -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' => '删除文件或点击这里上传并覆盖', diff --git a/resources/lang/zh_CN/settings.php b/resources/lang/zh_CN/settings.php index 534b5ffa9..7b8d87b49 100755 --- a/resources/lang/zh_CN/settings.php +++ b/resources/lang/zh_CN/settings.php @@ -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)', diff --git a/resources/sass/_blocks.scss b/resources/sass/_blocks.scss index 697286a78..5b219b9ae 100644 --- a/resources/sass/_blocks.scss +++ b/resources/sass/_blocks.scss @@ -52,6 +52,10 @@ &.warning:before { background-image: url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiNiNjUzMWMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+ICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4gICAgPHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiLz48L3N2Zz4="); } + a { + color: inherit; + text-decoration: underline; + } } /** @@ -270,4 +274,4 @@ .sticky-sidebar { position: sticky; top: $-m; -} \ No newline at end of file +} diff --git a/resources/sass/_codemirror.scss b/resources/sass/_codemirror.scss index f65a7c422..e419ab524 100644 --- a/resources/sass/_codemirror.scss +++ b/resources/sass/_codemirror.scss @@ -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 */ } @@ -57,7 +60,12 @@ .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 { @@ -118,7 +126,7 @@ .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;} @@ -138,8 +146,8 @@ /* 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; } diff --git a/resources/sass/_forms.scss b/resources/sass/_forms.scss index 32d873642..11ea1cc7f 100644 --- a/resources/sass/_forms.scss +++ b/resources/sass/_forms.scss @@ -117,7 +117,7 @@ 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); diff --git a/resources/sass/_layout.scss b/resources/sass/_layout.scss index cf2a1630e..519cb27ad 100644 --- a/resources/sass/_layout.scss +++ b/resources/sass/_layout.scss @@ -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 { diff --git a/resources/sass/_variables.scss b/resources/sass/_variables.scss index 2ce6a6749..d0d1f27d3 100644 --- a/resources/sass/_variables.scss +++ b/resources/sass/_variables.scss @@ -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); diff --git a/resources/views/pages/markdown-editor.blade.php b/resources/views/pages/markdown-editor.blade.php index a004dbd8b..6c1437ec1 100644 --- a/resources/views/pages/markdown-editor.blade.php +++ b/resources/views/pages/markdown-editor.blade.php @@ -35,7 +35,7 @@
{{ trans('entities.pages_md_preview') }}
- + diff --git a/resources/views/settings/index.blade.php b/resources/views/settings/index.blade.php index b688d9646..8adc1045b 100644 --- a/resources/views/settings/index.blade.php +++ b/resources/views/settings/index.blade.php @@ -3,16 +3,7 @@ @section('body')
-
-
- @include('settings.navbar', ['selected' => 'settings']) -
- -
+ @include('settings.navbar-with-version', ['selected' => 'settings'])

{{ trans('settings.app_features_security') }}

diff --git a/resources/views/settings/maintenance.blade.php b/resources/views/settings/maintenance.blade.php index 7311bbbe2..35686ca33 100644 --- a/resources/views/settings/maintenance.blade.php +++ b/resources/views/settings/maintenance.blade.php @@ -3,16 +3,7 @@ @section('body')
-
-
- @include('settings.navbar', ['selected' => 'maintenance']) -
- -
+ @include('settings.navbar-with-version', ['selected' => 'maintenance'])

{{ trans('settings.maint_image_cleanup') }}

diff --git a/resources/views/settings/navbar-with-version.blade.php b/resources/views/settings/navbar-with-version.blade.php new file mode 100644 index 000000000..c02c370fe --- /dev/null +++ b/resources/views/settings/navbar-with-version.blade.php @@ -0,0 +1,15 @@ +{{-- +$selected - String name of the selected tab +$version - Version of bookstack to display +--}} +
+
+ @include('settings.navbar', ['selected' => $selected]) +
+
+ +
\ No newline at end of file diff --git a/tests/Auth/Saml2Test.php b/tests/Auth/Saml2Test.php index 7303d4bd8..d58162497 100644 --- a/tests/Auth/Saml2Test.php +++ b/tests/Auth/Saml2Test.php @@ -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' => 'user@example.com', + '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' => 'user@example.com', + 'external_auth_id' => 'old_system_user_id', + ]); + + $loginGet = $this->get('/login'); + $loginGet->assertSee("A user with the email user@example.com already exists but with different credentials"); + }); + } + protected function withGet(array $options, callable $callback) { return $this->withGlobal($_GET, $options, $callback); diff --git a/tests/Entity/PageContentTest.php b/tests/Entity/PageContentTest.php index d3b6224c4..69b46b06e 100644 --- a/tests/Entity/PageContentTest.php +++ b/tests/Entity/PageContentTest.php @@ -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 = '

my cat is awesome and scratchy

'; + $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();