mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-11-26 10:13:38 +08:00
Merge branch 'master' into 2019-design
This commit is contained in:
commit
53a26a365c
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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); ?>";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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.
|
||||
|
|
48
resources/lang/cs/activities.php
Normal file
48
resources/lang/cs/activities.php
Normal 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',
|
||||
];
|
65
resources/lang/cs/auth.php
Normal file
65
resources/lang/cs/auth.php
Normal 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',
|
||||
];
|
59
resources/lang/cs/common.php
Normal file
59
resources/lang/cs/common.php
Normal 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',
|
||||
];
|
33
resources/lang/cs/components.php
Normal file
33
resources/lang/cs/components.php
Normal 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',
|
||||
];
|
294
resources/lang/cs/entities.php
Normal file
294
resources/lang/cs/entities.php
Normal 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.'
|
||||
|
||||
];
|
84
resources/lang/cs/errors.php
Normal file
84
resources/lang/cs/errors.php
Normal 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.',
|
||||
|
||||
];
|
12
resources/lang/cs/pagination.php
Normal file
12
resources/lang/cs/pagination.php
Normal 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' => '« Pøedchozí',
|
||||
'next' => 'Další »',
|
||||
|
||||
];
|
15
resources/lang/cs/passwords.php
Normal file
15
resources/lang/cs/passwords.php
Normal 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!',
|
||||
|
||||
];
|
117
resources/lang/cs/settings.php
Normal file
117
resources/lang/cs/settings.php
Normal 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.'
|
||||
];
|
152
resources/lang/cs/validation.php
Normal file
152
resources/lang/cs/validation.php
Normal 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',
|
||||
],
|
||||
];
|
|
@ -146,6 +146,7 @@ return [
|
|||
'nl' => 'Nederlands',
|
||||
'pt_BR' => 'Português do Brasil',
|
||||
'sk' => 'Slovensky',
|
||||
'cs' => 'Česky',
|
||||
'sv' => 'Svenska',
|
||||
'kr' => '한국어',
|
||||
'ja' => '日本語',
|
||||
|
|
|
@ -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' => [
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
|
@ -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' => 'Значение тега (опционально)',
|
||||
|
|
|
@ -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', [
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
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
BIN
tests/test-data/bad.phtml
Normal file
Binary file not shown.
After Width: | Height: | Size: 560 B |
BIN
tests/test-data/bad.phtml.png
Normal file
BIN
tests/test-data/bad.phtml.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 158 B |
Loading…
Reference in New Issue
Block a user