Merge branch 'master' into 2019-design

This commit is contained in:
Dan Brown 2019-03-30 13:17:29 +00:00
commit 53a26a365c
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
26 changed files with 1034 additions and 35 deletions

View File

@ -119,7 +119,7 @@ class ImageController extends Controller
{
$this->checkPermission('image-create-all');
$this->validate($request, [
'file' => 'is_image'
'file' => 'image_extension|no_double_extension|mimes:jpeg,png,gif,bmp,webp,tiff'
]);
if (!$this->imageRepo->isValidType($type)) {
@ -135,7 +135,6 @@ class ImageController extends Controller
return response($e->getMessage(), 500);
}
return response()->json($image);
}

View File

@ -8,6 +8,7 @@ use BookStack\Entities\Page;
use BookStack\Settings\Setting;
use BookStack\Settings\SettingService;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\ServiceProvider;
use Schema;
use Validator;
@ -22,11 +23,17 @@ class AppServiceProvider extends ServiceProvider
public function boot()
{
// Custom validation methods
Validator::extend('is_image', function ($attribute, $value, $parameters, $validator) {
$imageMimes = ['image/png', 'image/bmp', 'image/gif', 'image/jpeg', 'image/jpg', 'image/tiff', 'image/webp'];
return in_array($value->getMimeType(), $imageMimes);
Validator::extend('image_extension', function ($attribute, $value, $parameters, $validator) {
$validImageExtensions = ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'tiff', 'webp'];
return in_array(strtolower($value->getClientOriginalExtension()), $validImageExtensions);
});
Validator::extend('no_double_extension', function ($attribute, $value, $parameters, $validator) {
$uploadName = $value->getClientOriginalName();
return substr_count($uploadName, '.') < 2;
});
// Custom blade view directives
Blade::directive('icon', function ($expression) {
return "<?php echo icon($expression); ?>";

View File

@ -44,7 +44,7 @@ class AttachmentService extends UploadService
public function saveNewUpload(UploadedFile $uploadedFile, $page_id)
{
$attachmentName = $uploadedFile->getClientOriginalName();
$attachmentPath = $this->putFileInStorage($attachmentName, $uploadedFile);
$attachmentPath = $this->putFileInStorage($uploadedFile);
$largestExistingOrder = Attachment::where('uploaded_to', '=', $page_id)->max('order');
$attachment = Attachment::forceCreate([
@ -75,7 +75,7 @@ class AttachmentService extends UploadService
}
$attachmentName = $uploadedFile->getClientOriginalName();
$attachmentPath = $this->putFileInStorage($attachmentName, $uploadedFile);
$attachmentPath = $this->putFileInStorage($uploadedFile);
$attachment->name = $attachmentName;
$attachment->path = $attachmentPath;
@ -174,19 +174,18 @@ class AttachmentService extends UploadService
/**
* Store a file in storage with the given filename
* @param $attachmentName
* @param UploadedFile $uploadedFile
* @return string
* @throws FileUploadException
*/
protected function putFileInStorage($attachmentName, UploadedFile $uploadedFile)
protected function putFileInStorage(UploadedFile $uploadedFile)
{
$attachmentData = file_get_contents($uploadedFile->getRealPath());
$storage = $this->getStorage();
$basePath = 'uploads/files/' . Date('Y-m-M') . '/';
$uploadFileName = $attachmentName;
$uploadFileName = str_random(16) . '.' . $uploadedFile->getClientOriginalExtension();
while ($storage->exists($basePath . $uploadFileName)) {
$uploadFileName = str_random(3) . $uploadFileName;
}

View File

@ -52,7 +52,7 @@ return [
'locale' => env('APP_LANG', 'en'),
// Locales available
'locales' => ['en', 'ar', 'de', 'de_informal', 'es', 'es_AR', 'fr', 'nl', 'pt_BR', 'sk', 'sv', 'kr', 'ja', 'pl', 'it', 'ru', 'uk', 'zh_CN', 'zh_TW'],
'locales' => ['en', 'ar', 'de', 'de_informal', 'es', 'es_AR', 'fr', 'nl', 'pt_BR', 'sk', 'cs', 'sv', 'kr', 'ja', 'pl', 'it', 'ru', 'uk', 'zh_CN', 'zh_TW'],
// Application Fallback Locale
'fallback_locale' => 'en',

View File

@ -117,6 +117,15 @@ If you are looking to alter CSS or JavaScript content please edit the source fil
The website which contains the project docs & Blog can be found in the [BookStackApp/website](https://github.com/BookStackApp/website) repo.
## Security
Security information for administering a BookStack instance can be found on the [documentation site here](https://www.bookstackapp.com/docs/admin/security/).
If you'd like to be notified of new potential security concerns you can [sign-up to the BookStack security mailing list](http://eepurl.com/glIh8z).
If you would like to report a security concern in a more confidential manner than via a GitHub issue, You can directly email the lead maintainer [ssddanbrown](https://github.com/ssddanbrown). You will need to login to be able to see the email address on the [GitHub profile page](https://github.com/ssddanbrown). Alternatively you can send a DM via twitter to [@ssddanbrown](https://twitter.com/ssddanbrown).
## License
The BookStack source is provided under the MIT License.

View File

@ -0,0 +1,48 @@
<?php
/**
* Activity text strings.
* Is used for all the text within activity logs & notifications.
*/
return [
// Pages
'page_create' => 'vytvořená stránka',
'page_create_notification' => 'Stránka byla úspěšně vytvořena',
'page_update' => 'aktualizovaná stránka',
'page_update_notification' => 'Stránka byla úspěšně aktualizována',
'page_delete' => 'smazaná stránka',
'page_delete_notification' => 'Stránka byla úspěšně smazána',
'page_restore' => 'renovovaná stránka',
'page_restore_notification' => 'Stránka byla úspěšně renovována',
'page_move' => 'přesunutá stránka',
// Chapters
'chapter_create' => 'vytvořená kapitola',
'chapter_create_notification' => 'Kapitola byla úspěšně vytvořena',
'chapter_update' => 'aktualizovaná kapitola',
'chapter_update_notification' => 'Kapitola byla úspěšně aktualizována',
'chapter_delete' => 'smazaná kapitola',
'chapter_delete_notification' => 'Kapitola byla úspěšně smazána',
'chapter_move' => 'přesunutá kapitola',
// Books
'book_create' => 'vytvořená kniha',
'book_create_notification' => 'Kniha byla úspěšně vytvořena',
'book_update' => 'aktualizovaná kniha',
'book_update_notification' => 'Kniha byla úspěšně aktualizována',
'book_delete' => 'smazaná kniha',
'book_delete_notification' => 'Kniha byla úspěšně smazána',
'book_sort' => 'seřazená kniha',
'book_sort_notification' => 'Kniha byla úspěšně seřazena',
// Bookshelves
'bookshelf_create' => 'vytvořená knihovna',
'bookshelf_create_notification' => 'Knihovna úspěšně vytvořena',
'bookshelf_update' => 'aktualizovaná knihovna',
'bookshelf_update_notification' => 'Knihovna byla úspěšně aktualizována',
'bookshelf_delete' => 'smazaná knihovna',
'bookshelf_delete_notification' => 'Knihovna byla úspěšně smazána',
// Other
'commented_on' => 'okomentováno v',
];

View File

@ -0,0 +1,65 @@
<?php
/**
* Authentication Language Lines
* The following language lines are used during authentication for various
* messages that we need to display to the user.
*/
return [
'failed' => 'Neplatné přihlašovací údaje.',
'throttle' => 'Příliš pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.',
// Login & Register
'sign_up' => 'Registrace',
'log_in' => 'Přihlášení',
'log_in_with' => 'Přihlásit přes :socialDriver',
'sign_up_with' => 'Registrovat se přes :socialDriver',
'logout' => 'Odhlásit',
'name' => 'Jméno',
'username' => 'Jméno účtu',
'email' => 'Email',
'password' => 'Heslo',
'password_confirm' => 'Potvrdit heslo',
'password_hint' => 'Musí mít víc než 5 znaků',
'forgot_password' => 'Zapomněli jste heslo?',
'remember_me' => 'Neodhlašovat',
'ldap_email_hint' => 'Zadejte email, který chcete přiřadit k tomuto účtu.',
'create_account' => 'Vytvořit účet',
'social_login' => 'Přihlášení přes sociální sítě',
'social_registration' => 'Registrace přes sociální sítě',
'social_registration_text' => 'Registrovat a přihlásit se přes jinou službu',
'register_thanks' => 'Díky za registraci!',
'register_confirm' => 'Zkontrolujte prosím váš email a klikněte na potvrzovací tlačítko pro dokončení registrace do :appName.',
'registrations_disabled' => 'Registrace jsou momentálně pozastaveny',
'registration_email_domain_invalid' => 'Registrace z této emailové domény nejsou povoleny.',
'register_success' => 'Díky za registraci! Jste registrovaní a přihlášení.',
// Password Reset
'reset_password' => 'Resetovat heslo',
'reset_password_send_instructions' => 'Zadejte vaší emailovou adresu a bude vám zaslán odkaz na resetování hesla.',
'reset_password_send_button' => 'Poslat odkaz pro reset hesla',
'reset_password_sent_success' => 'Odkaz na resetování hesla vám byl zaslán na :email.',
'reset_password_success' => 'Vaše heslo bylo úspěšně resetováno.',
'email_reset_subject' => 'Reset hesla do :appName',
'email_reset_text' => 'Tento email jste obdrželi, protože jsme dostali žádost o resetování vašeho hesla k účtu v :appName.',
'email_reset_not_requested' => 'Pokud jste o reset vašeho hesla nežádali, prostě tento dopis smažte a je to.',
// Email Confirmation
'email_confirm_subject' => 'Potvrďte vaši emailovou adresu pro :appName',
'email_confirm_greeting' => 'Díky že jste se přidali do :appName!',
'email_confirm_text' => 'Prosíme potvrďte funkčnost vaší emailové adresy kliknutím na tlačítko níže:',
'email_confirm_action' => 'Potvrdit emailovou adresu',
'email_confirm_send_error' => 'Potvrzení emailové adresy je vyžadováno, ale systém vám nedokázal odeslat email. Kontaktujte správce aby to dal do kupy a potvrzovací email vám dorazil.',
'email_confirm_success' => 'Vaše emailová adresa byla potvrzena!',
'email_confirm_resent' => 'Email s žádostí o potvrzení vaší emailové adresy byl odeslán. Podívejte se do příchozí pošty.',
'email_not_confirmed' => 'Emailová adresa nebyla potvrzena',
'email_not_confirmed_text' => 'Vaše emailová adresa nebyla dosud potvrzena.',
'email_not_confirmed_click_link' => 'Klikněte na odkaz v emailu který jsme vám zaslali ihned po registraci.',
'email_not_confirmed_resend' => 'Pokud nemůžete nalézt email v příchozí poště, můžete si jej nechat poslat znovu pomocí formuláře níže.',
'email_not_confirmed_resend_button' => 'Znovu poslat email pro potvrzení emailové adresy',
];

View File

@ -0,0 +1,59 @@
<?php
/**
* Common elements found throughout many areas of BookStack.
*/
return [
// Buttons
'cancel' => 'Storno',
'confirm' => 'Potvrdit',
'back' => 'Zpět',
'save' => 'Uložit',
'continue' => 'Pokračovat',
'select' => 'Zvolit',
'more' => 'Více',
// Form Labels
'name' => 'Jméno',
'description' => 'Popis',
'role' => 'Role',
'cover_image' => 'Obrázek na přebal',
'cover_image_description' => 'Obrázek by měl být asi 440 × 250px.',
// Actions
'actions' => 'Akce',
'view' => 'Pohled',
'create' => 'Vytvořit',
'update' => 'Aktualizovat',
'edit' => 'Upravit',
'sort' => 'Řadit',
'move' => 'Přesunout',
'copy' => 'Kopírovat',
'reply' => 'Odpovědět',
'delete' => 'Smazat',
'search' => 'Hledat',
'search_clear' => 'Vyčistit hledání',
'reset' => 'Reset',
'remove' => 'Odstranit',
'add' => 'Přidat',
// Misc
'deleted_user' => 'Smazaný uživatel',
'no_activity' => 'Žádná aktivita k zobrazení',
'no_items' => 'Žádné položky nejsou k mání',
'back_to_top' => 'Zpět na začátek',
'toggle_details' => 'Ukázat detaily',
'toggle_thumbnails' => 'Ukázat náhledy',
'details' => 'Detaily',
'grid_view' => 'Zobrazit dlaždice',
'list_view' => 'Zobrazit seznam',
'default' => 'Výchozí',
// Header
'view_profile' => 'Ukázat profil',
'edit_profile' => 'Upravit profil',
// Email Content
'email_action_help' => 'Pokud se vám nedaří kliknout na tlačítko ":actionText", zkopírujte odkaz níže přímo do webového prohlížeče:',
'email_rights' => 'Všechna práva vyhrazena',
];

View File

@ -0,0 +1,33 @@
<?php
/**
* Text used in custom JavaScript driven components.
*/
return [
// Image Manager
'image_select' => 'Volba obrázku',
'image_all' => 'Vše',
'image_all_title' => 'Zobrazit všechny obrázky',
'image_book_title' => 'Zobrazit obrázky nahrané k této knize',
'image_page_title' => 'Zobrazit obrázky nahrané k této stránce',
'image_search_hint' => 'Hledat podle názvu obrázku',
'image_uploaded' => 'Nahráno :uploadedDate',
'image_load_more' => 'Načíst další',
'image_image_name' => 'Název obrázku',
'image_delete_used' => 'Tento obrázek je použit v následujících stránkách.',
'image_delete_confirm' => 'Stisknětě smazat ještě jednou pro potvrzení smazání tohoto obrázku.',
'image_select_image' => 'Zvolte obrázek',
'image_dropzone' => 'Přetáhněte sem obrázky myší nebo sem klikněte pro vybrání souboru.',
'images_deleted' => 'Obrázky smazány',
'image_preview' => 'Náhled obrázku',
'image_upload_success' => 'Obrázek byl úspěšně nahrán',
'image_update_success' => 'Podrobnosti o obrázku byly úspěšně aktualizovány',
'image_delete_success' => 'Obrázek byl úspěšně smazán',
'image_upload_remove' => 'Odstranit',
// Code Editor
'code_editor' => 'Upravit kód',
'code_language' => 'Jazyk kódu',
'code_content' => 'Obsah kódu',
'code_save' => 'Uložit kód',
];

View File

@ -0,0 +1,294 @@
<?php
/**
* Text used for 'Entities' (Document Structure Elements) such as
* Books, Shelves, Chapters & Pages
*/
return [
// Shared
'recently_created' => 'Nedávno vytvořené',
'recently_created_pages' => 'Nedávno vytvořené stránky',
'recently_updated_pages' => 'Nedávno aktualizované stránky',
'recently_created_chapters' => 'Nedávno vytvořené kapitoly',
'recently_created_books' => 'Nedávno vytvořené knihy',
'recently_update' => 'Nedávno aktualizované',
'recently_viewed' => 'Nedávno prohlížené',
'recent_activity' => 'Nedávné činnosti',
'create_now' => 'Vytvořte jí',
'revisions' => 'Revize',
'meta_revision' => 'Revize #:revisionCount',
'meta_created' => 'Vytvořeno :timeLength',
'meta_created_name' => 'Vytvořeno :timeLength uživatelem :user',
'meta_updated' => 'Aktualizováno :timeLength',
'meta_updated_name' => 'Aktualizováno :timeLength uživatelem :user',
'entity_select' => 'Volba prvku',
'images' => 'Obrázky',
'my_recent_drafts' => 'Mé nedávné koncepty',
'my_recently_viewed' => 'Naposledy navštívené',
'no_pages_viewed' => 'Zatím jste nic neshlédli',
'no_pages_recently_created' => 'Zatím nebyly vytvořeny žádné stránky',
'no_pages_recently_updated' => 'Zatím nebyly aktualizovány žádné stránky',
'export' => 'Export',
'export_html' => 'Všeobjímající HTML',
'export_pdf' => 'PDF dokument',
'export_text' => 'Čistý text (txt)',
// Permissions and restrictions
'permissions' => 'Práva',
'permissions_intro' => 'Zaškrtnutím překryjete práva v uživatelských rolích nastavením níže.',
'permissions_enable' => 'Zapnout vlastní práva',
'permissions_save' => 'Uložit práva',
// Search
'search_results' => 'Výsledky hledání',
'search_total_results_found' => 'Nalezen :count výsledek|Nalezeny :count výsledky|Nalezeny :count výsledky|Nalezeny :count výsledky|Nalezeno :count výsledků',
'search_clear' => 'Vyčistit hledání',
'search_no_pages' => 'Žádná stránka neodpovídá hledanému výrazu',
'search_for_term' => 'Hledat :term',
'search_more' => 'Další výsledky',
'search_filters' => 'Filtry hledání',
'search_content_type' => 'Typ obsahu',
'search_exact_matches' => 'Musí obsahovat',
'search_tags' => 'Hledat štítky (tagy)',
'search_options' => 'Volby',
'search_viewed_by_me' => 'Shlédnuto mnou',
'search_not_viewed_by_me' => 'Neshlédnuto mnou',
'search_permissions_set' => 'Sada práv',
'search_created_by_me' => 'Vytvořeno mnou',
'search_updated_by_me' => 'Aktualizováno',
'search_date_options' => 'Volby datumu',
'search_updated_before' => 'Aktualizováno před',
'search_updated_after' => 'Aktualizováno po',
'search_created_before' => 'Vytvořeno před',
'search_created_after' => 'Vytvořeno po',
'search_set_date' => 'Datum',
'search_update' => 'Hledat znovu',
// Shelves
'shelf' => 'Knihovna',
'shelves' => 'Knihovny',
'shelves_long' => 'Knihovny',
'shelves_empty' => 'Žádné knihovny nebyly vytvořeny',
'shelves_create' => 'Vytvořit novou knihovnu',
'shelves_popular' => 'Populární knihovny',
'shelves_new' => 'Nové knihovny',
'shelves_popular_empty' => 'Nejpopulárnější knihovny se objeví zde.',
'shelves_new_empty' => 'Nejnovější knihovny se objeví zde.',
'shelves_save' => 'Uložit knihovnu',
'shelves_books' => 'Knihy v této knihovně',
'shelves_add_books' => 'Přidat knihy do knihovny',
'shelves_drag_books' => 'Knihu přidáte jejím přetažením sem.',
'shelves_empty_contents' => 'Tato knihovna neobsahuje žádné knihy',
'shelves_edit_and_assign' => 'Pro přidáni knih do knihovny stiskněte úprvy.',
'shelves_edit_named' => 'Upravit knihovnu :name',
'shelves_edit' => 'Upravit knihovnu',
'shelves_delete' => 'Smazat knihovnu',
'shelves_delete_named' => 'Smazat knihovnu :name',
'shelves_delete_explain' => "Chystáte se smazat knihovnu ':name'. Knihy v ní obsažené zůstanou zachovány.",
'shelves_delete_confirmation' => 'Opravdu chcete smazat tuto knihovnu?',
'shelves_permissions' => 'Práva knihovny',
'shelves_permissions_updated' => 'Práva knihovny byla aktualizována',
'shelves_permissions_active' => 'Účinná práva knihovny',
'shelves_copy_permissions_to_books' => 'Přenést práva na knihy',
'shelves_copy_permissions' => 'Zkopírovat práva',
'shelves_copy_permissions_explain' => 'Práva knihovny budou aplikována na všechny knihy v ní obsažené. Před použitím se ujistěte, že jste uložili změny práv knihovny.',
'shelves_copy_permission_success' => 'Práva knihovny přenesena na knihy (celkem :count)',
// Books
'book' => 'Kniha',
'books' => 'Knihy',
'x_books' => ':count Kniha|:count Knihy|:count Knihy|:count Knihy|:count Knih',
'books_empty' => 'Žádné knihy nebyly vytvořeny',
'books_popular' => 'Populární knihy',
'books_recent' => 'Nedávné knihy',
'books_new' => 'Nové knihy',
'books_popular_empty' => 'Zde budou zobrazeny nejpopulárnější knihy.',
'books_new_empty' => 'Zde budou zobrazeny nově vytvořené knihy.',
'books_create' => 'Vytvořit novou knihu',
'books_delete' => 'Smazat knihu',
'books_delete_named' => 'Smazat knihu :bookName',
'books_delete_explain' => 'Kniha \':bookName\' bude smazána. Všechny její stránky a kapitoly budou taktéž smazány.',
'books_delete_confirmation' => 'Opravdu chcete tuto knihu smazat.',
'books_edit' => 'Upravit knihu',
'books_edit_named' => 'Upravit knihu :bookName',
'books_form_book_name' => 'Název knihy',
'books_save' => 'Uložit knihu',
'books_permissions' => 'Práva knihy',
'books_permissions_updated' => 'Práva knihy upravena',
'books_empty_contents' => 'V této knize nebyly vytvořeny žádné stránky ani kapitoly.',
'books_empty_create_page' => 'Vytvořit novou stránku',
'books_empty_or' => 'nebo',
'books_empty_sort_current_book' => 'Seřadit tuto knihu',
'books_empty_add_chapter' => 'Přidat kapitolu',
'books_permissions_active' => 'Účinná práva knihy',
'books_search_this' => 'Prohledat tuto knihu',
'books_navigation' => 'Obsah knihy',
'books_sort' => 'Seřadit obsah knihy',
'books_sort_named' => 'Seřadit knihu :bookName',
'books_sort_show_other' => 'Ukázat ostatní knihy',
'books_sort_save' => 'Uložit nové pořadí',
// Chapters
'chapter' => 'Kapitola',
'chapters' => 'Kapitoly',
'x_chapters' => ':count kapitola|:count kapitoly|:count kapitoly|:count kapitoly|:count kapitol',
'chapters_popular' => 'Populární kapitoly',
'chapters_new' => 'Nová kapitola',
'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_confirm' => 'Opravdu chcete tuto kapitolu smazat?',
'chapters_edit' => 'Upravit kapitolu',
'chapters_edit_named' => 'Upravit kapitolu :chapterName',
'chapters_save' => 'Uložit kapitolu',
'chapters_move' => 'Přesunout kapitolu',
'chapters_move_named' => 'Přesunout kapitolu :chapterName',
'chapter_move_success' => 'Kapitola přesunuta do knihy :bookName',
'chapters_permissions' => 'Práva kapitoly',
'chapters_empty' => 'Tato kapitola neobsahuje žádné stránky',
'chapters_permissions_active' => 'Účinná práva kapitoly',
'chapters_permissions_success' => 'Práva kapitoly aktualizována',
'chapters_search_this' => 'Prohledat tuto kapitolu',
// Pages
'page' => 'Stránka',
'pages' => 'Stránky',
'x_pages' => ':count strana|:count strany|:count strany|:count strany|:count stran',
'pages_popular' => 'Populární stránky',
'pages_new' => 'Nová stránka',
'pages_attachments' => 'Přílohy',
'pages_navigation' => 'Obsah stránky',
'pages_delete' => 'Smazat stránku',
'pages_delete_named' => 'Smazat stránku :pageName',
'pages_delete_draft_named' => 'Smazat koncept stránky :pageName',
'pages_delete_draft' => 'Smazat koncept stránky',
'pages_delete_success' => 'Stránka smazána',
'pages_delete_draft_success' => 'Koncept stránky smazán',
'pages_delete_confirm' => 'Opravdu chcete tuto stránku smazat?',
'pages_delete_draft_confirm' => 'Opravdu chcete tento koncept stránky smazat?',
'pages_editing_named' => 'Úpravy stránky :pageName',
'pages_edit_toggle_header' => 'Ukázat hlavičku',
'pages_edit_save_draft' => 'Uložit koncept',
'pages_edit_draft' => 'Upravit koncept stránky',
'pages_editing_draft' => 'Úpravy konceptu',
'pages_editing_page' => 'Úpravy stránky',
'pages_edit_draft_save_at' => 'Koncept uložen v ',
'pages_edit_delete_draft' => 'Smazat koncept',
'pages_edit_discard_draft' => 'Zahodit koncept',
'pages_edit_set_changelog' => 'Zadat komentář ke změnám',
'pages_edit_enter_changelog_desc' => 'Zadejte stručný popis změn, které jste provedli.',
'pages_edit_enter_changelog' => 'Vložit komentáře ke změnám',
'pages_save' => 'Uložit stránku',
'pages_title' => 'Nadpis stránky',
'pages_name' => 'Název stránky',
'pages_md_editor' => 'Editor',
'pages_md_preview' => 'Náhled',
'pages_md_insert_image' => 'Vložit obrázek',
'pages_md_insert_link' => 'Vložit odkaz na prvek',
'pages_md_insert_drawing' => 'Vložit kresbu',
'pages_not_in_chapter' => 'Stránka není součástí žádné kapitoly',
'pages_move' => 'Přesunout stránku',
'pages_move_success' => 'Stránka přesunuta do ":parentName"',
'pages_copy' => 'Kopírovat stránku',
'pages_copy_desination' => 'Cíl kopírování',
'pages_copy_success' => 'Stránka byla úspěšně zkopírována',
'pages_permissions' => 'Práva stránky',
'pages_permissions_success' => 'Práva stránky aktualizována',
'pages_revision' => 'Revize',
'pages_revisions' => 'Revize stránky',
'pages_revisions_named' => 'Revize stránky :pageName',
'pages_revision_named' => 'Revize stránky :pageName',
'pages_revisions_created_by' => 'Vytvořeno uživatelem',
'pages_revisions_date' => 'Datum revize',
'pages_revisions_number' => '#',
'pages_revisions_changelog' => 'Komentáře změn',
'pages_revisions_changes' => 'Změny',
'pages_revisions_current' => 'Aktuální verze',
'pages_revisions_preview' => 'Náhled',
'pages_revisions_restore' => 'Renovovat',
'pages_revisions_none' => 'Tato stránka nemá žádné revize',
'pages_copy_link' => 'Zkopírovat odkaz',
'pages_edit_content_link' => 'Upravit obsah',
'pages_permissions_active' => 'Účinná práva stránky',
'pages_initial_revision' => 'První vydání',
'pages_initial_name' => 'Nová stránka',
'pages_editing_draft_notification' => 'Právě upravujete koncept, který byl uložen před :timeDiff.',
'pages_draft_edited_notification' => 'Tato stránka se od té doby změnila. Je doporučeno aktuální koncept zahodit.',
'pages_draft_edit_active' => [
'start_a' => 'Uživatelé začali upravovat tuto stránku (celkem :count)',
'start_b' => 'Uživatel :userName začal upravovat tuto stránku',
'time_a' => 'od doby, kdy byla tato stránky naposledy aktualizována',
'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 zahozen. Editor nyní obsahuje aktuální verzi stránky.',
'pages_specific' => 'Konkrétní stránka',
// Editor Sidebar
'page_tags' => 'Štítky stránky',
'chapter_tags' => 'Štítky kapitoly',
'book_tags' => 'Štítky knihy',
'shelf_tags' => 'Štítky knihovny',
'tag' => 'Štítek',
'tags' => 'Štítky',
'tag_value' => 'Hodnota Štítku (volitelné)',
'tags_explain' => "Přidejte si štítky pro lepší kategorizaci knih. \n Štítky mohou nést i hodnotu pro detailnější klasifikaci.",
'tags_add' => 'Přidat další štítek',
'attachments' => 'Přílohy',
'attachments_explain' => 'Nahrajte soubory nebo připojte odkazy, které se zobrazí na stránce. Budou k nalezení v postranní liště.',
'attachments_explain_instant_save' => 'Změny zde provedené se okamžitě ukládají.',
'attachments_items' => 'Připojené položky',
'attachments_upload' => 'Nahrát soubor',
'attachments_link' => 'Připojit odkaz',
'attachments_set_link' => 'Nastavit odkaz',
'attachments_delete_confirm' => 'Stiskněte smazat znovu pro potvrzení smazání.',
'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_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_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.',
'attachments_order_updated' => 'Pořadí příloh aktualizováno',
'attachments_updated_success' => 'Podrobnosti příloh aktualizovány',
'attachments_deleted' => 'Příloha byla smazána',
'attachments_file_uploaded' => 'Soubor byl úspěšně nahrán',
'attachments_file_updated' => 'Soubor byl úspěšně aktualizován',
'attachments_link_attached' => 'Odkaz úspěšně přiložen ke stránce',
// Profile View
'profile_user_for_x' => 'Uživatelem již :time',
'profile_created_content' => 'Vytvořený obsah',
'profile_not_created_pages' => ':userName nevytvořil/a žádný obsah',
'profile_not_created_chapters' => ':userName nevytvořil/a žádné kapitoly',
'profile_not_created_books' => ':userName nevytvořil/a žádné knihy',
// Comments
'comment' => 'Komentář',
'comments' => 'Komentáře',
'comment_add' => 'Přidat komentář',
'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...',
'comment_deleting' => 'Mazání komentáře...',
'comment_new' => 'Nový komentář',
'comment_created' => 'komentováno :createDiff',
'comment_updated' => 'Aktualizováno :updateDiff uživatelem :username',
'comment_deleted_success' => 'Komentář smazán',
'comment_created_success' => 'Komentář přidán',
'comment_updated_success' => 'Komentář aktualizován',
'comment_delete_confirm' => 'Opravdu chcete smazat tento komentář?',
'comment_in_reply_to' => 'Odpověď na :commentId',
// Revision
'revision_delete_confirm' => 'Opravdu chcete smazat tuto revizi?',
'revision_delete_success' => 'Revize smazána',
'revision_cannot_delete_latest' => 'Nelze smazat poslední revizi.'
];

View File

@ -0,0 +1,84 @@
<?php
/**
* Text shown in error messaging.
*/
return [
// Permissions
'permission' => 'Nemáte povolení přistupovat na dotazovanou stránku.',
'permissionJson' => 'Nemáte povolení k provedení požadované akce.',
// Auth
'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.',
'ldap_fail_anonymous' => 'Přístup k adresáři LDAP jako anonymní uživatel (anonymous bind) selhal',
'ldap_fail_authed' => 'Přístup k adresáři LDAP pomocí zadaného jména (dn) a hesla selhal',
'ldap_extension_not_installed' => 'Není nainstalováno rozšíření LDAP pro PHP',
'ldap_cannot_connect' => 'Nelze se připojit k adresáři LDAP. Prvotní připojení selhalo.',
'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' => '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.',
// System
'path_not_writable' => 'Nelze zapisovat na cestu k souboru :filePath. Zajistěte aby se dalo nahrávat na server.',
'cannot_get_image_from_url' => 'Nelze získat obrázek z adresy :url',
'cannot_create_thumbs' => 'Server nedokáže udělat náhledy. Zkontrolujte, že rozšíření GD pro PHP je nainstalováno.',
'server_upload_limit' => 'Server nepovoluje nahrávat tak veliké soubory. Zkuste prosím menší soubor.',
'uploaded' => 'Server nepovoluje nahrávat tak veliké soubory. Zkuste prosím menší soubor.', //TODO to je nějaký podezřelý
'image_upload_error' => 'Nastala chyba během nahrávání souboru',
'image_upload_type_error' => 'Typ nahrávaného obrázku je neplatný.',
'file_upload_timeout' => 'Nahrávání souboru trvalo příliš dlouho a tak bylo ukončeno.',
// Attachments
'attachment_page_mismatch' => 'Došlo ke zmatení stránky během nahrávání přílohy.',
'attachment_not_found' => 'Příloha nenalezena',
// Pages
'page_draft_autosave_fail' => 'Nepovedlo se uložit koncept. Než stránku uložíte, ujistěte se, že jste připojeni k internetu.',
'page_custom_home_deletion' => 'Nelze smazat tuto stránku, protože je nastavena jako uvítací stránka.',
// Entities
'entity_not_found' => 'Prvek nenalezen',
'bookshelf_not_found' => 'Knihovna nenalezena',
'book_not_found' => 'Kniha nenalezena',
'page_not_found' => 'Stránka nenalezena',
'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' => '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 host není možno smazat',
// Roles
'role_cannot_be_edited' => 'Tuto roli nelze editovat',
'role_system_cannot_be_deleted' => 'Toto je systémová role a nelze jí smazat.',
'role_registration_default_cannot_delete' => 'Tuto roli nelze smazat dokud je nastavená jako výchozí role pro registraci nových uživatelů.',
'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 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í / aktualizaci komentáře nastala chyba.',
'comment_delete' => 'Při mazání komentáře nastala chyba.',
'empty_comment' => 'Nemůžete přidat prázdný komentář.', //This has a deep thinking value
// Error pages
'404_page_not_found' => 'Stránka nenalezena',
'sorry_page_not_found' => 'Omlouváme se, ale stránka, kterou hledáte nebyla nalezena.',
'return_home' => 'Návrat domů',
'error_occurred' => 'Nastala chyba',
'app_down' => ':appName je momentálně vypnutá',
'back_soon' => 'Brzy naběhne.',
];

View File

@ -0,0 +1,12 @@
<?php
/**
* Pagination Language Lines
* The following language lines are used by the paginator library to build
* the simple pagination links.
*/
return [
'previous' => '&laquo; Pøedchozí',
'next' => 'Další &raquo;',
];

View File

@ -0,0 +1,15 @@
<?php
/**
* Password Reminder Language Lines
* The following language lines are the default lines which match reasons
* that are given by the password broker for a password update attempt has failed.
*/
return [
'password' => 'Heslo musí být alespoň 6 znaků dlouhé a shodovat se v obou polích.',
'user' => "Nemůžeme najít uživatele se zadanou emailovou adresou.",
'token' => 'Tento odkaz pro reset hesla je neplatný.',
'sent' => 'Poslali jsme vám odkaz pro reset hesla!',
'reset' => 'Vaše heslo bylo resetováno!',
];

View File

@ -0,0 +1,117 @@
<?php
/**
* Settings text strings
* Contains all text strings used in the general settings sections of BookStack
* including users and roles.
*/
return [
// Common Messages
'settings' => 'Nastavení',
'settings_save' => 'Uložit nastavení',
'settings_save_success' => 'Nastavení bylo uloženo',
// App Settings
'app_settings' => 'Nastavení aplikace',
'app_name' => 'Název aplikace',
'app_name_desc' => 'Název se bude zobrazovat v záhlaví této aplikace a v odesílaných emailech.',
'app_name_header' => 'Zobrazovát název aplikace v záhlaví?',
'app_public_viewing' => 'Povolit prohlížení veřejností?',
'app_secure_images' => 'Nahrávat obrázky neveřejně a zabezpečeně?',
'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é číslo, aby nikdo neodhadnul adresu obrázku. Zajistěte ať adresáře nikomu nezobrazují seznam souborů.',
'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_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_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_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_homepage' => 'Úvodní stránka aplikace',
'app_homepage_desc' => 'Zvolte pohled který se objeví jako úvodní stránka po přihlášení. Pokud zvolíte stránku, její specifická oprávnění budou ignorována (výjimka z výjimky 😜).',
'app_homepage_select' => 'Zvolte stránku',
'app_disable_comments' => 'Zakázání komentářů',
'app_disable_comments_desc' => 'Zakáže komentáře napříč všemi stránkami. Existující komentáře se přestanou zobrazovat.',
// Registration Settings
'reg_settings' => 'Nastavení registrace',
'reg_allow' => 'Povolit registrace?',
'reg_default_role' => 'Role přiřazená po registraci',
'reg_confirm_email' => 'Vyžadovat ověření emailové adresy?',
'reg_confirm_email_desc' => 'Pokud zapnete omezení emailové domény, tak bude ověřování emailové adresy vyžadováno vždy.',
'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_placeholder' => 'Žádná omezení nebyla nastvena',
// Maintenance settings
'maint' => 'Údržba',
'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 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.',
// Role Settings
'roles' => 'Role',
'role_user_roles' => 'Uživatelské role',
'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 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',
'role_details' => 'Detaily role',
'role_name' => 'Název role',
'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_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_settings' => 'Správa nastavení aplikace',
'role_asset' => 'Práva děl',
'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_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 dílem do kterého jsou nahrávány',
'role_save' => 'Uloži 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é',
'user_profile' => 'Profil uživatele',
'users_add_new' => 'Přidat nového uživatele',
'users_search' => 'Vyhledávání uživatelů',
'users_role' => 'Uživatelské role',
'users_external_auth_id' => 'Přihlašovací identifikátory třetích stran',
'users_password_warning' => 'Vyplňujte pouze v případě, že chcete heslo změnit:',
'users_system_public' => 'Symbolizuje libovolného veřejné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 veřejnosti.',
'users_delete' => 'Smazat uživatele',
'users_delete_named' => 'Smazat uživatele :userName',
'users_delete_warning' => 'Uživatel \':userName\' bude úplně 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' => 'Uživatelský obrázek',
'users_avatar_desc' => 'Obrázek by měl být čtverec 256 pixelů široký. Bude oříznut do kruhu.',
'users_preferred_language' => 'Upřednostňovaný jazyk',
'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í zde neznamená, že tato aplikace pozbude 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 vašem 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.'
];

View File

@ -0,0 +1,152 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages.
|
*/
'accepted' => ':attribute musí být přijat.',
'active_url' => ':attribute není platnou URL adresou.',
'after' => ':attribute musí být datum po :date.',
'after_or_equal' => ':attribute musí být datum :date nebo pozdější.',
'alpha' => ':attribute může obsahovat pouze písmena.',
'alpha_dash' => ':attribute může obsahovat pouze písmena, číslice, pomlčky a podtržítka. České znaky (á, é, í, ó, ú, ů, ž, š, č, ř, ď, ť, ň) nejsou podporovány.',
'alpha_num' => ':attribute může obsahovat pouze písmena a číslice.',
'array' => ':attribute musí být pole.',
'before' => ':attribute musí být datum před :date.',
'before_or_equal' => 'Datum :attribute musí být před nebo rovno :date.',
'between' => [
'numeric' => ':attribute musí být hodnota mezi :min a :max.',
'file' => ':attribute musí být větší než :min a menší než :max Kilobytů.',
'string' => ':attribute musí být delší než :min a kratší než :max znaků.',
'array' => ':attribute musí obsahovat nejméně :min a nesmí obsahovat více než :max prvků.',
],
'boolean' => ':attribute musí být true nebo false',
'confirmed' => ':attribute nesouhlasí.',
'date' => ':attribute musí být platné datum.',
'date_equals' => 'The :attribute must be a date equal to :date.',
'date_format' => ':attribute není platný formát data podle :format.',
'different' => ':attribute a :other se musí lišit.',
'digits' => ':attribute musí být :digits pozic dlouhé.',
'digits_between' => ':attribute musí být dlouhé nejméně :min a nejvíce :max pozic.',
'dimensions' => ':attribute má neplatné rozměry.',
'distinct' => ':attribute má duplicitní hodnotu.',
'email' => ':attribute není platný formát.',
'exists' => 'Zvolená hodnota pro :attribute není platná.',
'file' => ':attribute musí být soubor.',
'filled' => ':attribute musí být vyplněno.',
'gt' => [
'numeric' => ':attribute musí být větší než :value.',
'file' => 'Velikost souboru :attribute musí být větší než :value kB.',
'string' => 'Počet znaků :attribute musí být větší :value.',
'array' => 'Pole :attribute musí mít více prvků než :value.',
],
'gte' => [
'numeric' => ':attribute musí být větší nebo rovno :value.',
'file' => 'Velikost souboru :attribute musí být větší nebo rovno :value kB.',
'string' => 'Počet znaků :attribute musí být větší nebo rovno :value.',
'array' => 'Pole :attribute musí mít :value prvků nebo více.',
],
'image' => ':attribute musí být obrázek.',
'in' => 'Zvolená hodnota pro :attribute je neplatná.',
'in_array' => ':attribute není obsažen v :other.',
'integer' => ':attribute musí být celé číslo.',
'ip' => ':attribute musí být platnou IP adresou.',
'ipv4' => ':attribute musí být platná IPv4 adresa.',
'ipv6' => ':attribute musí být platná IPv6 adresa.',
'json' => ':attribute musí být platný JSON řetězec.',
'lt' => [
'numeric' => ':attribute musí být menší než :value.',
'file' => 'Velikost souboru :attribute musí být menší než :value kB.',
'string' => ':attribute musí obsahovat méně než :value znaků.',
'array' => ':attribute by měl obsahovat méně než :value položek.',
],
'lte' => [
'numeric' => ':attribute musí být menší nebo rovno než :value.',
'file' => 'Velikost souboru :attribute musí být menší než :value kB.',
'string' => ':attribute nesmí být delší než :value znaků.',
'array' => ':attribute by měl obsahovat maximálně :value položek.',
],
'max' => [
'numeric' => ':attribute nemůže být větší než :max.',
'file' => 'Velikost souboru :attribute musí být menší než :value kB.',
'string' => ':attribute nemůže být delší než :max znaků.',
'array' => ':attribute nemůže obsahovat více než :max prvků.',
],
'mimes' => ':attribute musí být jeden z následujících datových typů :values.',
'mimetypes' => ':attribute musí být jeden z následujících datových typů :values.',
'min' => [
'numeric' => ':attribute musí být větší než :min.',
'file' => ':attribute musí být větší než :min kB.',
'string' => ':attribute musí být delší než :min znaků.',
'array' => ':attribute musí obsahovat více než :min prvků.',
],
'not_in' => 'Zvolená hodnota pro :attribute je neplatná.',
'not_regex' => ':attribute musí být regulární výraz.',
'numeric' => ':attribute musí být číslo.',
'present' => ':attribute musí být vyplněno.',
'regex' => ':attribute nemá správný formát.',
'required' => ':attribute musí být vyplněno.',
'required_if' => ':attribute musí být vyplněno pokud :other je :value.',
'required_unless' => ':attribute musí být vyplněno dokud :other je v :values.',
'required_with' => ':attribute musí být vyplněno pokud :values je vyplněno.',
'required_with_all' => ':attribute musí být vyplněno pokud :values je zvoleno.',
'required_without' => ':attribute musí být vyplněno pokud :values není vyplněno.',
'required_without_all' => ':attribute musí být vyplněno pokud není žádné z :values zvoleno.',
'same' => ':attribute a :other se musí shodovat.',
'size' => [
'numeric' => ':attribute musí být přesně :size.',
'file' => ':attribute musí mít přesně :size Kilobytů.',
'string' => ':attribute musí být přesně :size znaků dlouhý.',
'array' => ':attribute musí obsahovat právě :size prvků.',
],
'starts_with' => 'The :attribute must start with one of the following: :values',
'string' => ':attribute musí být řetězec znaků.',
'timezone' => ':attribute musí být platná časová zóna.',
'unique' => ':attribute musí být unikátní.',
'uploaded' => 'Nahrávání :attribute se nezdařilo.',
'url' => 'Formát :attribute je neplatný.',
'uuid' => ':attribute musí být validní UUID.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
'password-confirm' => [
'required_with' => 'Password confirmation required',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [
'password' => 'heslo',
],
];

View File

@ -146,6 +146,7 @@ return [
'nl' => 'Nederlands',
'pt_BR' => 'Português do Brasil',
'sk' => 'Slovensky',
'cs' => 'Česky',
'sv' => 'Svenska',
'kr' => '한국어',
'ja' => '日本語',

View File

@ -33,6 +33,7 @@ return [
'filled' => 'The :attribute field is required.',
'exists' => 'The selected :attribute is invalid.',
'image' => 'The :attribute must be an image.',
'image_extension' => 'The :attribute must have a valid & supported image extension.',
'in' => 'The selected :attribute is invalid.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
@ -49,6 +50,7 @@ return [
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'no_double_extension' => 'The :attribute must only have a single file extension.',
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'regex' => 'The :attribute format is invalid.',
@ -69,7 +71,6 @@ return [
'timezone' => 'The :attribute must be a valid zone.',
'unique' => 'The :attribute has already been taken.',
'url' => 'The :attribute format is invalid.',
'is_image' => 'The :attribute must be a valid image.',
// Custom validation lines
'custom' => [

View File

@ -66,6 +66,7 @@ return [
'role_cannot_be_edited' => 'Este rol no puede ser editado',
'role_system_cannot_be_deleted' => 'Este rol es un rol de sistema y no puede ser borrado',
'role_registration_default_cannot_delete' => 'Este rol no puede ser borrado mientras sea el rol por defecto de registro',
'role_cannot_remove_only_admin' => 'Este usuario es el único asignado al rol de administrador. Asigne el rol de administrador a otro usuario antes de intentar eliminarlo.',
// Comments
'comment_list' => 'Se produjo un error al obtener los comentarios.',

View File

@ -74,6 +74,7 @@ return [
'timezone' => 'El atributo :attribute debe ser una zona válida.',
'unique' => 'El atributo :attribute ya ha sido tomado.',
'url' => 'El atributo :attribute tiene un formato inválid.',
'is_image' => 'El atributo :attribute debe ser una imagen válida.',
/*
|--------------------------------------------------------------------------

View File

@ -100,6 +100,38 @@ return [
'books_sort_show_other' => 'Показать другие книги',
'books_sort_save' => 'Сохранить новый порядок',
/**
* Shelves
*/
'shelf' => 'Полка',
'shelves' => 'Полки',
'shelves_long' => 'Книжные полки',
'shelves_empty' => 'Полки не созданы',
'shelves_create' => 'Создать новую полку',
'shelves_popular' => 'Популярные полки',
'shelves_new' => 'Новые полки',
'shelves_popular_empty' => 'Популярные полки появятся здесь.',
'shelves_new_empty' => 'Последние созданные полки появятся здесь.',
'shelves_save' => 'Сохранить полку',
'shelves_books' => 'Книги из этой полки',
'shelves_add_books' => 'Добавить книгу в эту полку',
'shelves_drag_books' => 'Перетащите книгу сюда, чтобы добавить на эту полку',
'shelves_empty_contents' => 'На этой полке нет книг',
'shelves_edit_and_assign' => 'Изменить полку для привязки книг',
'shelves_edit_named' => 'Редактировать полку :name',
'shelves_edit' => 'Редактировать книжную полку',
'shelves_delete' => 'Удалить книжную полку',
'shelves_delete_named' => 'Удалить книжную полку :name',
'shelves_delete_explain' => "Это приведет к удалению полки с именем ':name'. Привязанные книги удалены не будут.",
'shelves_delete_confirmation' => 'Вы уверены, что хотите удалить эту полку?',
'shelves_permissions' => 'Доступы к книжной полке',
'shelves_permissions_updated' => 'Доступы к книжной полке обновлены',
'shelves_permissions_active' => 'Доступы к книжной полке активны',
'shelves_copy_permissions_to_books' => 'Наследовать доступы книгам',
'shelves_copy_permissions' => 'Копировать доступы',
'shelves_copy_permissions_explain' => 'Это применит текущие настройки доступов этой книжной полки ко всем книгам, содержащимся внутри. Перед активацией убедитесь, что все изменения в доступах этой книжной полки сохранены.',
'shelves_copy_permission_success' => 'Доступы книжной полки скопированы для :count books',
/**
* Chapters
*/
@ -206,6 +238,7 @@ return [
'page_tags' => 'Теги страницы',
'chapter_tags' => 'Теги главы',
'book_tags' => 'Теги книги',
'shelf_tags' => 'Теги полки',
'tag' => 'Тег',
'tags' => 'Теги',
'tag_value' => 'Значение тега (опционально)',

View File

@ -28,16 +28,6 @@ class AttachmentTest extends TestCase
return $this->call('POST', '/attachments/upload', ['uploaded_to' => $uploadedTo], [], ['file' => $file], []);
}
/**
* Get the expected upload path for a file.
* @param $fileName
* @return string
*/
protected function getUploadPath($fileName)
{
return 'uploads/files/' . Date('Y-m-M') . '/' . $fileName;
}
/**
* Delete all uploaded files.
* To assist with cleanup.
@ -64,17 +54,34 @@ class AttachmentTest extends TestCase
'order' => 1,
'created_by' => $admin->id,
'updated_by' => $admin->id,
'path' => $this->getUploadPath($fileName)
];
$upload = $this->uploadFile($fileName, $page->id);
$upload->assertStatus(200);
$attachment = Attachment::query()->orderBy('id', 'desc')->first();
$expectedResp['path'] = $attachment->path;
$upload->assertJson($expectedResp);
$this->assertDatabaseHas('attachments', $expectedResp);
$this->deleteUploads();
}
public function test_file_upload_does_not_use_filename()
{
$page = Page::first();
$fileName = 'upload_test_file.txt';
$upload = $this->asAdmin()->uploadFile($fileName, $page->id);
$upload->assertStatus(200);
$attachment = Attachment::query()->orderBy('id', 'desc')->first();
$this->assertNotContains($fileName, $attachment->path);
$this->assertStringEndsWith('.txt', $attachment->path);
}
public function test_file_display_and_access()
{
$page = Page::first();
@ -172,7 +179,8 @@ class AttachmentTest extends TestCase
$fileName = 'deletion_test.txt';
$this->uploadFile($fileName, $page->id);
$filePath = base_path('storage/' . $this->getUploadPath($fileName));
$attachment = Attachment::query()->orderBy('id', 'desc')->first();
$filePath = storage_path($attachment->path);
$this->assertTrue(file_exists($filePath), 'File at path ' . $filePath . ' does not exist');
$attachment = \BookStack\Uploads\Attachment::first();
@ -193,7 +201,8 @@ class AttachmentTest extends TestCase
$fileName = 'deletion_test.txt';
$this->uploadFile($fileName, $page->id);
$filePath = base_path('storage/' . $this->getUploadPath($fileName));
$attachment = Attachment::query()->orderBy('id', 'desc')->first();
$filePath = storage_path($attachment->path);
$this->assertTrue(file_exists($filePath), 'File at path ' . $filePath . ' does not exist');
$this->assertDatabaseHas('attachments', [

View File

@ -39,13 +39,69 @@ class ImageTest extends TestCase
]);
}
public function test_php_files_cannot_be_uploaded()
{
$page = Page::first();
$admin = $this->getAdmin();
$this->actingAs($admin);
$fileName = 'bad.php';
$relPath = $this->getTestImagePath('gallery', $fileName);
$this->deleteImage($relPath);
$file = $this->getTestImage($fileName);
$upload = $this->withHeader('Content-Type', 'image/jpeg')->call('POST', '/images/gallery/upload', ['uploaded_to' => $page->id], [], ['file' => $file], []);
$upload->assertStatus(302);
$this->assertFalse(file_exists(public_path($relPath)), 'Uploaded php file was uploaded but should have been stopped');
$this->assertDatabaseMissing('images', [
'type' => 'gallery',
'name' => $fileName
]);
}
public function test_php_like_files_cannot_be_uploaded()
{
$page = Page::first();
$admin = $this->getAdmin();
$this->actingAs($admin);
$fileName = 'bad.phtml';
$relPath = $this->getTestImagePath('gallery', $fileName);
$this->deleteImage($relPath);
$file = $this->getTestImage($fileName);
$upload = $this->withHeader('Content-Type', 'image/jpeg')->call('POST', '/images/gallery/upload', ['uploaded_to' => $page->id], [], ['file' => $file], []);
$upload->assertStatus(302);
$this->assertFalse(file_exists(public_path($relPath)), 'Uploaded php file was uploaded but should have been stopped');
}
public function test_files_with_double_extensions_cannot_be_uploaded()
{
$page = Page::first();
$admin = $this->getAdmin();
$this->actingAs($admin);
$fileName = 'bad.phtml.png';
$relPath = $this->getTestImagePath('gallery', $fileName);
$this->deleteImage($relPath);
$file = $this->getTestImage($fileName);
$upload = $this->withHeader('Content-Type', 'image/png')->call('POST', '/images/gallery/upload', ['uploaded_to' => $page->id], [], ['file' => $file], []);
$upload->assertStatus(302);
$this->assertFalse(file_exists(public_path($relPath)), 'Uploaded double extension file was uploaded but should have been stopped');
}
public function test_secure_images_uploads_to_correct_place()
{
config()->set('filesystems.default', 'local_secure');
$this->asEditor();
$galleryFile = $this->getTestImage('my-secure-test-upload');
$galleryFile = $this->getTestImage('my-secure-test-upload.png');
$page = Page::first();
$expectedPath = storage_path('uploads/images/gallery/' . Date('Y-m-M') . '/my-secure-test-upload');
$expectedPath = storage_path('uploads/images/gallery/' . Date('Y-m-M') . '/my-secure-test-upload.png');
$upload = $this->call('POST', '/images/gallery/upload', ['uploaded_to' => $page->id], [], ['file' => $galleryFile], []);
$upload->assertStatus(200);
@ -61,9 +117,9 @@ class ImageTest extends TestCase
{
config()->set('filesystems.default', 'local_secure');
$this->asEditor();
$galleryFile = $this->getTestImage('my-secure-test-upload');
$galleryFile = $this->getTestImage('my-secure-test-upload.png');
$page = Page::first();
$expectedPath = storage_path('uploads/images/gallery/' . Date('Y-m-M') . '/my-secure-test-upload');
$expectedPath = storage_path('uploads/images/gallery/' . Date('Y-m-M') . '/my-secure-test-upload.png');
$upload = $this->call('POST', '/images/gallery/upload', ['uploaded_to' => $page->id], [], ['file' => $galleryFile], []);
$imageUrl = json_decode($upload->getContent(), true)['url'];
@ -84,9 +140,9 @@ class ImageTest extends TestCase
{
config()->set('filesystems.default', 'local_secure');
$this->asEditor();
$galleryFile = $this->getTestImage('my-system-test-upload');
$galleryFile = $this->getTestImage('my-system-test-upload.png');
$page = Page::first();
$expectedPath = public_path('uploads/images/system/' . Date('Y-m-M') . '/my-system-test-upload');
$expectedPath = public_path('uploads/images/system/' . Date('Y-m-M') . '/my-system-test-upload.png');
$upload = $this->call('POST', '/images/system/upload', ['uploaded_to' => $page->id], [], ['file' => $galleryFile], []);
$upload->assertStatus(200);

View File

@ -1,6 +1,8 @@
<?php namespace Tests\Uploads;
use Illuminate\Http\UploadedFile;
trait UsesImages
{
/**
@ -15,11 +17,11 @@ trait UsesImages
/**
* Get a test image that can be uploaded
* @param $fileName
* @return \Illuminate\Http\UploadedFile
* @return UploadedFile
*/
protected function getTestImage($fileName)
{
return new \Illuminate\Http\UploadedFile($this->getTestImageFilePath(), $fileName, 'image/png', 5238);
return new UploadedFile($this->getTestImageFilePath(), $fileName, 'image/png', 5238, null, true);
}
/**
@ -46,12 +48,14 @@ trait UsesImages
* Uploads an image with the given name.
* @param $name
* @param int $uploadedTo
* @param string $contentType
* @return \Illuminate\Foundation\Testing\TestResponse
*/
protected function uploadImage($name, $uploadedTo = 0)
protected function uploadImage($name, $uploadedTo = 0, $contentType = 'image/png')
{
$file = $this->getTestImage($name);
return $this->call('POST', '/images/gallery/upload', ['uploaded_to' => $uploadedTo], [], ['file' => $file], []);
return $this->withHeader('Content-Type', $contentType)
->call('POST', '/images/gallery/upload', ['uploaded_to' => $uploadedTo], [], ['file' => $file], []);
}
/**

BIN
tests/test-data/bad.php Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 B

BIN
tests/test-data/bad.phtml Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B