Merge branch 'master' into release

This commit is contained in:
Dan Brown 2020-09-26 17:50:25 +01:00
commit 616c62703e
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
35 changed files with 355 additions and 272 deletions

View 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

58
.github/workflows/test-migrations.yml vendored Normal file
View File

@ -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

View 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

View 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);
}

View 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());

View 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');
});
}
}

6
package-lock.json generated
View File

@ -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",

View 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",

View 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!'
];
];

View 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',

View 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',

View 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.'
];
];

View 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',

View 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',

View 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',
],
],

View 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',

View 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)',

View 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',

View 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)',

View 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',

View 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' => 'Перетащите файлы или нажмите здесь, чтобы загрузить и перезаписать',

View File

@ -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' => 'Роли',

View 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' => '删除文件或点击这里上传并覆盖',

View File

@ -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)',

View File

@ -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;
}
}

View 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 */
}
@ -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;
}

View File

@ -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);

View 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 {

View 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);
$bs-hover: 0 2px 2px 1px rgba(0,0,0,.13);

View 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"/>

View 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>

View 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>

View File

@ -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>

View 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' => '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);

View 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();