From 239b3c8c2b7cdca4aff37817d783f6f4ac7cfbb7 Mon Sep 17 00:00:00 2001 From: Luca Guindani Date: Fri, 7 Jun 2019 17:06:54 +0200 Subject: [PATCH 01/13] Updated french translation files --- resources/lang/fr/auth.php | 4 +++- resources/lang/fr/common.php | 13 +++++++++++-- resources/lang/fr/entities.php | 12 +++++++++++- resources/lang/fr/settings.php | 26 ++++++++++++++++++++++---- resources/lang/fr/validation.php | 3 +++ 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/resources/lang/fr/auth.php b/resources/lang/fr/auth.php index 934dd56da..c9ce6a4d7 100644 --- a/resources/lang/fr/auth.php +++ b/resources/lang/fr/auth.php @@ -32,6 +32,8 @@ return [ 'remember_me' => 'Se souvenir de moi', 'ldap_email_hint' => "Merci d'entrer une adresse e-mail pour ce compte", 'create_account' => 'Créer un compte', + 'already_have_account' => 'Vous avez déjà un compte?', + 'dont_have_account' => 'Vous n\'avez pas de compte?', 'social_login' => 'Social Login', 'social_registration' => 'Enregistrement Social', 'social_registration_text' => "S'inscrire et se connecter avec un réseau social", @@ -73,4 +75,4 @@ return [ 'email_not_confirmed_click_link' => 'Merci de cliquer sur le lien dans l\'e-mail qui vous a été envoyé après l\'enregistrement.', 'email_not_confirmed_resend' => 'Si vous ne retrouvez plus l\'e-mail, vous pouvez renvoyer un e-mail de confirmation en utilisant le formulaire ci-dessous.', 'email_not_confirmed_resend_button' => 'Renvoyez l\'e-mail de confirmation', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr/common.php b/resources/lang/fr/common.php index 3bff2841b..1cf6e716f 100644 --- a/resources/lang/fr/common.php +++ b/resources/lang/fr/common.php @@ -10,6 +10,7 @@ return [ 'save' => 'Enregistrer', 'continue' => 'Continuer', 'select' => 'Sélectionner', + 'toggle_all' => 'Tout sélectionner', 'more' => 'Montrer plus', /** @@ -19,13 +20,14 @@ return [ 'description' => 'Description', 'role' => 'Rôle', 'cover_image' => 'Image de couverture', - 'cover_image_description' => 'Cette image doit être environ 300x170px.', + 'cover_image_description' => 'Cette image doit être environ 440x250px.', /** * Actions */ 'actions' => 'Actions', 'view' => 'Voir', + 'view_all' => 'Tout afficher', 'create' => 'Créer', 'update' => 'Modifier', 'edit' => 'Editer', @@ -40,6 +42,13 @@ return [ 'remove' => 'Enlever', 'add' => 'Ajouter', + /** + * Sort Options + */ + 'sort_name' => 'Nom', + 'sort_created_at' => 'Date de création', + 'sort_updated_at' => 'Date de mise à jour', + /** * Misc */ @@ -65,4 +74,4 @@ return [ */ 'email_action_help' => 'Si vous rencontrez des problèmes pour cliquer sur le bouton ":actionText", copiez et collez l\'adresse ci-dessous dans votre navigateur :', 'email_rights' => 'Tous droits réservés', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr/entities.php b/resources/lang/fr/entities.php index b07a5c465..4ba1a36e3 100644 --- a/resources/lang/fr/entities.php +++ b/resources/lang/fr/entities.php @@ -9,6 +9,7 @@ return [ 'recently_updated_pages' => 'Pages mises à jour récemment', 'recently_created_chapters' => 'Chapitres créés récemment', 'recently_created_books' => 'Livres créés récemment', + 'recently_created_shelves' => 'Étagères créés récemment', 'recently_update' => 'Mis à jour récemment', 'recently_viewed' => 'Vus récemment', 'recent_activity' => 'Activité récente', @@ -71,11 +72,13 @@ return [ */ 'shelf' => 'Étagère', 'shelves' => 'Étagères', + 'x_shelves' => ':count Étagère|:count Étagères', 'shelves_long' => 'Étagères', 'shelves_empty' => 'Aucune étagère n\'a été créée', 'shelves_create' => 'Créer une nouvelle étagère', 'shelves_popular' => 'Étagères populaires', 'shelves_new' => 'Nouvelles Étagères', + 'shelves_new_action' => 'Nouvelle Étagère', 'shelves_popular_empty' => 'Les étagères les plus populaires apparaîtront ici.', 'shelves_new_empty' => 'Les étagères les plus récentes apparaitront ici.', 'shelves_save' => 'Enregistrer l\'étagère', @@ -108,6 +111,7 @@ return [ 'books_popular' => 'Livres populaires', 'books_recent' => 'Livres récents', 'books_new' => 'Nouveaux livres', + 'books_new_action' => 'Nouveau livre', 'books_popular_empty' => 'Les livres les plus populaires apparaîtront ici.', 'books_new_empty' => 'Les livres les plus récents apparaitront ici.', 'books_create' => 'Créer un nouveau livre', @@ -131,6 +135,11 @@ return [ 'books_navigation' => 'Navigation dans le livre', 'books_sort' => 'Trier les contenus du livre', 'books_sort_named' => 'Trier le livre :bookName', + 'books_sort_name' => 'Trier par le nom', + 'books_sort_created' => 'Trier par la date de création', + 'books_sort_updated' => 'Trier par la date de mise à jour', + 'books_sort_chapters_first' => 'Les chapitres en premier', + 'books_sort_chapters_last' => 'Les chapitres en dernier', 'books_sort_show_other' => 'Afficher d\'autres livres', 'books_sort_save' => 'Enregistrer l\'ordre', @@ -281,6 +290,7 @@ return [ 'profile_not_created_pages' => ':userName n\'a pas créé de page', 'profile_not_created_chapters' => ':userName n\'a pas créé de chapitre', 'profile_not_created_books' => ':userName n\'a pas créé de livre', + 'profile_not_created_shelves' => ':userName n\'a pas créé d\'étagère', /** * Comments @@ -308,4 +318,4 @@ return [ 'revision_delete_confirm' => 'Êtes-vous sûr de vouloir supprimer cette révision?', 'revision_delete_success' => 'Révision supprimée', 'revision_cannot_delete_latest' => 'Impossible de supprimer la dernière révision.' -]; \ No newline at end of file +]; diff --git a/resources/lang/fr/settings.php b/resources/lang/fr/settings.php index 4251fe87d..f978114c5 100644 --- a/resources/lang/fr/settings.php +++ b/resources/lang/fr/settings.php @@ -16,12 +16,18 @@ return [ * App settings */ - 'app_settings' => 'Préférences de l\'application', + 'app_customization' => 'Personnalisation', + 'app_features_security' => 'Fonctionnalités et sécurité', 'app_name' => 'Nom de l\'application', 'app_name_desc' => 'Ce nom est affiché dans l\'en-tête et les e-mails.', 'app_name_header' => 'Afficher le nom dans l\'en-tête ?', + 'app_public_access' => 'Accès public', + 'app_public_access_desc' => 'L\'activation de cette option permettra aux visiteurs, qui ne sont pas connectés, d\'accéder au contenu de votre instance BookStack.', + 'app_public_access_desc_guest' => 'L\'accès pour les visiteurs publics peut être contrôlé par l\'utilisateur "Guest".', + 'app_public_access_toggle' => 'Autoriser l\'accès public', 'app_public_viewing' => 'Accepter le visionnage public des pages ?', 'app_secure_images' => 'Activer l\'ajout d\'image sécurisé ?', + 'app_secure_images_toggle' => 'Activer l\'ajout d\'image sécurisé', 'app_secure_images_desc' => 'Pour des questions de performances, toutes les images sont publiques. Cette option ajoute une chaîne aléatoire difficile à deviner dans les URLs des images.', 'app_editor' => 'Editeur des pages', 'app_editor_desc' => 'Sélectionnez l\'éditeur qui sera utilisé pour modifier les pages.', @@ -35,6 +41,7 @@ return [ 'app_homepage_desc' => 'Choisissez une page à afficher sur la page d\'accueil au lieu de la vue par défaut. Les permissions sont ignorées pour les pages sélectionnées.', 'app_homepage_select' => 'Choisissez une page', 'app_disable_comments' => 'Désactiver les commentaires', + 'app_disable_comments_toggle' => 'Désactiver les commentaires', 'app_disable_comments_desc' => 'Désactive les commentaires sur toutes les pages de l\'application. Les commentaires existants ne sont pas affichés.', /** @@ -42,9 +49,12 @@ return [ */ 'reg_settings' => 'Préférence pour l\'inscription', - 'reg_allow' => 'Accepter l\'inscription ?', + 'reg_enable' => 'Activer l\'inscription', + 'reg_enable_toggle' => 'Activer l\'inscription', + 'reg_enable_desc' => 'Lorsque l\'inscription est activée, l\'utilisateur pourra s\'enregistrer en tant qu\'utilisateur de l\'application. Lors de l\'inscription, ils se voient attribuer un rôle par défaut.', 'reg_default_role' => 'Rôle par défaut lors de l\'inscription', - 'reg_confirm_email' => 'Obliger la confirmation par e-mail ?', + 'reg_email_confirmation' => 'Confirmation de l\'e-mail', + 'reg_email_confirmation_toggle' => 'Obliger la confirmation par e-mail ?', 'reg_confirm_email_desc' => 'Si la restriction de domaine est activée, la confirmation sera automatiquement obligatoire et cette valeur sera ignorée.', 'reg_confirm_restrict_domain' => 'Restreindre l\'inscription à un domaine', 'reg_confirm_restrict_domain_desc' => 'Entrez une liste de domaines acceptés lors de l\'inscription, séparés par une virgule. Les utilisateurs recevront un e-mail de confirmation à cette adresse.
Les utilisateurs pourront changer leur adresse après inscription s\'ils le souhaitent.', @@ -107,8 +117,15 @@ return [ 'user_profile' => 'Profil d\'utilisateur', 'users_add_new' => 'Ajouter un nouvel utilisateur', 'users_search' => 'Chercher les utilisateurs', - 'users_role' => 'Rôles des utilisateurs', + 'users_details' => 'Informations de l\'utilisateur', + 'users_details_desc' => 'Définissez un nom et une adresse e-mail pour cet utilisateur. L\'adresse e-mail sera utilisée pour se connecter à l\'application.', + 'users_details_desc_no_email' => 'Définissez un nom d\'affichage pour cet utilisateur afin que les autres puissent le reconnaître.', + 'users_role' => 'Rôles de l\'utilisateur', + 'users_role_desc' => 'Sélectionnez les rôles auxquels cet utilisateur sera affecté. Si un utilisateur est affecté à plusieurs rôles, les permissions de ces rôles s\'empileront et ils recevront toutes les capacités des rôles affectés.', + 'users_password' => 'Mot de passe de l\'utilisateur', + 'users_password_desc' => 'Définissez un mot de passe utilisé pour vous connecter à l\'application. Il doit comporter au moins 5 caractères.', 'users_external_auth_id' => 'Identifiant d\'authentification externe', + 'users_external_auth_id_desc' => 'Il s\'agit de l\'identifiant utilisé pour appairer cet utilisateur lors de la communication avec votre système LDAP.', 'users_password_warning' => 'Remplissez ce formulaire uniquement si vous souhaitez changer de mot de passe:', 'users_system_public' => 'Cet utilisateur représente les invités visitant votre instance. Il est assigné automatiquement aux invités.', 'users_delete' => 'Supprimer un utilisateur', @@ -122,6 +139,7 @@ return [ 'users_avatar' => 'Avatar de l\'utilisateur', 'users_avatar_desc' => 'Cette image doit être un carré d\'environ 256px.', 'users_preferred_language' => 'Langue préférée', + 'users_preferred_language_desc' => 'Cette option changera la langue utilisée pour l\'interface utilisateur de l\'application. Ceci n\'affectera aucun contenu créé par l\'utilisateur.', 'users_social_accounts' => 'Comptes sociaux', 'users_social_accounts_info' => 'Vous pouvez connecter des réseaux sociaux à votre compte pour vous connecter plus rapidement. Déconnecter un compte n\'enlèvera pas les accès autorisés précédemment sur votre compte de réseau social.', 'users_social_connect' => 'Connecter le compte', diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index 9204f4e2d..4be55df4f 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -38,6 +38,7 @@ return [ 'filled' => ':attribute est un champ requis.', 'exists' => 'L\'attribut :attribute est invalide.', 'image' => ':attribute doit être une image.', + 'image_extension' => ':attribute doit avoir une extension d\'image valide et supportée.', 'in' => 'L\'attribut :attribute est invalide.', 'integer' => ':attribute doit être un chiffre entier.', 'ip' => ':attribute doit être une adresse IP valide.', @@ -54,6 +55,7 @@ return [ 'string' => ':attribute doit contenir au moins :min caractères.', 'array' => ':attribute doit contenir au moins :min éléments.', ], + 'no_double_extension' => ':attribute ne doit avoir qu\'une seule extension de fichier.', 'not_in' => 'L\'attribut sélectionné :attribute est invalide.', 'numeric' => ':attribute doit être un nombre.', 'regex' => ':attribute a un format invalide.', @@ -74,6 +76,7 @@ return [ 'timezone' => ':attribute doit être une zone valide.', 'unique' => ':attribute est déjà utilisé.', 'url' => ':attribute a un format invalide.', + 'uploaded' => 'Le fichier n\'a pas pu être envoyé. Le serveur peut ne pas accepter des fichiers de cette taille.', /* |-------------------------------------------------------------------------- From 94441832c529cef36eb2c31f8f0a8b234f0a2f83 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 7 Jul 2019 13:54:17 +0100 Subject: [PATCH 02/13] Removed old translation endpoint tests --- tests/LanguageTest.php | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/tests/LanguageTest.php b/tests/LanguageTest.php index 91abadc91..d9b8655ee 100644 --- a/tests/LanguageTest.php +++ b/tests/LanguageTest.php @@ -41,21 +41,6 @@ class LanguageTest extends TestCase $loginPageFrenchReq->assertDontSee('Se Connecter'); } - public function test_js_endpoint_for_each_language() - { - - $visibleKeys = ['common', 'components', 'entities', 'errors']; - - $this->asEditor(); - foreach ($this->langs as $lang) { - setting()->putUser($this->getEditor(), 'language', $lang); - $transResp = $this->get('/translations'); - foreach ($visibleKeys as $key) { - $transResp->assertSee($key); - } - } - } - public function test_all_lang_files_loadable() { $files = array_diff(scandir(resource_path('lang/en')), ['..', '.']); @@ -98,13 +83,4 @@ class LanguageTest extends TestCase $this->assertNotEquals($enEmailActionHelp, $deInformalEmailActionHelp); } - public function test_de_informal_falls_base_to_de_in_js_endpoint() - { - $this->asEditor(); - setting()->putUser($this->getEditor(), 'language', 'de_informal'); - - $transResp = $this->get('/translations'); - $transResp->assertSee('"cancel":"Abbrechen"'); - } - } \ No newline at end of file From c732970f6e19f14a1107b7429cbf387bcb7848b3 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Wed, 10 Jul 2019 20:17:22 +0100 Subject: [PATCH 03/13] Hardened page content script escaping Increased range of tests to cover. Fixes #1531 --- app/Entities/Repos/EntityRepo.php | 4 +-- tests/Entity/PageContentTest.php | 48 +++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/app/Entities/Repos/EntityRepo.php b/app/Entities/Repos/EntityRepo.php index 4edd61723..aad9a1205 100644 --- a/app/Entities/Repos/EntityRepo.php +++ b/app/Entities/Repos/EntityRepo.php @@ -760,13 +760,13 @@ class EntityRepo $xPath = new DOMXPath($doc); // Remove standard script tags - $scriptElems = $xPath->query('//body//*//script'); + $scriptElems = $xPath->query('//script'); foreach ($scriptElems as $scriptElem) { $scriptElem->parentNode->removeChild($scriptElem); } // Remove 'on*' attributes - $onAttributes = $xPath->query('//body//*/@*[starts-with(name(), \'on\')]'); + $onAttributes = $xPath->query('//@*[starts-with(name(), \'on\')]'); foreach ($onAttributes as $attr) { /** @var \DOMAttr $attr*/ $attrName = $attr->nodeName; diff --git a/tests/Entity/PageContentTest.php b/tests/Entity/PageContentTest.php index 6201cf5d7..c80b5f1d9 100644 --- a/tests/Entity/PageContentTest.php +++ b/tests/Entity/PageContentTest.php @@ -84,6 +84,31 @@ class PageContentTest extends TestCase $pageView->assertSee('abc123abc123'); } + public function test_more_complex_content_script_escaping_scenarios() + { + $checks = [ + "

Some script

", + "

Some script

", + "

Some script

", + "

Some script

", + "

Some script

", + "

Some script

", + ]; + + $this->asEditor(); + $page = Page::first(); + + foreach ($checks as $check) { + $page->html = $check; + $page->save(); + + $pageView = $this->get($page->getUrl()); + $pageView->assertElementNotContains('.page-content', ''); + } + + } + public function test_page_inline_on_attributes_removed_by_default() { $this->asEditor(); @@ -97,6 +122,29 @@ class PageContentTest extends TestCase $pageView->assertSee('

Hello

'); } + public function test_more_complex_inline_on_attributes_escaping_scenarios() + { + $checks = [ + '

Hello

', + '
Lorem ipsum dolor sit amet.

Hello

', + '
Lorem ipsum dolor sit amet.

Hello

', + '
Lorem ipsum dolor sit amet.

Hello

', + '
Lorem ipsum dolor sit amet.

Hello

', + ]; + + $this->asEditor(); + $page = Page::first(); + + foreach ($checks as $check) { + $page->html = $check; + $page->save(); + + $pageView = $this->get($page->getUrl()); + $pageView->assertElementNotContains('.page-content', 'onclick'); + } + + } + public function test_page_content_scripts_show_when_configured() { $this->asEditor(); From 94f610d04087fc1220b36b72e7ab17073781dad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Luiz=20da=20Silva?= Date: Thu, 11 Jul 2019 19:30:00 -0300 Subject: [PATCH 04/13] Fix pt_BR translations --- resources/lang/pt_BR/activities.php | 12 ++-- resources/lang/pt_BR/auth.php | 31 +++----- resources/lang/pt_BR/common.php | 38 +++++----- resources/lang/pt_BR/components.php | 11 ++- resources/lang/pt_BR/entities.php | 107 +++++++++++++--------------- resources/lang/pt_BR/errors.php | 10 +-- resources/lang/pt_BR/pagination.php | 17 ++--- resources/lang/pt_BR/passwords.php | 17 ++--- resources/lang/pt_BR/settings.php | 72 ++++++++++--------- resources/lang/pt_BR/validation.php | 47 ++++-------- 10 files changed, 156 insertions(+), 206 deletions(-) diff --git a/resources/lang/pt_BR/activities.php b/resources/lang/pt_BR/activities.php index 03ff80c9f..91417cc8b 100644 --- a/resources/lang/pt_BR/activities.php +++ b/resources/lang/pt_BR/activities.php @@ -1,12 +1,10 @@ 'página criada', 'page_create_notification' => 'Página criada com sucesso', diff --git a/resources/lang/pt_BR/auth.php b/resources/lang/pt_BR/auth.php index 73228f21a..20dc690af 100644 --- a/resources/lang/pt_BR/auth.php +++ b/resources/lang/pt_BR/auth.php @@ -1,21 +1,15 @@ 'As credenciais fornecidas não puderam ser validadas em nossos registros..', 'throttle' => 'Muitas tentativas de login. Por favor, tente novamente em :seconds segundos.', - /** - * Login & Register - */ + // Login & Register 'sign_up' => 'Registrar-se', 'log_in' => 'Entrar', 'log_in_with' => 'Entrar com :socialDriver', @@ -32,6 +26,8 @@ return [ 'remember_me' => 'Lembrar de mim', 'ldap_email_hint' => 'Por favor, digite um e-mail para essa conta.', 'create_account' => 'Criar conta', + 'already_have_account' => 'Você já possui uma conta?', + 'dont_have_account' => 'Não possui uma conta?', 'social_login' => 'Login social', 'social_registration' => 'Registro social', 'social_registration_text' => 'Registre e entre usando outro serviço.', @@ -43,23 +39,18 @@ return [ 'register_success' => 'Obrigado por se registrar! Você agora encontra-se registrado e logado..', - /** - * Password Reset - */ + // Password Reset 'reset_password' => 'Resetar senha', 'reset_password_send_instructions' => 'Digite seu e-mail abaixo e o sistema enviará uma mensagem com o link de reset de senha.', 'reset_password_send_button' => 'Enviar o link de reset de senha', 'reset_password_sent_success' => 'Um link de reset de senha foi enviado para :email.', 'reset_password_success' => 'Sua senha foi resetada com sucesso.', - 'email_reset_subject' => 'Resetar a senha de :appName', 'email_reset_text' => 'Você recebeu esse e-mail pois recebemos uma solicitação de reset de senha para sua conta.', 'email_reset_not_requested' => 'Caso não tenha sido você a solicitar o reset de senha, ignore esse e-mail.', - /** - * Email Confirmation - */ + // Email Confirmation 'email_confirm_subject' => 'Confirme seu e-mail para :appName', 'email_confirm_greeting' => 'Obrigado por se registrar em :appName!', 'email_confirm_text' => 'Por favor, confirme seu endereço de e-mail clicando no botão abaixo:', diff --git a/resources/lang/pt_BR/common.php b/resources/lang/pt_BR/common.php index 0741541eb..c6750a954 100644 --- a/resources/lang/pt_BR/common.php +++ b/resources/lang/pt_BR/common.php @@ -1,31 +1,30 @@ 'Cancelar', 'confirm' => 'Confirmar', 'back' => 'Voltar', 'save' => 'Salvar', 'continue' => 'Continuar', 'select' => 'Selecionar', + 'toggle_all' => 'Alternar Tudo', 'more' => 'Mais', - /** - * Form Labels - */ + // Form Labels 'name' => 'Nome', 'description' => 'Descrição', 'role' => 'Regra', 'cover_image' => 'Imagem de capa', 'cover_image_description' => 'Esta imagem deve ser aproximadamente 300x170px.', - /** - * Actions - */ + // Actions 'actions' => 'Ações', 'view' => 'Visualizar', + 'view_all' => 'Ver Tudo', 'create' => 'Criar', 'update' => 'Atualizar', 'edit' => 'Editar', @@ -40,9 +39,12 @@ return [ 'remove' => 'Remover', 'add' => 'Adicionar', - /** - * Misc - */ + // Sort Options + 'sort_name' => 'Nome', + 'sort_created_at' => 'Data de Criação', + 'sort_updated_at' => 'Data de Atualização', + + // Misc 'deleted_user' => 'Usuário excluído', 'no_activity' => 'Nenhuma atividade a mostrar', 'no_items' => 'Nenhum item disponível', @@ -54,15 +56,15 @@ return [ 'list_view' => 'Visualização em Lista', 'default' => 'Padrão', - /** - * Header - */ + // Header 'view_profile' => 'Visualizar Perfil', 'edit_profile' => 'Editar Perfil', - /** - * Email Content - */ + // Layout tabs + 'tab_info' => 'Info', + 'tab_content' => 'Conteúdo', + + // Email Content 'email_action_help' => 'Se você estiver tendo problemas ao clicar o botão ":actionText", copie e cole a URL abaixo no seu navegador:', 'email_rights' => 'Todos os direitos reservados', ]; \ No newline at end of file diff --git a/resources/lang/pt_BR/components.php b/resources/lang/pt_BR/components.php index 4ea4d88c5..b9f1c3a38 100644 --- a/resources/lang/pt_BR/components.php +++ b/resources/lang/pt_BR/components.php @@ -1,9 +1,10 @@ 'Selecionar imagem', 'image_all' => 'Todos', 'image_all_title' => 'Visualizar todas as imagens', @@ -24,9 +25,7 @@ return [ 'image_delete_success' => 'Imagem excluída com sucesso', 'image_upload_remove' => 'Remover', - /** - * Code editor - */ + // Code editor 'code_editor' => 'Editar Código', 'code_language' => 'Linguagem do Código', 'code_content' => 'Código', diff --git a/resources/lang/pt_BR/entities.php b/resources/lang/pt_BR/entities.php index 9e6678146..7ce5ef01e 100644 --- a/resources/lang/pt_BR/entities.php +++ b/resources/lang/pt_BR/entities.php @@ -1,17 +1,20 @@ 'Recentemente criado', - 'recently_created_pages' => 'Páginas recentemente criadas', - 'recently_updated_pages' => 'Páginas recentemente atualizadas', - 'recently_created_chapters' => 'Capítulos recentemente criados', - 'recently_created_books' => 'Livros recentemente criados', - 'recently_update' => 'Recentemente atualizado', - 'recently_viewed' => 'Recentemente visualizado', - 'recent_activity' => 'Atividade recente', + // Shared + 'recently_created' => 'Recentemente Criado', + 'recently_created_pages' => 'Páginas Recentemente Criadas', + 'recently_updated_pages' => 'Páginas Recentemente Atualizadas', + 'recently_created_chapters' => 'Capítulos Recentemente Criados', + 'recently_created_books' => 'Livros Recentemente Criados', + 'recently_created_shelves' => 'Prateleiras Recentemente Criadas', + 'recently_update' => 'Recentemente Atualizado', + 'recently_viewed' => 'Recentemente Visualizado', + 'recent_activity' => 'Atividade Recente', 'create_now' => 'Criar um agora', 'revisions' => 'Revisões', 'meta_revision' => 'Revisão #:revisionCount', @@ -31,17 +34,13 @@ return [ 'export_pdf' => 'Arquivo PDF', 'export_text' => 'Arquivo Texto', - /** - * Permissions and restrictions - */ + // Permissions and restrictions 'permissions' => 'Permissões', 'permissions_intro' => 'Uma vez habilitado, as permissões terão prioridade sobre outro conjunto de permissões.', 'permissions_enable' => 'Habilitar Permissões Customizadas', 'permissions_save' => 'Salvar Permissões', - /** - * Search - */ + // Search 'search_results' => 'Resultado(s) da Pesquisa', 'search_total_results_found' => ':count resultado encontrado|:count resultados encontrados', 'search_clear' => 'Limpar Pesquisa', @@ -66,16 +65,16 @@ return [ 'search_set_date' => 'Definir data', 'search_update' => 'Refazer Pesquisa', - /** - * Shelves - */ + // Shelves 'shelf' => 'Prateleira', 'shelves' => 'Prateleiras', + 'x_shelves' => ':count Prateleira|:count Prateleiras', 'shelves_long' => 'Prateleiras de Livros', 'shelves_empty' => 'Nenhuma prateleira foi criada', - 'shelves_create' => 'Criar nova Prateleira', - 'shelves_popular' => 'Prateleiras populares', - 'shelves_new' => 'Prateleiras novas', + 'shelves_create' => 'Criar Nova Prateleira', + 'shelves_popular' => 'Prateleiras Populares', + 'shelves_new' => 'Prateleiras Novas', + 'shelves_new_action' => 'Nova Prateleira', 'shelves_popular_empty' => 'As prateleiras mais populares aparecerão aqui.', 'shelves_new_empty' => 'As prateleiras criadas mais recentemente aparecerão aqui.', 'shelves_save' => 'Salvar Prateleira', @@ -98,16 +97,15 @@ return [ 'shelves_copy_permissions_explain' => 'Isto aplicará as configurações de permissões atuais desta prateleira de livros a todos os livros contidos nela. Antes de ativar, assegure-se de que quaisquer alterações nas permissões desta prateleira de livros tenham sido salvas.', 'shelves_copy_permission_success' => 'Permissões da prateleira de livros copiada para :count livros', - /** - * Books - */ + // Books 'book' => 'Livro', 'books' => 'Livros', 'x_books' => ':count Livro|:count Livros', 'books_empty' => 'Nenhum livro foi criado', - 'books_popular' => 'Livros populares', - 'books_recent' => 'Livros recentes', - 'books_new' => 'Livros novos', + 'books_popular' => 'Livros Populares', + 'books_recent' => 'Livros Recentes', + 'books_new' => 'Livros Novos', + 'books_new_action' => 'Novo Livro', 'books_popular_empty' => 'Os livros mais populares aparecerão aqui.', 'books_new_empty' => 'Os livros criados mais recentemente aparecerão aqui.', 'books_create' => 'Criar novo Livro', @@ -123,45 +121,45 @@ return [ 'books_permissions_updated' => 'Permissões do Livro Atualizadas', 'books_empty_contents' => 'Nenhuma página ou capítulo criado para esse livro.', 'books_empty_create_page' => 'Criar uma nova página', - 'books_empty_or' => 'ou', 'books_empty_sort_current_book' => 'Ordenar o livro atual', 'books_empty_add_chapter' => 'Adicionar um capítulo', - 'books_permissions_active' => 'Permissões do Livro ativadas', + 'books_permissions_active' => 'Permissões do Livro Ativadas', 'books_search_this' => 'Pesquisar esse livro', 'books_navigation' => 'Navegação do Livro', - 'books_sort' => 'Ordenar conteúdos do Livro', + 'books_sort' => 'Ordenar Conteúdos do Livro', 'books_sort_named' => 'Ordenar Livro :bookName', - 'books_sort_show_other' => 'Mostrar outros livros', - 'books_sort_save' => 'Salvar nova ordenação', + 'books_sort_name' => 'Ordernar por Nome', + 'books_sort_created' => 'Ordenar por Data de Criação', + 'books_sort_updated' => 'Ordenar por Data de Atualização', + 'books_sort_chapters_first' => 'Capítulos Primeiro', + 'books_sort_chapters_last' => 'Capítulos por Último', + 'books_sort_show_other' => 'Mostrar Outros Livros', + 'books_sort_save' => 'Salvar Nova Ordenação', - /** - * Chapters - */ + // Chapters 'chapter' => 'Capítulo', 'chapters' => 'Capítulos', 'x_chapters' => ':count Capítulo|:count Capítulos', 'chapters_popular' => 'Capítulos Populares', 'chapters_new' => 'Novo Capítulo', - 'chapters_create' => 'Criar novo Capítulo', + 'chapters_create' => 'Criar Novo Capítulo', 'chapters_delete' => 'Excluír Capítulo', 'chapters_delete_named' => 'Excluir Capítulo :chapterName', 'chapters_delete_explain' => 'A ação vai excluír o capítulo de nome \':chapterName\'. Todas as páginas do capítulo serão removidas e adicionadas diretamente ao livro pai.', 'chapters_delete_confirm' => 'Tem certeza que deseja excluír o capítulo?', 'chapters_edit' => 'Editar Capítulo', - 'chapters_edit_named' => 'Editar capítulo :chapterName', + 'chapters_edit_named' => 'Editar Capítulo :chapterName', 'chapters_save' => 'Salvar Capítulo', 'chapters_move' => 'Mover Capítulo', 'chapters_move_named' => 'Mover Capítulo :chapterName', 'chapter_move_success' => 'Capítulo movido para :bookName', 'chapters_permissions' => 'Permissões do Capítulo', 'chapters_empty' => 'Nenhuma página existente nesse capítulo.', - 'chapters_permissions_active' => 'Permissões de Capítulo ativadas', - 'chapters_permissions_success' => 'Permissões de Capítulo atualizadas', + 'chapters_permissions_active' => 'Permissões de Capítulo Ativadas', + 'chapters_permissions_success' => 'Permissões de Capítulo Atualizadas', 'chapters_search_this' => 'Pesquisar este Capítulo', - /** - * Pages - */ + // Pages 'page' => 'Página', 'pages' => 'Páginas', 'x_pages' => ':count Página|:count Páginas', @@ -178,7 +176,6 @@ return [ 'pages_delete_confirm' => 'Tem certeza que deseja excluir a página?', 'pages_delete_draft_confirm' => 'Tem certeza que deseja excluir o rascunho de página?', 'pages_editing_named' => 'Editando a Página :pageName', - 'pages_edit_toggle_header' => 'Alternar cabeçalho', 'pages_edit_save_draft' => 'Salvar Rascunho', 'pages_edit_draft' => 'Editar rascunho de Página', 'pages_editing_draft' => 'Editando Rascunho', @@ -212,7 +209,9 @@ return [ 'pages_revisions_created_by' => 'Criado por', 'pages_revisions_date' => 'Data da Revisão', 'pages_revisions_number' => '#', + 'pages_revisions_numbered' => 'Revisão #:id', 'pages_revisions_changelog' => 'Changelog', + 'pages_revisions_numbered_changes' => 'Alterações da Revisão #:id', 'pages_revisions_changes' => 'Mudanças', 'pages_revisions_current' => 'Versão atual', 'pages_revisions_preview' => 'Preview', @@ -235,9 +234,7 @@ return [ 'pages_draft_discarded' => 'Rascunho descartado. O editor foi atualizado com a página atualizada', 'pages_specific' => 'Página Específica', - /** - * Editor sidebar - */ + // Editor sidebar 'page_tags' => 'Tags de Página', 'chapter_tags' => 'Tags de Capítulo', 'book_tags' => 'Tags de Livro', @@ -273,18 +270,15 @@ return [ 'attachments_file_updated' => 'Arquivo atualizado com sucesso', 'attachments_link_attached' => 'Link anexado com sucesso à página', - /** - * Profile View - */ + // Profile View 'profile_user_for_x' => 'Usuário por :time', 'profile_created_content' => 'Conteúdo Criado', 'profile_not_created_pages' => ':userName não criou páginas', 'profile_not_created_chapters' => ':userName não criou capítulos', 'profile_not_created_books' => ':userName não criou livros', + 'profile_not_created_shelves' => ':userName não criou prateleiras', - /** - * Comments - */ + // Comments 'comment' => 'Comentário', 'comments' => 'Comentários', 'comment_add' => 'Adicionar Comentário', @@ -302,10 +296,9 @@ return [ 'comment_delete_confirm' => 'Você tem certeza de que quer deletar este comentário?', 'comment_in_reply_to' => 'Em resposta à :commentId', - /** - * Revision - */ + // Revision 'revision_delete_confirm' => 'Tem certeza de que deseja excluir esta revisão?', + 'revision_restore_confirm' => 'Tem certeza que deseja restaurar esta revisão? O conteúdo atual da página será substituído.', 'revision_delete_success' => 'Revisão excluída', 'revision_cannot_delete_latest' => 'Não é possível excluir a revisão mais recente.' ]; \ No newline at end of file diff --git a/resources/lang/pt_BR/errors.php b/resources/lang/pt_BR/errors.php index 023254182..c5b1a9f92 100644 --- a/resources/lang/pt_BR/errors.php +++ b/resources/lang/pt_BR/errors.php @@ -1,11 +1,9 @@ 'Você não tem permissões para acessar a página requerida.', 'permissionJson' => 'Você não tem permissão para realizar a ação requerida.', @@ -66,6 +64,7 @@ return [ 'role_cannot_be_edited' => 'Esse perfil não pode ser editado', 'role_system_cannot_be_deleted' => 'Esse perfil é um perfil de sistema e não pode ser excluído', 'role_registration_default_cannot_delete' => 'Esse perfil não poderá se excluído enquando estiver registrado como o perfil padrão', + 'role_cannot_remove_only_admin' => 'Este usuário é o único usuário atribuído ao perfil de administrador. Atribua o perfil de administrador a outro usuário antes de tentar removê-lo aqui.', // comments 'comment_list' => 'Ocorreu um erro ao buscar os comentários.', @@ -81,4 +80,5 @@ return [ 'error_occurred' => 'Um erro ocorreu', 'app_down' => ':appName está fora do ar no momento', 'back_soon' => 'Voltaremos em seguida.', + ]; diff --git a/resources/lang/pt_BR/pagination.php b/resources/lang/pt_BR/pagination.php index 6a32f34ac..3ae5dd3e0 100644 --- a/resources/lang/pt_BR/pagination.php +++ b/resources/lang/pt_BR/pagination.php @@ -1,18 +1,11 @@ '« Anterior', 'next' => 'Próximo »', diff --git a/resources/lang/pt_BR/passwords.php b/resources/lang/pt_BR/passwords.php index f75c24ea5..61a49f57a 100644 --- a/resources/lang/pt_BR/passwords.php +++ b/resources/lang/pt_BR/passwords.php @@ -1,18 +1,11 @@ 'Senhas devem ter ao menos 6 caraceres e combinar com os atributos mínimos para a senha.', 'user' => "Não pudemos encontrar um usuário com o e-mail fornecido.", 'token' => 'O token de reset de senha é inválido.', diff --git a/resources/lang/pt_BR/settings.php b/resources/lang/pt_BR/settings.php index aab2c2591..4bb8f37e0 100644 --- a/resources/lang/pt_BR/settings.php +++ b/resources/lang/pt_BR/settings.php @@ -1,32 +1,35 @@ 'Configurações', 'settings_save' => 'Salvar Configurações', 'settings_save_success' => 'Configurações Salvas', - /** - * App settings - */ - - 'app_settings' => 'Configurações do App', + // App Settings + 'app_customization' => 'Customização', + 'app_features_security' => 'Recursos & Segurança', 'app_name' => 'Nome da Aplicação', 'app_name_desc' => 'Esse nome será mostrado no cabeçalho e em e-mails.', 'app_name_header' => 'Mostrar o nome da Aplicação no cabeçalho?', + 'app_public_access' => 'Acesso Público', + 'app_public_access_desc' => 'Habilitar esta opção irá permitir que visitantes, que não estão logados, acessem o conteúdo em sua instância do BookStack.', + 'app_public_access_desc_guest' => 'O acesso de visitantes públicos pode ser controlado através do usuário "Convidado".', + 'app_public_access_toggle' => 'Permitir acesso público', 'app_public_viewing' => 'Permitir visualização pública?', 'app_secure_images' => 'Permitir upload de imagens com maior segurança?', + 'app_secure_images_toggle' => 'Habilitar uploads de imagem de maior segurança', 'app_secure_images_desc' => 'Por questões de performance, todas as imagens são públicas. Essa opção adiciona uma string randômica na frente da imagem. Certifique-se de que os índices do diretórios permitem o acesso fácil.', 'app_editor' => 'Editor de Página', 'app_editor_desc' => 'Selecione qual editor a ser usado pelos usuários para editar páginas.', 'app_custom_html' => 'Conteúdo para tag HTML HEAD customizado', 'app_custom_html_desc' => 'Quaisquer conteúdos aqui inseridos serão inseridos no final da seção do HTML de cada página. Essa é uma maneira útil de sobrescrever estilos e adicionar códigos de análise de site.', + 'app_custom_html_disabled_notice' => 'O conteúdo personalizado do head do HTML está desabilitado nesta página de configurações para garantir que quaisquer alterações significativas possam ser revertidas.', 'app_logo' => 'Logo da Aplicação', 'app_logo_desc' => 'A imagem deve ter 43px de altura.
Imagens mais largas devem ser reduzidas.', 'app_primary_color' => 'Cor primária da Aplicação', @@ -34,26 +37,24 @@ return [ 'app_homepage' => 'Página incial', 'app_homepage_desc' => 'Selecione a página para ser usada como página inicial em vez da padrão. Permissões da página serão ignoradas.', 'app_homepage_select' => 'Selecione uma página', - 'app_disable_comments' => 'Desativar comentários', + 'app_disable_comments' => 'Desativar Comentários', + 'app_disable_comments_toggle' => 'Desativar comentários', 'app_disable_comments_desc' => 'Desativar comentários em todas as páginas no aplicativo. Os comentários existentes não são exibidos.', - /** - * Registration settings - */ - - 'reg_settings' => 'Parâmetros de Registro', - 'reg_allow' => 'Permitir Registro?', + // Registration settings + 'reg_settings' => 'Registro', + 'reg_enable' => 'Habilitar Registro', + 'reg_enable_toggle' => 'Habilitar registro', + 'reg_enable_desc' => 'Quando o registro é habilitado, o usuário poderá se registrar como usuário do aplicativo. No registro, eles recebem um único perfil padrão.', 'reg_default_role' => 'Perfil padrão para usuários após o registro', - 'reg_confirm_email' => 'Requerer confirmação por e-mail?', + 'reg_email_confirmation' => 'Confirmação de E-mail', + 'reg_email_confirmation_toggle' => 'Requer confirmação de e-mail', 'reg_confirm_email_desc' => 'Se restrições de domínio são usadas a confirmação por e-mail será requerida e o valor abaixo será ignorado.', 'reg_confirm_restrict_domain' => 'Restringir registro ao domínio', 'reg_confirm_restrict_domain_desc' => 'Entre com uma lista de domínios de e-mails separados por vírgula para os quais você deseja restringir os registros. Será enviado um e-mail de confirmação para o usuário validar o e-mail antes de ser permitido interação com a aplicação.
Note que os usuários serão capazes de alterar o e-mail cadastrado após o sucesso na confirmação do registro.', 'reg_confirm_restrict_domain_placeholder' => 'Nenhuma restrição configurada', - /** - * Maintenance settings - */ - + // Maintenance settings 'maint' => 'Manutenção', 'maint_image_cleanup' => 'Limpeza de Imagens', 'maint_image_cleanup_desc' => "Examina páginas & revisa o conteúdo para verificar quais imagens e desenhos estão atualmente em uso e quais imagens são redundantes. Certifique-se de criar um backup completo do banco de dados e imagens antes de executar isso.", @@ -63,10 +64,7 @@ return [ 'maint_image_cleanup_success' => ':count imagens potencialmente não utilizadas foram encontradas e excluídas!', 'maint_image_cleanup_nothing_found' => 'Nenhuma imagem não utilizada foi encontrada, nada foi excluído!', - /** - * Role settings - */ - + // Role settings 'roles' => 'Perfis', 'role_user_roles' => 'Perfis de Usuário', 'role_create' => 'Criar novo Perfil', @@ -99,16 +97,20 @@ return [ 'role_users' => 'Usuários neste Perfil', 'role_users_none' => 'Nenhum usuário está atualmente atrelado a esse Perfil', - /** - * Users - */ - + // Users 'users' => 'Usuários', - 'user_profile' => 'Perfil de Usuário', + 'user_profile' => 'Perfil do Usuário', 'users_add_new' => 'Adicionar Novo Usuário', 'users_search' => 'Pesquisar Usuários', - 'users_role' => 'Perfis de Usuário', + 'users_details' => 'Detalhes do Usuário', + 'users_details_desc' => 'Defina um nome de exibição e um endereço de e-mail para este usuário. O endereço de e-mail será usado para fazer login na aplicação.', + 'users_details_desc_no_email' => 'Defina um nome de exibição para este usuário para que outros usuários possam reconhecê-lo', + 'users_role' => 'Perfis do Usuário', + 'users_role_desc' => 'Selecione os perfis para os quais este usuário será atribuído. Se um usuário for atribuído a multiplos perfis, as permissões destes perfis serão empilhadas e eles receberão todas as habilidades dos perfis atribuídos.', + 'users_password' => 'Senha do Usuário', + 'users_password_desc' => 'Defina uma senha usada para fazer login na aplicação. Esta deve ter pelo menos 5 caracteres.', 'users_external_auth_id' => 'ID de Autenticação Externa', + 'users_external_auth_id_desc' => 'Este é o ID usado para corresponder a este usuário ao se comunicar com seu sistema LDAP.', 'users_password_warning' => 'Preencha os dados abaixo caso queira modificar a sua senha:', 'users_system_public' => 'Esse usuário representa quaisquer convidados que visitam o aplicativo. Ele não pode ser usado para login.', 'users_delete' => 'Excluir Usuário', @@ -122,12 +124,14 @@ return [ 'users_avatar' => 'Imagem de Usuário', 'users_avatar_desc' => 'Essa imagem deve ser um quadrado com aproximadamente 256px de altura e largura.', 'users_preferred_language' => 'Linguagem de Preferência', + 'users_preferred_language_desc' => 'Esta opção irá alterar o idioma usado para a interface de usuário da aplicação. Isto não afetará nenhum conteúdo criado pelo usuário.', 'users_social_accounts' => 'Contas Sociais', 'users_social_accounts_info' => 'Aqui você pode conectar outras contas para acesso mais rápido. Desconectar uma conta não retira a possibilidade de acesso usando-a. Para revogar o acesso ao perfil através da conta social, você deverá fazê-lo na sua conta social.', 'users_social_connect' => 'Contas conectadas', 'users_social_disconnect' => 'Desconectar Conta', 'users_social_connected' => 'Conta :socialAccount foi conectada com sucesso ao seu perfil.', 'users_social_disconnected' => 'Conta :socialAccount foi desconectada com sucesso de seu perfil.', + ]; diff --git a/resources/lang/pt_BR/validation.php b/resources/lang/pt_BR/validation.php index 451dbe99c..3d4b51f03 100644 --- a/resources/lang/pt_BR/validation.php +++ b/resources/lang/pt_BR/validation.php @@ -1,18 +1,13 @@ 'O :attribute deve ser aceito.', 'active_url' => 'O :attribute não é uma URL válida.', 'after' => 'O :attribute deve ser uma data posterior à data :date.', @@ -38,6 +33,7 @@ return [ 'filled' => 'O campo :attribute é requerido.', 'exists' => 'O atributo :attribute selecionado não é válido.', 'image' => 'O campo :attribute deve ser uma imagem.', + 'image_extension' => 'O campo :attribute deve ter uma extensão de imagem válida & suportada.', 'in' => 'The selected :attribute is invalid.', 'integer' => 'O campo :attribute deve ser um número inteiro.', 'ip' => 'O campo :attribute deve ser um IP válido.', @@ -54,6 +50,7 @@ return [ 'string' => 'O valor para o campo :attribute não deve ter menos que :min caracteres.', 'array' => 'O valor para o campo :attribute não deve ter menos que :min itens.', ], + 'no_double_extension' => 'O campo :attribute deve ter apenas uma extensão de arquivo.', 'not_in' => 'O campo selecionado :attribute é inválido.', 'numeric' => 'O campo :attribute deve ser um número.', 'regex' => 'O formato do campo :attribute é inválido.', @@ -74,35 +71,15 @@ return [ 'timezone' => 'O campo :attribute deve conter uma timezone válida.', 'unique' => 'Já existe um campo/dado de nome :attribute.', 'url' => 'O formato da URL :attribute é inválido.', + 'uploaded' => 'O arquivo não pôde ser carregado. O servidor pode não aceitar arquivos deste tamanho.', - /* - |-------------------------------------------------------------------------- - | 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 validation lines 'custom' => [ 'password-confirm' => [ 'required_with' => 'Confirmação de senha requerida', ], ], - /* - |-------------------------------------------------------------------------- - | 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. - | - */ - + // Custom validation attributes 'attributes' => [], - ]; From 1e7df28238f5babd66afe90573d9a9a201c57475 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Wed, 17 Jul 2019 22:36:49 +0100 Subject: [PATCH 05/13] Set export service to set correct svg image mimetype For #1538 --- app/Uploads/ImageService.php | 7 ++++++- tests/Entity/ExportTest.php | 14 ++++++++++++++ tests/SharedTestHelpers.php | 15 +++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/Uploads/ImageService.php b/app/Uploads/ImageService.php index 71fd2cd4e..ae1c6a254 100644 --- a/app/Uploads/ImageService.php +++ b/app/Uploads/ImageService.php @@ -442,7 +442,12 @@ class ImageService extends UploadService return null; } - return 'data:image/' . pathinfo($uri, PATHINFO_EXTENSION) . ';base64,' . base64_encode($imageData); + $extension = pathinfo($uri, PATHINFO_EXTENSION); + if ($extension === 'svg') { + $extension = 'svg+xml'; + } + + return 'data:image/' . $extension . ';base64,' . base64_encode($imageData); } /** diff --git a/tests/Entity/ExportTest.php b/tests/Entity/ExportTest.php index 683f23674..e3a74f64d 100644 --- a/tests/Entity/ExportTest.php +++ b/tests/Entity/ExportTest.php @@ -3,6 +3,7 @@ use BookStack\Entities\Chapter; use BookStack\Entities\Page; +use BookStack\Uploads\HttpFetcher; class ExportTest extends TestCase { @@ -148,4 +149,17 @@ class ExportTest extends TestCase $resp->assertDontSee($page->updated_at->diffForHumans()); } + public function test_page_export_sets_right_data_type_for_svg_embeds() + { + $page = Page::first(); + $page->html = ''; + $page->save(); + + $this->asEditor(); + $this->mockHttpFetch(''); + $resp = $this->get($page->getUrl('/export/html')); + $resp->assertStatus(200); + $resp->assertSee(' 'Minden jog fenntartva', +]; diff --git a/resources/lang/hu/components.php b/resources/lang/hu/components.php new file mode 100644 index 000000000..1f98df2df --- /dev/null +++ b/resources/lang/hu/components.php @@ -0,0 +1,33 @@ + 'Kép kiválasztása', + 'image_all' => 'Összes', + 'image_all_title' => 'Összes kép megtekintése', + 'image_book_title' => 'A könyv feltöltött képek megtekintése', + 'image_page_title' => 'Az oldalra feltöltött képek megtekintése', + 'image_search_hint' => 'Keresés kép neve alapján', + 'image_uploaded' => 'Feltöltve ekkor: :uploadedDate', + 'image_load_more' => 'Több betöltése', + 'image_image_name' => 'Kép neve', + 'image_delete_used' => 'Ez a kép a lenti oldalakon van használatban.', + 'image_delete_confirm' => 'A kép törléséhez ismét rá kell kattintani a törlésre.', + 'image_select_image' => 'Kép kiválasztása', + 'image_dropzone' => 'Képek feltöltése ejtéssel vagy kattintással', + 'images_deleted' => 'Képek törölve', + 'image_preview' => 'Kép előnézete', + 'image_upload_success' => 'Kép sikeresen feltöltve', + 'image_update_success' => 'Kép részletei sikeresen frissítve', + 'image_delete_success' => 'Kép sikeresen törölve', + 'image_upload_remove' => 'Eltávolítás', + + // Code Editor + 'code_editor' => 'Kód szerkesztése', + 'code_language' => 'Kód nyelve', + 'code_content' => 'Kód tartalom', + 'code_save' => 'Kód mentése', +]; diff --git a/resources/lang/hu/entities.php b/resources/lang/hu/entities.php new file mode 100644 index 000000000..5bd865dd5 --- /dev/null +++ b/resources/lang/hu/entities.php @@ -0,0 +1,305 @@ + 'Legutóbb létrehozott', + 'recently_created_pages' => 'Legutóbb létrehozott oldalak', + 'recently_updated_pages' => 'Legutóbb frissített oldalak', + 'recently_created_chapters' => 'Legutóbb létrehozott fejezetek', + 'recently_created_books' => 'Legutóbb létrehozott könyvek', + 'recently_created_shelves' => 'Legutóbb létrehozott polcok', + 'recently_update' => 'Legutóbb frissített', + 'recently_viewed' => 'Legutóbb megtekintett', + 'recent_activity' => 'Legutóbbi tevékenység', + 'create_now' => 'Létrehozás most', + 'revisions' => 'Változatok', + 'meta_revision' => 'Változat #:revisionCount', + 'meta_created' => 'Létrehozva :timeLength', + 'meta_created_name' => ':user hozta létre :timeLength', + 'meta_updated' => 'Frissítve :timeLength', + 'meta_updated_name' => ':user frissítette :timeLength', + 'entity_select' => 'Entitás kiválasztása', + 'images' => 'Képek', + 'my_recent_drafts' => 'Legutóbbi vázlataim', + 'my_recently_viewed' => 'Általam legutóbb megtekintett', + 'no_pages_viewed' => 'Még nincsenek általam megtekintett oldalak', + 'no_pages_recently_created' => 'Nincsenek legutóbb létrehozott oldalak', + 'no_pages_recently_updated' => 'Nincsenek legutóbb frissített oldalak', + 'export' => 'Exportálás', + 'export_html' => 'Webfájlt tartalmaz', + 'export_pdf' => 'PDF fájl', + 'export_text' => 'Egyszerű szövegfájl', + + // Permissions and restrictions + 'permissions' => 'Jogosultságok', + 'permissions_intro' => 'Ha engedélyezett, ezek a jogosultságok elsőbbséget élveznek bármely beállított szerepkör jogosultsággal szemben.', + 'permissions_enable' => 'Egyéni jogosultságok engedélyezése', + 'permissions_save' => 'Jogosultságok mentése', + + // Search + 'search_results' => 'Keresési eredmények', + 'search_total_results_found' => ':count találat|összesen :count találat', + 'search_clear' => 'Keresés törlése', + 'search_no_pages' => 'Nincsenek a keresésnek megfelelő oldalak', + 'search_for_term' => ':term keresése', + 'search_more' => 'További eredmények', + 'search_filters' => 'Keresési szűrők', + 'search_content_type' => 'Tartalomtípus', + 'search_exact_matches' => 'Pontos egyezések', + 'search_tags' => 'Címke keresések', + 'search_options' => 'Beállítások', + 'search_viewed_by_me' => 'Általam megtekintett', + 'search_not_viewed_by_me' => 'Általam nem megtekintett', + 'search_permissions_set' => 'Jogosultságok beállítva', + 'search_created_by_me' => 'Általam létrehozott', + 'search_updated_by_me' => 'Általam frissített', + 'search_date_options' => 'Dátum beállítások', + 'search_updated_before' => 'Frissítve ez előtt', + 'search_updated_after' => 'Frissítve ez után', + 'search_created_before' => 'Létrehozva ez előtt', + 'search_created_after' => 'Létrehozva ez után', + 'search_set_date' => 'Dátum beállítása', + 'search_update' => 'Keresés frissítése', + + // Shelves + 'shelf' => 'Polc', + 'shelves' => 'Polcok', + 'x_shelves' => ':count polc|:count polcok', + 'shelves_long' => 'Könyvespolcok', + 'shelves_empty' => 'Nincsenek könyvespolcok létrehozva', + 'shelves_create' => 'Új polc létrehozása', + 'shelves_popular' => 'Népszerű polcok', + 'shelves_new' => 'Új polcok', + 'shelves_new_action' => 'Új polc', + 'shelves_popular_empty' => 'A legnépszerűbb polcok itt fognak megjelenni.', + 'shelves_new_empty' => 'A legutoljára létrehozott polcok itt fognak megjelenni.', + 'shelves_save' => 'Polc mentése', + 'shelves_books' => 'Könyvek ezen a polcon', + 'shelves_add_books' => 'Könyvek hozzáadása ehhez a polchoz', + 'shelves_drag_books' => 'Könyveket áthúzással lehet elhelyezni ezen a polcon', + 'shelves_empty_contents' => 'Ehhez a polchoz nincsenek könyvek rendelve', + 'shelves_edit_and_assign' => 'Polc szerkesztése könyvek hozzárendeléséhez', + 'shelves_edit_named' => ':name könyvespolc szerkesztése', + 'shelves_edit' => 'Könyvespolc szerkesztése', + 'shelves_delete' => 'Könyvespolc törlése', + 'shelves_delete_named' => ':name könyvespolc törlése', + 'shelves_delete_explain' => "':name'. nevű könyvespolc ezzel le lesz törölve. A benne található könyvek nem lesznek törölve.", + 'shelves_delete_confirmation' => 'Biztosan törölhető ez a könyvespolc?', + 'shelves_permissions' => 'Könyvespolc jogosultság', + 'shelves_permissions_updated' => 'Könyvespolc jogosultságok frissítve', + 'shelves_permissions_active' => 'Könyvespolc jogosultságok aktívak', + 'shelves_copy_permissions_to_books' => 'Jogosultság másolása könyvekre', + 'shelves_copy_permissions' => 'Jogosultság másolása', + 'shelves_copy_permissions_explain' => 'Ez alkalmazni fogja ennek a könyvespolcnak az aktuális jogosultság beállításait az összes benne található könyvön. Aktiválás előtt ellenőrizni kell, hogy a könyvespolc jogosultságain végzett összes módosítás el lett mentve.', + 'shelves_copy_permission_success' => 'Könyvespolc jogosultságok átmásolva :count könyvre', + + // Books + 'book' => 'Könyv', + 'books' => 'Könyvek', + 'x_books' => ':count könyv|:count könyv', + 'books_empty' => 'Nincsenek könyvek létrehozva', + 'books_popular' => 'Népszerű könyvek', + 'books_recent' => 'Legutóbbi könyvek', + 'books_new' => 'Új könyvek', + 'books_new_action' => 'Új könyv', + 'books_popular_empty' => 'A legnépszerűbb könyvek itt fognak megjelenni.', + 'books_new_empty' => 'A legutoljára létrehozott könyvek itt fognak megjelenni.', + 'books_create' => 'Új könyv létrehozása', + 'books_delete' => 'Könyv törlése', + 'books_delete_named' => ':bookName könyv törlése', + 'books_delete_explain' => '\':bookName\' nevű könyv törölve lesz. Minden oldal és fejezet el lesz távolítva.', + 'books_delete_confirmation' => 'Biztosan törölhető ez a könyv?', + 'books_edit' => 'Könyv szerkesztése', + 'books_edit_named' => ':bookName könyv szerkesztése', + 'books_form_book_name' => 'Könyv neve', + 'books_save' => 'Könyv mentése', + 'books_permissions' => 'Könyv jogosultságok', + 'books_permissions_updated' => 'Könyv jogosultságok frissítve', + 'books_empty_contents' => 'Ehhez a könyvhöz nincsenek oldalak vagy fejezetek létrehozva.', + 'books_empty_create_page' => 'Új oldal létrehozása', + 'books_empty_sort_current_book' => 'Aktuális könyv rendezése', + 'books_empty_add_chapter' => 'Fejezet hozzáadása', + 'books_permissions_active' => 'Könyv jogosultságok aktívak', + 'books_search_this' => 'Keresés ebben a könyvben', + 'books_navigation' => 'Könyv navigáció', + 'books_sort' => 'Könyv tartalmak rendezése', + 'books_sort_named' => ':bookName könyv rendezése', + 'books_sort_name' => 'Rendezés név szerint', + 'books_sort_created' => 'Rendezés létrehozás dátuma szerint', + 'books_sort_updated' => 'Rendezés frissítés dátuma szerint', + 'books_sort_chapters_first' => 'Fejezetek elől', + 'books_sort_chapters_last' => 'Fejezetek hátul', + 'books_sort_show_other' => 'Egyéb könyvek mutatása', + 'books_sort_save' => 'Új elrendezés mentése', + + // Chapters + 'chapter' => 'Fejezet', + 'chapters' => 'Fejezetek', + 'x_chapters' => ':count fejezet|:count fejezetek', + 'chapters_popular' => 'Népszerű fejezetek', + 'chapters_new' => 'Új fejezet', + 'chapters_create' => 'Új fejezet létrehozása', + 'chapters_delete' => 'Fejezet törlése', + 'chapters_delete_named' => ':chapterName fejezet törlése', + 'chapters_delete_explain' => '\':chapterName\' nevű fejezet törölve lesz. Minden oldal el lesz távolítva és közvetlenül a szülő könyvhöz lesz hozzáadva.', + 'chapters_delete_confirm' => 'Biztosan törölhető ez a fejezet?', + 'chapters_edit' => 'Fejezet szerkesztése', + 'chapters_edit_named' => ':chapterName fejezet szerkesztése', + 'chapters_save' => 'Fejezet mentése', + 'chapters_move' => 'Fejezet áthelyezése', + 'chapters_move_named' => ':chapterName fejezet áthelyezése', + 'chapter_move_success' => 'Fejezet áthelyezve :bookName könyvbe', + 'chapters_permissions' => 'Fejezet jogosultságok', + 'chapters_empty' => 'Jelenleg nincsenek oldalak ebben a fejezetben.', + 'chapters_permissions_active' => 'Fejezet jogosultságok aktívak', + 'chapters_permissions_success' => 'Fejezet jogosultságok frissítve', + 'chapters_search_this' => 'Keresés ebben a fejezetben', + + // Pages + 'page' => 'Oldal', + 'pages' => 'Oldalak', + 'x_pages' => ':count oldal|:count oldalak', + 'pages_popular' => 'Népszerű oldalak', + 'pages_new' => 'Új oldal', + 'pages_attachments' => 'Csatolmányok', + 'pages_navigation' => 'Oldal navigáció', + 'pages_delete' => 'Oldal törlése', + 'pages_delete_named' => ':pageName oldal törlése', + 'pages_delete_draft_named' => ':pageName vázlat oldal törlése', + 'pages_delete_draft' => 'Vázlat oldal törlése', + 'pages_delete_success' => 'Oldal törölve', + 'pages_delete_draft_success' => 'Vázlat oldal törölve', + 'pages_delete_confirm' => 'Biztosan törölhető ez az oldal?', + 'pages_delete_draft_confirm' => 'Biztosan törölhető ez a vázlatoldal?', + 'pages_editing_named' => ':pageName oldal szerkesztése', + 'pages_edit_toggle_header' => 'Fejléc átkapcsolása', + 'pages_edit_save_draft' => 'Vázlat mentése', + 'pages_edit_draft' => 'Oldal vázlat szerkesztése', + 'pages_editing_draft' => 'Vázlat szerkesztése', + 'pages_editing_page' => 'Oldal szerkesztése', + 'pages_edit_draft_save_at' => 'Vázlat elmentve:', + 'pages_edit_delete_draft' => 'Vázlat törlése', + 'pages_edit_discard_draft' => 'Vázlat elvetése', + 'pages_edit_set_changelog' => 'Változásnapló beállítása', + 'pages_edit_enter_changelog_desc' => 'A végrehajtott módosítások rövid leírása', + 'pages_edit_enter_changelog' => 'Változásnapló megadása', + 'pages_save' => 'Oldal mentése', + 'pages_title' => 'Oldal címe', + 'pages_name' => 'Oldal neve', + 'pages_md_editor' => 'Szerkesztő', + 'pages_md_preview' => 'Előnézet', + 'pages_md_insert_image' => 'Kép beillesztése', + 'pages_md_insert_link' => 'Entitás hivatkozás beillesztése', + 'pages_md_insert_drawing' => 'Rajz beillesztése', + 'pages_not_in_chapter' => 'Az oldal nincs fejezetben', + 'pages_move' => 'Oldal áthelyezése', + 'pages_move_success' => 'Oldal áthelyezve ide: ":parentName"', + 'pages_copy' => 'Oldal másolása', + 'pages_copy_desination' => 'Másolás célja', + 'pages_copy_success' => 'Oldal sikeresen lemásolva', + 'pages_permissions' => 'Oldal jogosultságok', + 'pages_permissions_success' => 'Oldal jogosultságok frissítve', + 'pages_revision' => 'Változat', + 'pages_revisions' => 'Oldal változatai', + 'pages_revisions_named' => ':pageName oldal változatai', + 'pages_revision_named' => ':pageName oldal változata', + 'pages_revisions_created_by' => 'Létrehozta:', + 'pages_revisions_date' => 'Változat dátuma', + 'pages_revisions_number' => '#', + 'pages_revisions_numbered' => 'Változat #:id', + 'pages_revisions_numbered_changes' => '#:id változat módosításai', + 'pages_revisions_changelog' => 'Változásnapló', + 'pages_revisions_changes' => 'Módosítások', + 'pages_revisions_current' => 'Aktuális verzió', + 'pages_revisions_preview' => 'Előnézet', + 'pages_revisions_restore' => 'Visszaállítás', + 'pages_revisions_none' => 'Ennek az oldalnak nincsenek változatai', + 'pages_copy_link' => 'Hivatkozás másolása', + 'pages_edit_content_link' => 'Tartalom szerkesztése', + 'pages_permissions_active' => 'Oldal jogosultságok aktívak', + 'pages_initial_revision' => 'Kezdeti közzététel', + 'pages_initial_name' => 'Új oldal', + 'pages_editing_draft_notification' => 'A jelenleg szerkesztett vázlat legutóbb ekkor volt elmentve: :timeDiff.', + 'pages_draft_edited_notification' => 'Ezt az oldalt azóta már frissítették. Javasolt ennek a vázlatnak az elvetése.', + 'pages_draft_edit_active' => [ + 'start_a' => ':count felhasználók kezdte el szerkeszteni ezt az oldalt', + 'start_b' => ':userName elkezdte szerkeszteni ezt az oldalt', + 'time_a' => 'mióta az oldal utoljára frissítve volt', + 'time_b' => 'az utolsó :minCount percben', + 'message' => ':start :time. Ügyeljen arra, hogy ne írjuk felül egymás frissítéseit!', + ], + 'pages_draft_discarded' => 'Vázlat elvetve, a szerkesztő frissítve lesz az oldal aktuális tartalmával', + 'pages_specific' => 'Egy bizonyos oldal', + + // Editor Sidebar + 'page_tags' => 'Oldal címkék', + 'chapter_tags' => 'Fejezet címkék', + 'book_tags' => 'Könyv címkék', + 'shelf_tags' => 'Polc címkék', + 'tag' => 'Címke', + 'tags' => 'Címkék', + 'tag_value' => 'Címke érték (nem kötelező)', + 'tags_explain' => "Címkék hozzáadása a tartalom jobb kategorizálásához.\nA mélyebb szervezettség megvalósításához hozzá lehet rendelni egy értéket a címkéhez.", + 'tags_add' => 'Másik címke hozzáadása', + 'attachments' => 'Csatolmányok', + 'attachments_explain' => 'Az oldalon megjelenő fájlok feltöltése vagy hivatkozások csatolása. Az oldal oldalsávjában fognak megjelenni.', + 'attachments_explain_instant_save' => 'Az itt történt módosítások azonnal el lesznek mentve.', + 'attachments_items' => 'Csatolt elemek', + 'attachments_upload' => 'Fájlfeltöltés', + 'attachments_link' => 'Hivatkozás csatolása', + 'attachments_set_link' => 'Hivatkozás beállítása', + 'attachments_delete_confirm' => 'A csatolmány törléséhez ismét rá kell kattintani a törlésre.', + 'attachments_dropzone' => 'Fájlok csatolása ejtéssel vagy kattintással', + 'attachments_no_files' => 'Nincsenek fájlok feltöltve', + 'attachments_explain_link' => 'Fájl feltöltése helyett hozzá lehet kapcsolni egy hivatkozást. Ez egy hivatkozás lesz egy másik oldalra vagy egy fájlra a felhőben.', + 'attachments_link_name' => 'Hivatkozás neve', + 'attachment_link' => 'Csatolmány hivatkozás', + 'attachments_link_url' => 'Hivatkozás fájlra', + 'attachments_link_url_hint' => 'Weboldal vagy fájl webcíme', + 'attach' => 'Csatolás', + 'attachments_edit_file' => 'Fájl szerkesztése', + 'attachments_edit_file_name' => 'Fájl neve', + 'attachments_edit_drop_upload' => 'Feltöltés és felülírás ejtéssel vagy kattintással', + 'attachments_order_updated' => 'Csatolmány sorrend frissítve', + 'attachments_updated_success' => 'Csatolmány részletei frissítve', + 'attachments_deleted' => 'Csatolmány törölve', + 'attachments_file_uploaded' => 'Fájl sikeresen feltöltve', + 'attachments_file_updated' => 'Fájl sikeresen frissítve', + 'attachments_link_attached' => 'Hivatkozás sikeresen hozzácsatolva az oldalhoz', + + // Profile View + 'profile_user_for_x' => 'Felhasználó ez óta: :time', + 'profile_created_content' => 'Létrehozott tartalom', + 'profile_not_created_pages' => ':userName még nem hozott létre oldalt', + 'profile_not_created_chapters' => ':userName még nem hozott létre fejezetet', + 'profile_not_created_books' => ':userName még nem hozott létre könyvet', + 'profile_not_created_shelves' => ':userName még nem hozott létre polcot', + + // Comments + 'comment' => 'Megjegyzés', + 'comments' => 'Megjegyzések', + 'comment_add' => 'Megjegyzés hozzáadása', + 'comment_placeholder' => 'Megjegyzés írása', + 'comment_count' => '{0} Nincs megjegyzés|{1} 1 megjegyzés|[2,*] :count megjegyzés', + 'comment_save' => 'Megjegyzés mentése', + 'comment_saving' => 'Megjegyzés mentése...', + 'comment_deleting' => 'Megjegyzés törlése...', + 'comment_new' => 'Új megjegyzés', + 'comment_created' => 'megjegyzést fűzött hozzá :createDiff', + 'comment_updated' => 'Frissítve :updateDiff :username által', + 'comment_deleted_success' => 'Megjegyzés törölve', + 'comment_created_success' => 'Megjegyzés hozzáadva', + 'comment_updated_success' => 'Megjegyzés frissítve', + 'comment_delete_confirm' => 'Biztosan törölhető ez a megjegyzés?', + 'comment_in_reply_to' => 'Válasz erre: :commentId', + + // Revision + 'revision_delete_confirm' => 'Biztosan törölhető ez a változat?', + 'revision_restore_confirm' => 'Biztosan visszaállítható ez a változat? A oldal jelenlegi tartalma le lesz cserélve.', + 'revision_delete_success' => 'Változat törölve', + 'revision_cannot_delete_latest' => 'A legutolsó változat nem törölhető.' +]; \ No newline at end of file diff --git a/resources/lang/hu/errors.php b/resources/lang/hu/errors.php new file mode 100644 index 000000000..679142804 --- /dev/null +++ b/resources/lang/hu/errors.php @@ -0,0 +1,84 @@ + 'Nincs jogosultság a kért oldal eléréséhez.', + 'permissionJson' => 'Nincs jogosultság a kért művelet végrehajtásához.', + + // Auth + 'error_user_exists_different_creds' => ':email címmel már létezik felhasználó, de más hitelesítő adatokkal.', + 'email_already_confirmed' => 'Az email cím már meg van erősítve, meg lehet próbálni a bejelentkezést.', + 'email_confirmation_invalid' => 'A megerősítő vezérjel nem érvényes vagy használva volt. Meg kell próbálni újraregisztrálni.', + 'email_confirmation_expired' => 'A megerősítő vezérjel lejárt. Egy új megerősítő email lett elküldve.', + 'ldap_fail_anonymous' => 'Nem sikerült az LDAP elérése névtelen csatlakozással', + 'ldap_fail_authed' => 'Az LDAP hozzáférés nem sikerült a megadott DN és jelszó beállításokkal', + 'ldap_extension_not_installed' => 'LDAP PHP kiterjesztés nincs telepítve', + 'ldap_cannot_connect' => 'Nem lehet kapcsolódni az LDAP kiszolgálóhoz, a kezdeti kapcsolatfelvétel nem sikerült', + 'social_no_action_defined' => 'Nincs művelet meghatározva', + 'social_login_bad_response' => "Hiba történt :socialAccount bejelentkezés közben:\n:error", + 'social_account_in_use' => ':socialAccount fiók már használatban van. :socialAccount opción keresztül érdemes megpróbálni a bejelentkezést.', + 'social_account_email_in_use' => ':email email cím már használatban van. Ha már van fiók létrehozva, :egy socialAccount fiókot hozzá lehet csatolni a profil beállításainál.', + 'social_account_existing' => ':socialAccount már hozzá van kapcsolva a fiókhoz.', + 'social_account_already_used_existing' => ':socialAccount fiókot már egy másik felhasználó használja.', + 'social_account_not_used' => ':socialAccount fiók nincs felhasználóhoz kapcsolva. A hozzákapcsolást a profil oldalon lehet elvégezni. ', + 'social_account_register_instructions' => ':socialAccount beállítása használatával is lehet fiókot regisztrálni, ha még nem volt fiók létrehozva.', + 'social_driver_not_found' => 'Közösségi meghajtó nem található', + 'social_driver_not_configured' => ':socialAccount közösségi beállítások nem megfelelőek.', + + // System + 'path_not_writable' => ':filePath elérési út nem tölthető fel. Ellenőrizni kell, hogy az útvonal a kiszolgáló számára írható.', + 'cannot_get_image_from_url' => 'Nem lehet lekérni a képet innen: :url', + 'cannot_create_thumbs' => 'A kiszolgáló nem tud létrehozni bélyegképeket. Ellenőrizni kell, hogy telepítve van-a a GD PHP kiterjesztés.', + 'server_upload_limit' => 'A kiszolgáló nem engedélyez ilyen méretű feltöltéseket. Kisebb fájlmérettel kell próbálkozni.', + 'uploaded' => 'A kiszolgáló nem engedélyez ilyen méretű feltöltéseket. Kisebb fájlmérettel kell próbálkozni.', + 'image_upload_error' => 'Hiba történt a kép feltöltése közben', + 'image_upload_type_error' => 'A feltöltött kép típusa érvénytelen', + 'file_upload_timeout' => 'A fáj feltöltése időtúllépést okozott.', + + // Attachments + 'attachment_page_mismatch' => 'Oldal eltárás csatolmány frissítése közben', + 'attachment_not_found' => 'Csatolmány nem található', + + // Pages + 'page_draft_autosave_fail' => 'Nem sikerült a vázlat mentése. Mentés előtt meg kell róla győződni, hogy van internetkapcsolat', + 'page_custom_home_deletion' => 'Nem lehet oldalt törölni ha kezdőlapnak van beállítva', + + // Entities + 'entity_not_found' => 'Entitás nem található', + 'bookshelf_not_found' => 'Könyvespolc nem található', + 'book_not_found' => 'Könyv nem található', + 'page_not_found' => 'Oldal nem található', + 'chapter_not_found' => 'Fejezet nem található', + 'selected_book_not_found' => 'A kiválasztott könyv nem található', + 'selected_book_chapter_not_found' => 'A kiválasztott könyv vagy fejezet nem található', + 'guests_cannot_save_drafts' => 'Vendégek nem menthetnek el vázlatokat', + + // Users + 'users_cannot_delete_only_admin' => 'Nem lehet törölni az egyetlen adminisztrátort', + 'users_cannot_delete_guest' => 'A vendég felhasználót nem lehet törölni', + + // Roles + 'role_cannot_be_edited' => 'Ezt a szerepkört nem lehet szerkeszteni', + 'role_system_cannot_be_deleted' => 'Ez a szerepkör egy rendszer szerepkör ezért nem törölhető', + 'role_registration_default_cannot_delete' => 'Ezt a szerepkört nem lehet törölni amíg alapértelmezés szerinti regisztrációs szerepkörnek van beállítva', + 'role_cannot_remove_only_admin' => 'Ez a felhasználó az egyetlen, az adminisztrátor szerepkörhöz rendelt felhasználó. Eltávolítása előtt az adminisztrátor szerepkört át kell ruházni egy másik felhasználóra.', + + // Comments + 'comment_list' => 'Hiba történt a megjegyzések lekérése közben.', + 'cannot_add_comment_to_draft' => 'Vázlathoz nem lehet megjegyzéseket fűzni.', + 'comment_add' => 'Hiba történt a megjegyzés hozzáadása / frissítése közben.', + 'comment_delete' => 'Hiba történt a megjegyzés törlése közben.', + 'empty_comment' => 'Üres megjegyzést nem lehet hozzáadni.', + + // Error pages + '404_page_not_found' => 'Oldal nem található', + 'sorry_page_not_found' => 'Sajnáljuk, a keresett oldal nem található.', + 'return_home' => 'Vissza a kezdőlapra', + 'error_occurred' => 'Hiba örtént', + 'app_down' => ':appName jelenleg nem üzemel', + 'back_soon' => 'Hamarosan újra elérhető lesz.', + +]; diff --git a/resources/lang/hu/pagination.php b/resources/lang/hu/pagination.php new file mode 100644 index 000000000..87be04cf4 --- /dev/null +++ b/resources/lang/hu/pagination.php @@ -0,0 +1,12 @@ + '« Előző', + 'next' => 'Következő »', + +]; diff --git a/resources/lang/hu/passwords.php b/resources/lang/hu/passwords.php new file mode 100644 index 000000000..bacc08b08 --- /dev/null +++ b/resources/lang/hu/passwords.php @@ -0,0 +1,15 @@ + 'A jelszónak legalább hat karakterből kell állnia és egyeznie kell a megerősítéssel.', + 'user' => "Nem található felhasználó ezzel az e-mail címmel.", + 'token' => 'Ez a jelszó visszaállító vezérjel érvénytelen.', + 'sent' => 'E-mailben elküldtük a jelszó visszaállító hivatkozást!', + 'reset' => 'A jelszó visszaállítva!', + +]; diff --git a/resources/lang/hu/settings.php b/resources/lang/hu/settings.php new file mode 100644 index 000000000..efebb4a10 --- /dev/null +++ b/resources/lang/hu/settings.php @@ -0,0 +1,161 @@ + 'Beállítások', + 'settings_save' => 'Beállítások mentése', + 'settings_save_success' => 'Beállítások elmentve', + + // App Settings + 'app_customization' => 'Személyre szabás', + 'app_features_security' => 'Jellemzők és biztonság', + 'app_name' => 'Alkalmazás neve', + 'app_name_desc' => 'Ez a név meg fog jelenni a fejlécben és minden a rendszer által küldött emailben.', + 'app_name_header' => 'Név mutatása a fejlécben', + 'app_public_access' => 'Nyilvános hozzáférés', + 'app_public_access_desc' => 'Ha engedélyezett, a nem bejelentkezett felhasználók is hozzá tudnak férni a BookStack példány tartalmaihoz.', + 'app_public_access_desc_guest' => 'A nyilvános látogatók hozzáférése a "Guest" felhasználón keresztül irányítható.', + 'app_public_access_toggle' => 'Nyilvános hozzáférés engedélyezése', + 'app_public_viewing' => 'Nyilvános megtekintés engedélyezve?', + 'app_secure_images' => 'Magasabb biztonságú képfeltöltés', + 'app_secure_images_toggle' => 'Magasabb biztonságú képfeltöltés engedélyezése', + 'app_secure_images_desc' => 'Teljesítmény optimalizálási okokból minden kép nyilvános. Ez a beállítás egy véletlenszerű, nehezen kitalálható karakterláncot illeszt a képek útvonalának elejére. Meg kell győződni róla, hogy a könnyű hozzáférés megakadályozása érdekében a könyvtár indexek nincsenek engedélyezve.', + 'app_editor' => 'Oldalszerkesztő', + 'app_editor_desc' => 'Annak kiválasztása, hogy a felhasználók melyik szerkesztőt használhatják az oldalak szerkesztéséhez.', + 'app_custom_html' => 'Egyéni HTML fejléc tartalom', + 'app_custom_html_desc' => 'Az itt hozzáadott bármilyen tartalom be lesz illesztve minden oldal szekciójának aljára. Ez hasznos a stílusok felülírásához van analitikai kódok hozzáadásához.', + 'app_logo' => 'Alkalmazás logó', + 'app_logo_desc' => 'A képnek 43px magasnak kell lennie.
A nagy képek át lesznek méretezve.', + 'app_primary_color' => 'Alkalmazás elsődleges színe', + 'app_primary_color_desc' => 'Hexadecimális értéknek kell lennie.
Az alapértelmezés szerinti szín visszaállításához üresen kell hagyni.', + 'app_homepage' => 'Alkalmazás kezdőlapja', + 'app_homepage_desc' => 'A kezdőlapon az alapértelmezés szerinti nézet helyett megjelenő nézet kiválasztása. A kiválasztott oldalakon figyelmen kívül lesznek hagyva az oldal engedélyek.', + 'app_homepage_select' => 'Egy oldal kiválasztása', + 'app_disable_comments' => 'Megjegyzések letiltása', + 'app_disable_comments_toggle' => 'Megjegyzések letiltása', + 'app_disable_comments_desc' => 'Megjegyzések letiltása az alkalmazás összes oldalán.
A már létező megjegyzések el lesznek rejtve.', + + // Registration Settings + 'reg_settings' => 'Regisztráció', + 'reg_enable' => 'Regisztráció engedélyezése', + 'reg_enable_toggle' => 'Regisztráció engedélyezése', + 'reg_enable_desc' => 'Ha a regisztráció engedélyezett, akkor a felhasználó képes lesz bejelentkezni mint az alkalmazás egy felhasználója. Regisztráció után egy egyszerű, alapértelmezés szerinti felhasználói szerepkör lesz hozzárendelve.', + 'reg_default_role' => 'Regisztráció utáni alapértelmezett felhasználói szerepkör', + 'reg_email_confirmation' => 'Email megerősítés', + 'reg_email_confirmation_toggle' => 'Email megerősítés szükséges', + 'reg_confirm_email_desc' => 'Ha a tartomány korlátozás be van állítva, akkor email megerősítés szükséges és ez a beállítás figyelmen kívül lesz hagyva.', + 'reg_confirm_restrict_domain' => 'Tartomány korlátozás', + 'reg_confirm_restrict_domain_desc' => 'Azoknak az email tartományoknak a vesszővel elválasztott listája, melyekre a regisztráció korlátozva lesz. A felhasználók egy emailt fognak kapni, hogy megerősítsék az email címüket mielőtt használni kezdhetnék az alkalmazást.
Fontos tudni, hogy a felhasználók a sikeres regisztráció után megváltoztathatják az email címüket.', + 'reg_confirm_restrict_domain_placeholder' => 'Nincs beállítva korlátozás', + + // Maintenance settings + 'maint' => 'Karbantartás', + 'maint_image_cleanup' => 'Képek tisztítása', + 'maint_image_cleanup_desc' => "Végigolvassa az oldalakat és a tartalmak változatait, hogy leellenőrizze jelenleg mely képek és rajzok vannak használatban, és mely képek szerepelnek többször. A futtatása előtt feltétlen készíteni kell egy teljes adatbázis és lemezkép mentést.", + 'maint_image_cleanup_ignore_revisions' => 'Képek figyelmen kívül hagyása a változatokban', + 'maint_image_cleanup_run' => 'Tisztítás futtatása', + 'maint_image_cleanup_warning' => ':count potenciálisan nem használt képet találtam. Biztosan törölhetőek ezek a képek?', + 'maint_image_cleanup_success' => ':count potenciálisan nem használt kép megtalálva és törölve!', + 'maint_image_cleanup_nothing_found' => 'Nincsenek nem használt képek, semmi sem lett törölve!', + + // Role Settings + 'roles' => 'Szerepkörök', + 'role_user_roles' => 'Felhasználói szerepkörök', + 'role_create' => 'Új szerepkör létrehozása', + 'role_create_success' => 'Szerepkör sikeresen létrehozva', + 'role_delete' => 'Szerepkör törlése', + 'role_delete_confirm' => 'Ez törölni fogja \':roleName\' szerepkört.', + 'role_delete_users_assigned' => 'Ehhez a szerepkörhöz :userCount felhasználó van hozzárendelve. Ha a felhasználókat át kell helyezni ebből a szerepkörből, akkor ki kell választani egy új szerepkört.', + 'role_delete_no_migration' => "Nincs felhasználó áthelyezés", + 'role_delete_sure' => 'Biztosan törölhető ez a szerepkör?', + 'role_delete_success' => 'Szerepkör sikeresen törölve', + 'role_edit' => 'Szerepkör szerkesztése', + 'role_details' => 'Szerepkör részletei', + 'role_name' => 'Szerepkör neve', + 'role_desc' => 'Szerepkör rövid leírása', + 'role_external_auth_id' => 'Külső hitelesítés azonosítók', + 'role_system' => 'Rendszer jogosultságok', + 'role_manage_users' => 'Felhasználók kezelése', + 'role_manage_roles' => 'Szerepkörök és szerepkör engedélyek kezelése', + 'role_manage_entity_permissions' => 'Minden könyv, fejezet és oldalengedély kezelése', + 'role_manage_own_entity_permissions' => 'Saját könyv, fejezet és oldalak engedélyeinek kezelése', + 'role_manage_settings' => 'Alkalmazás beállításainak kezelése', + 'role_asset' => 'Eszköz jogosultságok', + 'role_asset_desc' => 'Ezek a jogosultság vezérlik a alapértelmezés szerinti hozzáférést a rendszerben található eszközökhöz. A könyvek, fejezetek és oldalak jogosultságai felülírják ezeket a jogosultságokat.', + 'role_asset_admins' => 'Az adminisztrátorok automatikusan hozzáférést kapnak minden tartalomhoz, de ezek a beállítások megjeleníthetnek vagy elrejthetnek felhasználói felület beállításokat.', + 'role_all' => 'Összes', + 'role_own' => 'Saját', + 'role_controlled_by_asset' => 'Az általuk feltöltött eszköz által ellenőrzött', + 'role_save' => 'Szerepkör mentése', + 'role_update_success' => 'Szerepkör sikeresen frissítve', + 'role_users' => 'Felhasználók ebben a szerepkörben', + 'role_users_none' => 'Jelenleg nincsenek felhasználók hozzárendelve ehhez a szerepkörhöz', + + // Users + 'users' => 'Felhasználók', + 'user_profile' => 'Felhasználói profil', + 'users_add_new' => 'Új felhasználó hozzáadása', + 'users_search' => 'Felhasználók keresése', + 'users_details' => 'Felhasználó részletei', + 'users_details_desc' => 'Egy megjelenítendő név és email cím beállítása ennek a felhasználónak. Az email cím az alkalmazásba történő bejelentkezéshez lesz használva.', + 'users_details_desc_no_email' => 'Egy megjelenítendő név beállítása ennek a felhasználónak amiről mások felismerik.', + 'users_role' => 'Felhasználói szerepkörök', + 'users_role_desc' => 'A felhasználó melyik szerepkörhöz lesz rendelve. Ha a felhasználó több szerepkörhöz van rendelve, akkor ezeknek a szerepköröknek a jogosultságai összeadódnak, és a a felhasználó a hozzárendelt szerepkörök minden képességét megkapja.', + 'users_password' => 'Felhasználó jelszava', + 'users_password_desc' => 'Az alkalmazásba bejelentkezéshez használható jelszó beállítása. Legalább 5 karakter hosszúnak kell lennie.', + 'users_external_auth_id' => 'Külső hitelesítés azonosítója', + 'users_external_auth_id_desc' => 'Ez az azonosító lesz használva a felhasználó ellenőrzéséhez mikor az LDAP rendszerrel kommunikál.', + 'users_password_warning' => 'A lenti mezőket csak a jelszó módosításához kell kitölteni.', + 'users_system_public' => 'Ez a felhasználó bármelyik, a példányt megtekintő felhasználót képviseli. Nem lehet vele bejelentkezni de automatikusan hozzá lesz rendelve.', + 'users_delete' => 'Felhasználó törlése', + 'users_delete_named' => ':userName felhasználó törlése', + 'users_delete_warning' => '\':userName\' felhasználó teljesen törölve lesz a rendszerből.', + 'users_delete_confirm' => 'Biztosan törölhető ez a felhasználó?', + 'users_delete_success' => 'Felhasználó sikeresen eltávolítva', + 'users_edit' => 'Felhasználó szerkesztése', + 'users_edit_profile' => 'Profil szerkesztése', + 'users_edit_success' => 'Felhasználó sikeresen frissítve', + 'users_avatar' => 'Avatar használata', + 'users_avatar_desc' => 'A felhasználót ábrázoló kép kiválasztása. Kb. 256px méretű négyzetes képnek kell lennie.', + 'users_preferred_language' => 'Előnyben részesített nyelv', + 'users_preferred_language_desc' => 'Ez a beállítás megváltoztatja az alkalmazás felhasználói felületén használt nyelvet. Nincs hatása a felhasználók által létrehozott tartalomra.', + 'users_social_accounts' => 'Közösségi fiókok', + 'users_social_accounts_info' => 'Itt lehet egyéb fiókokat hozzákapcsolni a gyorsabb és könnyebb bejelentkezés érdekében. Itt olyan fiókot lehet lecsatlakoztatni, melynek korábban nem volt engedélyezett hozzáférése. Visszavonja a hozzáférést a csatlakoztatott szociális fiók profilbeállításaiból.', + 'users_social_connect' => 'Fiók csatlakoztatása', + 'users_social_disconnect' => 'Fiók lecsatlakoztatása', + 'users_social_connected' => ':socialAccount fiók sikeresen csatlakoztatva a profilhoz.', + 'users_social_disconnected' => ':socialAccount fiók sikeresen lecsatlakoztatva a profilról.', + + //! Since these labels are already localized this array does not need to be + //! translated in the language-specific files. + //! DELETE BELOW IF COPIED FROM EN + //!//////////////////////////////// + 'language_select' => [ + 'en' => 'English', + 'ar' => 'العربية', + 'de' => 'Deutsch (Sie)', + 'de_informal' => 'Deutsch (Du)', + 'es' => 'Español', + 'es_AR' => 'Español Argentina', + 'fr' => 'Français', + 'nl' => 'Nederlands', + 'pt_BR' => 'Português do Brasil', + 'sk' => 'Slovensky', + 'cs' => 'Česky', + 'sv' => 'Svenska', + 'kr' => '한국어', + 'ja' => '日本語', + 'pl' => 'Polski', + 'it' => 'Italian', + 'ru' => 'Русский', + 'uk' => 'Українська', + 'zh_CN' => '简体中文', + 'zh_TW' => '繁體中文' + ] + //!//////////////////////////////// +]; diff --git a/resources/lang/hu/validation.php b/resources/lang/hu/validation.php new file mode 100644 index 000000000..68a444643 --- /dev/null +++ b/resources/lang/hu/validation.php @@ -0,0 +1,85 @@ + ':attribute elfogadott kell legyen.', + 'active_url' => ':attribute nem érvényes webcím.', + 'after' => ':attribute dátumnak :date utáninak kell lennie.', + 'alpha' => ':attribute csak betűket tartalmazhat.', + 'alpha_dash' => ':attribute csak betűket, számokat és kötőjeleket tartalmazhat.', + 'alpha_num' => ':attribute csak betűket és számokat tartalmazhat.', + 'array' => ':attribute tömb kell legyen.', + 'before' => ':attribute dátumnak :date előttinek kell lennie.', + 'between' => [ + 'numeric' => ':attribute értékének :min és :max között kell lennie.', + 'file' => ':attribute értékének :min és :max kilobájt között kell lennie.', + 'string' => ':attribute hosszának :min és :max karakter között kell lennie.', + 'array' => ':attribute mennyiségének :min és :max elem között kell lennie.', + ], + 'boolean' => ':attribute mezőnek igaznak vagy hamisnak kell lennie.', + 'confirmed' => ':attribute megerősítés nem egyezik.', + 'date' => ':attribute nem érvényes dátum.', + 'date_format' => ':attribute nem egyezik :format formátummal.', + 'different' => ':attribute és :other értékének különböznie kell.', + 'digits' => ':attribute :digits számból kell álljon.', + 'digits_between' => ':attribute hosszának :min és :max számjegy között kell lennie.', + 'email' => ':attribute érvényes email cím kell legyen.', + 'filled' => ':attribute mező kötelező.', + 'exists' => 'A kiválasztott :attribute érvénytelen.', + 'image' => ':attribute kép kell legyen.', + 'image_extension' => 'A :attribute kép kiterjesztése érvényes és támogatott kell legyen.', + 'in' => 'A kiválasztott :attribute érvénytelen.', + 'integer' => ':attribute egész szám kell legyen.', + 'ip' => ':attribute érvényes IP cím kell legyen.', + 'max' => [ + 'numeric' => ':attribute nem lehet nagyobb mint :max.', + 'file' => ':attribute nem lehet nagyobb mint :max kilobájt.', + 'string' => ':attribute nem lehet nagyobb mint :max karakter.', + 'array' => ':attribute mennyisége nem lehet több mint :max elem.', + ], + 'mimes' => 'A :attribute típusa csak :values lehet.', + 'min' => [ + 'numeric' => ':attribute legalább :min kell legyen.', + 'file' => ':attribute legalább :min kilobájt kell legyen.', + 'string' => ':attribute legalább :min karakter kell legyen.', + 'array' => ':attribute legalább :min elem kell legyen.', + ], + 'no_double_extension' => ':attribute csak egy fájlkiterjesztéssel rendelkezhet.', + 'not_in' => 'A kiválasztott :attribute érvénytelen.', + 'numeric' => ':attribute szám kell legyen.', + 'regex' => ':attribute formátuma érvénytelen.', + 'required' => ':attribute mező kötelező.', + 'required_if' => ':attribute mező kötelező ha :other értéke :value.', + 'required_with' => ':attribute mező kötelező ha :values be van állítva.', + 'required_with_all' => ':attribute mező kötelező ha van :value.', + 'required_without' => ':attribute mező kötelező ha :values nincs beállítva.', + 'required_without_all' => ':attribute mező kötelező ha egyik :values sincs beállítva.', + 'same' => ':attribute és :other értékének egyeznie kell.', + 'size' => [ + 'numeric' => ':attribute :size méretű kell legyen.', + 'file' => ':attribute :size kilobájt méretű kell legyen.', + 'string' => ':attribute :size karakter kell legyen.', + 'array' => ':attribute : size elemet kell tartalmazzon.', + ], + 'string' => ':attribute karaktersorozatnak kell legyen.', + 'timezone' => ':attribute érvényes zóna kell legyen.', + 'unique' => ':attribute már elkészült.', + 'url' => ':attribute formátuma érvénytelen.', + 'uploaded' => 'A fájlt nem lehet feltölteni. A kiszolgáló nem fogad el ilyen méretű fájlokat.', + + // Custom validation lines + 'custom' => [ + 'password-confirm' => [ + 'required_with' => 'Jelszó megerősítés szükséges', + ], + ], + + // Custom validation attributes + 'attributes' => [], +]; From fbf8378ae56ea0405b42f914408591fd5c17f244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20R=C3=B6hrig?= Date: Wed, 31 Jul 2019 13:11:06 +0200 Subject: [PATCH 08/13] German translation extended --- resources/lang/de/activities.php | 1 - resources/lang/de/auth.php | 2 ++ resources/lang/de/common.php | 12 ++++++++++++ resources/lang/de/entities.php | 19 ++++++++++++++++--- resources/lang/de/errors.php | 4 ++++ resources/lang/de/settings.php | 31 +++++++++++++++++++++++++------ resources/lang/de/validation.php | 6 ++++++ 7 files changed, 65 insertions(+), 10 deletions(-) diff --git a/resources/lang/de/activities.php b/resources/lang/de/activities.php index be2eb54b8..35b2c9f8a 100644 --- a/resources/lang/de/activities.php +++ b/resources/lang/de/activities.php @@ -17,7 +17,6 @@ return [ 'page_restore' => 'stellt Seite wieder her', 'page_restore_notification' => 'Die Seite wurde erfolgreich wiederhergestellt.', 'page_move' => 'verschiebt Seite', - 'page_move_notification' => 'Die Seite wurde erfolgreich verschoben.', // Chapters 'chapter_create' => 'erstellt Kapitel', diff --git a/resources/lang/de/auth.php b/resources/lang/de/auth.php index 7b1ebec6e..46d4070b8 100644 --- a/resources/lang/de/auth.php +++ b/resources/lang/de/auth.php @@ -30,6 +30,8 @@ return [ 'remember_me' => 'Angemeldet bleiben', 'ldap_email_hint' => 'Bitte geben Sie eine E-Mail-Adresse ein, um diese mit dem Account zu nutzen.', 'create_account' => 'Account registrieren', + 'already_have_account' => 'Bereits ein Konto erstellt?', + 'dont_have_account' => 'Noch kein Konto erstellt?', 'social_login' => 'Mit Sozialem Netzwerk anmelden', 'social_registration' => 'Mit Sozialem Netzwerk registrieren', 'social_registration_text' => 'Mit einer dieser Dienste registrieren oder anmelden', diff --git a/resources/lang/de/common.php b/resources/lang/de/common.php index 5579a488a..97b48ce4d 100644 --- a/resources/lang/de/common.php +++ b/resources/lang/de/common.php @@ -10,6 +10,7 @@ return [ 'save' => 'Speichern', 'continue' => 'Weiter', 'select' => 'Auswählen', + 'toggle_all' => 'Alle umschalten', 'more' => 'Mehr', /** @@ -26,6 +27,7 @@ return [ */ 'actions' => 'Aktionen', 'view' => 'Anzeigen', + 'view_all' => 'Alle anzeigen', 'create' => 'Anlegen', 'update' => 'Aktualisieren', 'edit' => 'Bearbeiten', @@ -40,6 +42,11 @@ return [ 'remove' => 'Entfernen', 'add' => 'Hinzufügen', + // Sort Options + 'sort_name' => 'Name', + 'sort_created_at' => 'Erstellungsdatum', + 'sort_updated_at' => 'Aktualisierungsdatum', + /** * Misc */ @@ -52,6 +59,7 @@ return [ 'details' => 'Details', 'grid_view' => 'Gitteransicht', 'list_view' => 'Listenansicht', + 'default' => 'Voreinstellung', /** * Header @@ -59,6 +67,10 @@ return [ 'view_profile' => 'Profil ansehen', 'edit_profile' => 'Profil bearbeiten', + // Layout tabs + 'tab_info' => 'Info', + 'tab_content' => 'Inhalt', + /** * Email Content */ diff --git a/resources/lang/de/entities.php b/resources/lang/de/entities.php index 07a92e2c7..d67419543 100644 --- a/resources/lang/de/entities.php +++ b/resources/lang/de/entities.php @@ -8,6 +8,7 @@ return [ 'recently_updated_pages' => 'Kürzlich aktualisierte Seiten', 'recently_created_chapters' => 'Kürzlich angelegte Kapitel', 'recently_created_books' => 'Kürzlich angelegte Bücher', + 'recently_created_shelves' => 'Kürzlich angelegte Regale', 'recently_update' => 'Kürzlich aktualisiert', 'recently_viewed' => 'Kürzlich angesehen', 'recent_activity' => 'Kürzliche Aktivität', @@ -49,28 +50,32 @@ return [ 'search_content_type' => 'Inhaltstyp', 'search_exact_matches' => 'Exakte Treffer', 'search_tags' => 'Nach Schlagwort suchen', + 'search_options' => 'Optionen', 'search_viewed_by_me' => 'Schon von mir angesehen', 'search_not_viewed_by_me' => 'Noch nicht von mir angesehen', 'search_permissions_set' => 'Berechtigungen gesetzt', 'search_created_by_me' => 'Von mir erstellt', 'search_updated_by_me' => 'Von mir aktualisiert', + 'search_date_options' => 'Datums Optionen', 'search_updated_before' => 'Aktualisiert vor', 'search_updated_after' => 'Aktualisiert nach', 'search_created_before' => 'Erstellt vor', 'search_created_after' => 'Erstellt nach', 'search_set_date' => 'Datum auswählen', 'search_update' => 'Suche aktualisieren', - + /* * Shelves */ 'shelf' => 'Regal', 'shelves' => 'Regale', + 'x_shelves' => ':count Regal|:count Regale', 'shelves_long' => 'Bücherregal', 'shelves_empty' => 'Es wurden noch keine Regale angelegt', 'shelves_create' => 'Erzeuge ein Regal', 'shelves_popular' => 'Beliebte Regale', 'shelves_new' => 'Kürzlich erstellte Regale', + 'shelves_new_action' => 'Neues Regal', 'shelves_popular_empty' => 'Die beliebtesten Regale werden hier angezeigt.', 'shelves_new_empty' => 'Die neusten Regale werden hier angezeigt.', 'shelves_save' => 'Regal speichern', @@ -92,7 +97,7 @@ return [ 'shelves_copy_permissions' => 'Berechtigungen kopieren', 'shelves_copy_permissions_explain' => 'Hiermit werden die Berechtigungen des aktuellen Regals auf alle enthaltenen Bücher übertragen. Überprüfen Sie vor der Aktivierung, ob alle Berechtigungsänderungen am aktuellen Regal gespeichert wurden.', 'shelves_copy_permission_success' => 'Regal-Berechtigungen wurden zu :count Büchern kopiert', - + /** * Books */ @@ -103,6 +108,7 @@ return [ 'books_popular' => 'Beliebte Bücher', 'books_recent' => 'Kürzlich angesehene Bücher', 'books_new' => 'Neue Bücher', + 'books_new_action' => 'Neues Buch', 'books_popular_empty' => 'Die beliebtesten Bücher werden hier angezeigt.', 'books_new_empty' => 'Die neusten Bücher werden hier angezeigt.', 'books_create' => 'Neues Buch erstellen', @@ -118,7 +124,6 @@ return [ 'books_permissions_updated' => 'Buch-Berechtigungen aktualisiert', 'books_empty_contents' => 'Es sind noch keine Seiten oder Kapitel zu diesem Buch hinzugefügt worden.', 'books_empty_create_page' => 'Neue Seite anlegen', - 'books_empty_or' => 'oder', 'books_empty_sort_current_book' => 'Aktuelles Buch sortieren', 'books_empty_add_chapter' => 'Neues Kapitel hinzufügen', 'books_permissions_active' => 'Buch-Berechtigungen aktiv', @@ -126,6 +131,11 @@ return [ 'books_navigation' => 'Buchnavigation', 'books_sort' => 'Buchinhalte sortieren', 'books_sort_named' => 'Buch ":bookName" sortieren', + 'books_sort_name' => 'Sortieren nach Namen', + 'books_sort_created' => 'Sortieren nach Erstellungsdatum', + 'books_sort_updated' => 'Sortieren nach Aktualisierungsdatum', + 'books_sort_chapters_first' => 'Kapitel zuerst', + 'books_sort_chapters_last' => 'Kapitel zuletzt', 'books_sort_show_other' => 'Andere Bücher anzeigen', 'books_sort_save' => 'Neue Reihenfolge speichern', /** @@ -232,6 +242,7 @@ return [ 'page_tags' => 'Seiten-Schlagwörter', 'chapter_tags' => 'Kapitel-Schlagwörter', 'book_tags' => 'Buch-Schlagwörter', + 'shelf_tags' => 'Regal-Schlagwörter', 'tag' => 'Schlagwort', 'tags' => 'Schlagwörter', 'tag_value' => 'Inhalt (Optional)', @@ -270,6 +281,7 @@ return [ 'profile_not_created_pages' => ':userName hat noch keine Seiten erstellt.', 'profile_not_created_chapters' => ':userName hat noch keine Kapitel erstellt.', 'profile_not_created_books' => ':userName hat noch keine Bücher erstellt.', + 'profile_not_created_shelves' => ':userName hat noch keine Regale erstellt.', /** * Comments */ @@ -294,6 +306,7 @@ return [ * Revision */ 'revision_delete_confirm' => 'Sind Sie sicher, dass Sie diese Revision löschen wollen?', + 'revision_restore_confirm' => 'Sind Sie sicher, dass Sie diese Revision wiederherstellen wollen? Der aktuelle Seiteninhalt wird ersetzt.', 'revision_delete_success' => 'Revision gelöscht', 'revision_cannot_delete_latest' => 'Die letzte Version kann nicht gelöscht werden.' ]; diff --git a/resources/lang/de/errors.php b/resources/lang/de/errors.php index dc95d1d2b..362641bc8 100644 --- a/resources/lang/de/errors.php +++ b/resources/lang/de/errors.php @@ -30,6 +30,7 @@ return [ 'cannot_get_image_from_url' => 'Bild konnte nicht von der URL :url geladen werden.', 'cannot_create_thumbs' => 'Der Server kann keine Vorschau-Bilder erzeugen. Bitte prüfen Sie, ob die GD PHP-Erweiterung installiert ist.', 'server_upload_limit' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuchen Sie es mit einer kleineren Datei.', + 'uploaded' => 'Der Server verbietet das Hochladen von Dateien mit dieser Dateigröße. Bitte versuchen Sie es mit einer kleineren Datei.', 'image_upload_error' => 'Beim Hochladen des Bildes trat ein Fehler auf.', 'image_upload_type_error' => 'Der Bildtyp der hochgeladenen Datei ist ungültig.', 'file_upload_timeout' => 'Der Upload der Datei ist abgelaufen.', @@ -43,6 +44,7 @@ return [ // Entities 'entity_not_found' => 'Eintrag nicht gefunden', 'book_not_found' => 'Buch nicht gefunden', + 'bookshelf_not_found' => 'Regal nicht gefunden', 'page_not_found' => 'Seite nicht gefunden', 'chapter_not_found' => 'Kapitel nicht gefunden', 'selected_book_not_found' => 'Das gewählte Buch wurde nicht gefunden.', @@ -55,6 +57,8 @@ return [ 'role_cannot_be_edited' => 'Diese Rolle kann nicht bearbeitet werden.', 'role_system_cannot_be_deleted' => 'Dies ist eine Systemrolle und kann nicht gelöscht werden', 'role_registration_default_cannot_delete' => 'Diese Rolle kann nicht gelöscht werden, solange sie als Standardrolle für neue Registrierungen gesetzt ist', + 'role_cannot_remove_only_admin' => 'Dieser Benutzer ist der einzige Benutzer, welchem die Administratorrolle zugeordnet ist. Ordnen Sie die Administratorrolle einem anderen Benutzer zu, bevor Sie versuchen, sie hier zu entfernen.', + // Comments 'comment_list' => 'Beim Abrufen der Kommentare ist ein Fehler aufgetreten.', 'cannot_add_comment_to_draft' => 'Du kannst keine Kommentare zu einem Entwurf hinzufügen.', diff --git a/resources/lang/de/settings.php b/resources/lang/de/settings.php index 0a8d50d05..11050924e 100644 --- a/resources/lang/de/settings.php +++ b/resources/lang/de/settings.php @@ -11,10 +11,16 @@ return [ /** * App settings */ - 'app_settings' => 'Anwendungseinstellungen', + 'app_customization' => 'Personalisierung', + 'app_features_security' => 'Funktionen & Sicherheit', 'app_name' => 'Anwendungsname', 'app_name_desc' => 'Dieser Name wird im Header und in E-Mails angezeigt.', 'app_name_header' => 'Anwendungsname im Header anzeigen?', + 'app_public_access' => 'Öffentlicher Zugriff', + 'app_public_access_desc' => 'Wenn Sie diese Option aktivieren, können Besucher, die nicht angemeldet sind, auf Inhalte in Ihrer BookStack-Instanz zugreifen.', + 'app_public_access_desc_guest' => 'Der Zugang für öffentliche Besucher kann über den Benutzer "Guest" gesteuert werden.', + 'app_public_access_toggle' => 'Öffentlichen Zugriff erlauben', + 'app_public_viewing' => 'Öffentliche Ansicht erlauben?', 'app_secure_images' => 'Erhöhte Sicherheit für hochgeladene Bilder aktivieren?', 'app_secure_images_desc' => 'Aus Leistungsgründen sind alle Bilder öffentlich sichtbar. Diese Option fügt zufällige, schwer zu eratene, Zeichenketten zu Bild-URLs hinzu. Stellen sie sicher, dass Verzeichnisindizes deaktiviert sind, um einen einfachen Zugriff zu verhindern.', @@ -28,22 +34,25 @@ return [ 'app_primary_color_desc' => "Dies sollte ein HEX Wert sein.\nWenn Sie nicht eingeben, wird die Anwendung auf die Standardfarbe zurückgesetzt.", 'app_homepage' => 'Startseite der Anwendung', 'app_homepage_desc' => 'Wählen Sie eine Seite als Startseite aus, die statt der Standardansicht angezeigt werden soll. Seitenberechtigungen werden für die ausgewählten Seiten ignoriert.', - 'app_homepage_default' => 'Ausgewählte Startseite', - 'app_homepage_books' => 'Oder wähle die Buch-Übersicht als Startseite. Das wird die Seiten-Auswahl überschreiben.', + 'app_homepage_select' => 'Wählen Sie eine Seite aus', 'app_disable_comments' => 'Kommentare deaktivieren', + 'app_disable_comments_toggle' => 'Kommentare deaktivieren', 'app_disable_comments_desc' => 'Deaktiviert Kommentare über alle Seiten in der Anwendung. Vorhandene Kommentare werden nicht angezeigt.', /** * Registration settings */ 'reg_settings' => 'Registrierungseinstellungen', - 'reg_allow' => 'Registrierung erlauben?', + 'reg_enable' => 'Registrierung erlauben?', + 'reg_enable_toggle' => 'Registrierung erlauben', + 'reg_enable_desc' => 'Wenn die Registrierung erlaubt ist, kann sich der Benutzer als Anwendungsbenutzer anmelden. Bei der Registrierung erhält er eine einzige, voreingestellte Benutzerrolle.', 'reg_default_role' => 'Standard-Benutzerrolle nach Registrierung', - 'reg_confirm_email' => 'Bestätigung per E-Mail erforderlich?', + 'reg_email_confirmation' => 'Bestätigung per E-Mail', + 'reg_email_confirmation_toggle' => 'Bestätigung per E-Mail erforderlich', 'reg_confirm_email_desc' => 'Falls die Einschränkung für Domains genutzt wird, ist die Bestätigung per E-Mail zwingend erforderlich und der untenstehende Wert wird ignoriert.', 'reg_confirm_restrict_domain' => 'Registrierung auf bestimmte Domains einschränken', 'reg_confirm_restrict_domain_desc' => "Fügen sie eine durch Komma getrennte Liste von Domains hinzu, auf die die Registrierung eingeschränkt werden soll. Benutzern wird eine E-Mail gesendet, um ihre E-Mail Adresse zu bestätigen, bevor sie diese Anwendung nutzen können.\nHinweis: Benutzer können ihre E-Mail Adresse nach erfolgreicher Registrierung ändern.", 'reg_confirm_restrict_domain_placeholder' => 'Keine Einschränkung gesetzt', - + /** * Maintenance settings */ @@ -74,6 +83,7 @@ return [ 'role_details' => 'Rollendetails', 'role_name' => 'Rollenname', 'role_desc' => 'Kurzbeschreibung der Rolle', + 'role_external_auth_id' => 'Externe Authentifizierungs-IDs', 'role_system' => 'System-Berechtigungen', 'role_manage_users' => 'Benutzer verwalten', 'role_manage_roles' => 'Rollen und Rollen-Berechtigungen verwalten', @@ -82,6 +92,7 @@ return [ 'role_manage_settings' => 'Globaleinstellungen verwalten', 'role_asset' => 'Berechtigungen', 'role_asset_desc' => 'Diese Berechtigungen gelten für den Standard-Zugriff innerhalb des Systems. Berechtigungen für Bücher, Kapitel und Seiten überschreiben diese Berechtigungenen.', + 'role_asset_admins' => 'Administratoren erhalten automatisch Zugriff auf alle Inhalte, aber diese Optionen können Oberflächenoptionen ein- oder ausblenden.', 'role_all' => 'Alle', 'role_own' => 'Eigene', 'role_controlled_by_asset' => 'Berechtigungen werden vom Uploadziel bestimmt', @@ -96,8 +107,15 @@ return [ 'user_profile' => 'Benutzerprofil', 'users_add_new' => 'Benutzer hinzufügen', 'users_search' => 'Benutzer suchen', + 'users_details' => 'Benutzerdetails', + 'users_details_desc' => 'Legen Sie für diesen Benutzer einen Anzeigenamen und eine E-Mail-Adresse fest. Die E-Mail-Adresse wird bei der Anmeldung verwendet.', + 'users_details_desc_no_email' => 'Legen Sie für diesen Benutzer einen Anzeigenamen fest, damit andere ihn erkennen können.', 'users_role' => 'Benutzerrollen', + 'users_role_desc' => 'Wählen Sie aus, welchen Rollen dieser Benutzer zugeordnet werden soll. Wenn ein Benutzer mehreren Rollen zugeordnet ist, werden die Berechtigungen dieser Rollen gestapelt und er erhält alle Fähigkeiten der zugewiesenen Rollen.', + 'users_password' => 'Benutzerpasswort', + 'users_password_desc' => 'Legen Sie ein Passwort fest, mit dem Sie sich anmelden möchten. Diese muss mindestens 5 Zeichen lang sein.', 'users_external_auth_id' => 'Externe Authentifizierungs-ID', + 'users_external_auth_id_desc' => 'Dies ist die ID, die verwendet wird, um diesen Benutzer bei der Kommunikation mit Ihrem LDAP-System abzugleichen.', 'users_password_warning' => 'Füllen Sie die folgenden Felder nur aus, wenn Sie Ihr Passwort ändern möchten:', 'users_system_public' => 'Dieser Benutzer repräsentiert alle unangemeldeten Benutzer, die diese Seite betrachten. Er kann nicht zum Anmelden benutzt werden, sondern wird automatisch zugeordnet.', 'users_delete' => 'Benutzer löschen', @@ -111,6 +129,7 @@ return [ 'users_avatar' => 'Benutzer-Bild', 'users_avatar_desc' => 'Das Bild sollte eine Auflösung von 256x256px haben.', 'users_preferred_language' => 'Bevorzugte Sprache', + 'users_preferred_language_desc' => 'Diese Option ändert die Sprache, die für die Benutzeroberfläche der Anwendung verwendet wird. Dies hat keinen Einfluss auf von Benutzern erstellte Inhalte.', 'users_social_accounts' => 'Social-Media Konten', 'users_social_accounts_info' => 'Hier können Sie andere Social-Media-Konten für eine schnellere und einfachere Anmeldung verknüpfen. Wenn Sie ein Social-Media Konto lösen, bleibt der Zugriff erhalten. Entfernen Sie in diesem Falle die Berechtigung in Ihren Profil-Einstellungen des verknüpften Social-Media-Kontos.', 'users_social_connect' => 'Social-Media-Konto verknüpfen', diff --git a/resources/lang/de/validation.php b/resources/lang/de/validation.php index 5ac4b1b27..84faeebb7 100644 --- a/resources/lang/de/validation.php +++ b/resources/lang/de/validation.php @@ -38,6 +38,7 @@ return [ 'filled' => ':attribute ist erforderlich.', 'exists' => ':attribute ist ungültig.', 'image' => ':attribute muss ein Bild sein.', + 'image_extension' => ':attribute muss eine gültige und unterstützte Bild-Dateiendung haben.', 'in' => ':attribute ist ungültig.', 'integer' => ':attribute muss eine Zahl sein.', 'ip' => ':attribute muss eine valide IP-Adresse sein.', @@ -54,6 +55,7 @@ return [ 'string' => ':attribute muss mindestens :min Zeichen lang sein.', 'array' => ':attribute muss mindesten :min Elemente enthalten.', ], + 'no_double_extension' => ':attribute darf nur eine gültige Dateiendung', 'not_in' => ':attribute ist ungültig.', 'numeric' => ':attribute muss eine Zahl sein.', 'regex' => ':attribute ist in einem ungültigen Format.', @@ -74,6 +76,7 @@ return [ 'timezone' => ':attribute muss eine valide zeitzone sein.', 'unique' => ':attribute wird bereits verwendet.', 'url' => ':attribute ist kein valides Format.', + 'uploaded' => 'Die Datei konnte nicht hochgeladen werden. Der Server akzeptiert möglicherweise keine Dateien dieser Größe.', /* |-------------------------------------------------------------------------- @@ -90,6 +93,9 @@ return [ 'attribute-name' => [ 'rule-name' => 'custom-message', ], + 'password-confirm' => [ + 'required_with' => 'Passwortbestätigung erforderlich', + ], ], /* From 4b0c4e621a55d5f6f59de7451c7442a4571ad72e Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 4 Aug 2019 14:26:39 +0100 Subject: [PATCH 09/13] Replaced use of custom 'baseUrl' helper with 'url' Also changed up how base URL setting was being done by manipulating incoming request URLs instead of altering then on generation. --- app/Auth/User.php | 8 +- app/Config/app.php | 4 + app/Entities/Book.php | 6 +- app/Entities/Bookshelf.php | 6 +- app/Entities/Chapter.php | 7 +- app/Entities/Page.php | 4 +- app/Http/Controllers/Auth/LoginController.php | 4 +- .../Controllers/Auth/RegisterController.php | 40 +++++---- app/Http/Controllers/PageController.php | 2 +- app/Http/Controllers/SearchController.php | 2 +- app/Http/Middleware/Authenticate.php | 2 +- app/Http/Request.php | 26 ++++++ app/Notifications/ConfirmEmail.php | 2 +- app/Notifications/ResetPassword.php | 2 +- app/Providers/AppServiceProvider.php | 10 +-- app/Providers/PaginationServiceProvider.php | 2 +- app/Uploads/Attachment.php | 2 +- app/Uploads/ImageService.php | 4 +- app/UrlGenerator.php | 58 ------------ app/helpers.php | 88 ++++--------------- public/index.php | 3 +- .../views/auth/forms/login/standard.blade.php | 2 +- resources/views/auth/login.blade.php | 6 +- .../views/auth/passwords/email.blade.php | 2 +- .../views/auth/passwords/reset.blade.php | 2 +- resources/views/auth/register.blade.php | 6 +- .../views/auth/user-unconfirmed.blade.php | 2 +- resources/views/base.blade.php | 2 +- resources/views/books/create.blade.php | 2 +- resources/views/books/form.blade.php | 6 +- resources/views/books/index.blade.php | 2 +- resources/views/books/list.blade.php | 2 +- resources/views/common/header.blade.php | 26 +++--- resources/views/common/home-sidebar.blade.php | 2 +- resources/views/common/home.blade.php | 2 +- .../views/components/expand-toggle.blade.php | 2 +- .../views/components/page-picker.blade.php | 2 +- resources/views/components/tag-list.blade.php | 4 +- .../views/components/tag-manager.blade.php | 4 +- resources/views/errors/404.blade.php | 2 +- resources/views/errors/500.blade.php | 2 +- resources/views/pages/edit.blade.php | 2 +- .../views/partials/breadcrumbs.blade.php | 8 +- resources/views/partials/sort.blade.php | 2 +- .../views/partials/view-toggle.blade.php | 2 +- resources/views/search/all.blade.php | 2 +- resources/views/settings/index.blade.php | 10 +-- .../views/settings/maintenance.blade.php | 2 +- resources/views/settings/navbar.blade.php | 8 +- .../views/settings/roles/create.blade.php | 2 +- .../views/settings/roles/delete.blade.php | 4 +- resources/views/settings/roles/edit.blade.php | 2 +- resources/views/settings/roles/form.blade.php | 6 +- .../views/settings/roles/index.blade.php | 4 +- resources/views/shelves/create.blade.php | 2 +- resources/views/shelves/form.blade.php | 6 +- resources/views/shelves/index.blade.php | 2 +- resources/views/shelves/list.blade.php | 2 +- resources/views/users/create.blade.php | 4 +- resources/views/users/delete.blade.php | 4 +- resources/views/users/edit.blade.php | 12 +-- resources/views/users/index.blade.php | 8 +- resources/views/users/profile.blade.php | 8 +- .../vendor/notifications/email.blade.php | 4 +- tests/Auth/AuthTest.php | 2 +- tests/Unit/HelpersTest.php | 33 ------- tests/Unit/UrlTest.php | 25 ++++++ 67 files changed, 222 insertions(+), 306 deletions(-) create mode 100644 app/Http/Request.php delete mode 100644 app/UrlGenerator.php delete mode 100644 tests/Unit/HelpersTest.php create mode 100644 tests/Unit/UrlTest.php diff --git a/app/Auth/User.php b/app/Auth/User.php index 259b8eec0..e5a8a3931 100644 --- a/app/Auth/User.php +++ b/app/Auth/User.php @@ -168,14 +168,14 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ public function getAvatar($size = 50) { - $default = baseUrl('/user_avatar.png'); + $default = url('/user_avatar.png'); $imageId = $this->image_id; if ($imageId === 0 || $imageId === '0' || $imageId === null) { return $default; } try { - $avatar = $this->avatar ? baseUrl($this->avatar->getThumb($size, $size, false)) : $default; + $avatar = $this->avatar ? url($this->avatar->getThumb($size, $size, false)) : $default; } catch (\Exception $err) { $avatar = $default; } @@ -197,7 +197,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ public function getEditUrl() { - return baseUrl('/settings/users/' . $this->id); + return url('/settings/users/' . $this->id); } /** @@ -206,7 +206,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ public function getProfileUrl() { - return baseUrl('/user/' . $this->id); + return url('/user/' . $this->id); } /** diff --git a/app/Config/app.php b/app/Config/app.php index aaeafb98d..0a0c17a53 100755 --- a/app/Config/app.php +++ b/app/Config/app.php @@ -45,6 +45,10 @@ return [ // and used by BookStack in URL generation. 'url' => env('APP_URL', '') === 'http://bookstack.dev' ? '' : env('APP_URL', ''), + // Rewrite URL, Used to rewrite the base of request URLs + // for scenarios + 'url_base_rewrite' => env('APP_URL_BASE_REWRITE', null), + // Application timezone for back-end date functions. 'timezone' => env('APP_TIMEZONE', 'UTC'), diff --git a/app/Entities/Book.php b/app/Entities/Book.php index decdde9dc..7d3d5e4ae 100644 --- a/app/Entities/Book.php +++ b/app/Entities/Book.php @@ -25,9 +25,9 @@ class Book extends Entity public function getUrl($path = false) { if ($path !== false) { - return baseUrl('/books/' . urlencode($this->slug) . '/' . trim($path, '/')); + return url('/books/' . urlencode($this->slug) . '/' . trim($path, '/')); } - return baseUrl('/books/' . urlencode($this->slug)); + return url('/books/' . urlencode($this->slug)); } /** @@ -44,7 +44,7 @@ class Book extends Entity } try { - $cover = $this->cover ? baseUrl($this->cover->getThumb($width, $height, false)) : $default; + $cover = $this->cover ? url($this->cover->getThumb($width, $height, false)) : $default; } catch (\Exception $err) { $cover = $default; } diff --git a/app/Entities/Bookshelf.php b/app/Entities/Bookshelf.php index c8f8b990c..db6685688 100644 --- a/app/Entities/Bookshelf.php +++ b/app/Entities/Bookshelf.php @@ -39,9 +39,9 @@ class Bookshelf extends Entity public function getUrl($path = false) { if ($path !== false) { - return baseUrl('/shelves/' . urlencode($this->slug) . '/' . trim($path, '/')); + return url('/shelves/' . urlencode($this->slug) . '/' . trim($path, '/')); } - return baseUrl('/shelves/' . urlencode($this->slug)); + return url('/shelves/' . urlencode($this->slug)); } /** @@ -59,7 +59,7 @@ class Bookshelf extends Entity } try { - $cover = $this->cover ? baseUrl($this->cover->getThumb($width, $height, false)) : $default; + $cover = $this->cover ? url($this->cover->getThumb($width, $height, false)) : $default; } catch (\Exception $err) { $cover = $default; } diff --git a/app/Entities/Chapter.php b/app/Entities/Chapter.php index 936404758..b204f1903 100644 --- a/app/Entities/Chapter.php +++ b/app/Entities/Chapter.php @@ -42,10 +42,13 @@ class Chapter extends Entity public function getUrl($path = false) { $bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug; + $fullPath = '/books/' . urlencode($bookSlug) . '/chapter/' . urlencode($this->slug); + if ($path !== false) { - return baseUrl('/books/' . urlencode($bookSlug) . '/chapter/' . urlencode($this->slug) . '/' . trim($path, '/')); + $fullPath .= '/' . trim($path, '/'); } - return baseUrl('/books/' . urlencode($bookSlug) . '/chapter/' . urlencode($this->slug)); + + return url($fullPath); } /** diff --git a/app/Entities/Page.php b/app/Entities/Page.php index 1c2cc5cff..c32417418 100644 --- a/app/Entities/Page.php +++ b/app/Entities/Page.php @@ -96,10 +96,10 @@ class Page extends Entity $idComponent = $this->draft ? $this->id : urlencode($this->slug); if ($path !== false) { - return baseUrl('/books/' . urlencode($bookSlug) . $midText . $idComponent . '/' . trim($path, '/')); + return url('/books/' . urlencode($bookSlug) . $midText . $idComponent . '/' . trim($path, '/')); } - return baseUrl('/books/' . urlencode($bookSlug) . $midText . $idComponent); + return url('/books/' . urlencode($bookSlug) . $midText . $idComponent); } /** diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 21ded2355..c739fd9a3 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -53,8 +53,8 @@ class LoginController extends Controller $this->socialAuthService = $socialAuthService; $this->ldapService = $ldapService; $this->userRepo = $userRepo; - $this->redirectPath = baseUrl('/'); - $this->redirectAfterLogout = baseUrl('/login'); + $this->redirectPath = url('/'); + $this->redirectAfterLogout = url('/login'); parent::__construct(); } diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index d57105b62..a285899cc 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -2,17 +2,23 @@ namespace BookStack\Http\Controllers\Auth; +use BookStack\Auth\Access\EmailConfirmationService; +use BookStack\Auth\Access\SocialAuthService; use BookStack\Auth\SocialAccount; use BookStack\Auth\User; use BookStack\Auth\UserRepo; +use BookStack\Exceptions\SocialDriverNotConfigured; use BookStack\Exceptions\SocialSignInAccountNotUsed; use BookStack\Exceptions\SocialSignInException; use BookStack\Exceptions\UserRegistrationException; use BookStack\Http\Controllers\Controller; use Exception; use Illuminate\Foundation\Auth\RegistersUsers; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; +use Illuminate\Routing\Redirector; +use Illuminate\View\View; use Laravel\Socialite\Contracts\User as SocialUser; use Validator; @@ -46,18 +52,18 @@ class RegisterController extends Controller /** * Create a new controller instance. * - * @param \BookStack\Auth\Access\SocialAuthService $socialAuthService + * @param SocialAuthService $socialAuthService * @param \BookStack\Auth\EmailConfirmationService $emailConfirmationService - * @param \BookStack\Auth\UserRepo $userRepo + * @param UserRepo $userRepo */ - public function __construct(\BookStack\Auth\Access\SocialAuthService $socialAuthService, \BookStack\Auth\Access\EmailConfirmationService $emailConfirmationService, UserRepo $userRepo) + public function __construct(SocialAuthService $socialAuthService, EmailConfirmationService $emailConfirmationService, UserRepo $userRepo) { $this->middleware('guest')->only(['getRegister', 'postRegister', 'socialRegister']); $this->socialAuthService = $socialAuthService; $this->emailConfirmationService = $emailConfirmationService; $this->userRepo = $userRepo; - $this->redirectTo = baseUrl('/'); - $this->redirectPath = baseUrl('/'); + $this->redirectTo = url('/'); + $this->redirectPath = url('/'); parent::__construct(); } @@ -101,8 +107,8 @@ class RegisterController extends Controller /** * Handle a registration request for the application. - * @param Request|\Illuminate\Http\Request $request - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @param Request|Request $request + * @return RedirectResponse|Redirector * @throws UserRegistrationException */ public function postRegister(Request $request) @@ -117,7 +123,7 @@ class RegisterController extends Controller /** * Create a new user instance after a valid registration. * @param array $data - * @return \BookStack\Auth\User + * @return User */ protected function create(array $data) { @@ -133,7 +139,7 @@ class RegisterController extends Controller * @param array $userData * @param bool|false|SocialAccount $socialAccount * @param bool $emailVerified - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @return RedirectResponse|Redirector * @throws UserRegistrationException */ protected function registerUser(array $userData, $socialAccount = false, $emailVerified = false) @@ -182,7 +188,7 @@ class RegisterController extends Controller /** * Confirms an email via a token and logs the user into the system. * @param $token - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @return RedirectResponse|Redirector * @throws UserRegistrationException */ public function confirmEmail($token) @@ -200,7 +206,7 @@ class RegisterController extends Controller /** * Shows a notice that a user's email address has not been confirmed, * Also has the option to re-send the confirmation email. - * @return \Illuminate\View\View + * @return View */ public function showAwaitingConfirmation() { @@ -210,7 +216,7 @@ class RegisterController extends Controller /** * Resend the confirmation email * @param Request $request - * @return \Illuminate\View\View + * @return View */ public function resendConfirmation(Request $request) { @@ -235,7 +241,7 @@ class RegisterController extends Controller * @param $socialDriver * @return mixed * @throws UserRegistrationException - * @throws \BookStack\Exceptions\SocialDriverNotConfigured + * @throws SocialDriverNotConfigured */ public function socialRegister($socialDriver) { @@ -248,10 +254,10 @@ class RegisterController extends Controller * The callback for social login services. * @param $socialDriver * @param Request $request - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @return RedirectResponse|Redirector * @throws SocialSignInException * @throws UserRegistrationException - * @throws \BookStack\Exceptions\SocialDriverNotConfigured + * @throws SocialDriverNotConfigured */ public function socialCallback($socialDriver, Request $request) { @@ -292,7 +298,7 @@ class RegisterController extends Controller /** * Detach a social account from a user. * @param $socialDriver - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @return RedirectResponse|Redirector */ public function detachSocialAccount($socialDriver) { @@ -303,7 +309,7 @@ class RegisterController extends Controller * Register a new user after a registration callback. * @param string $socialDriver * @param SocialUser $socialUser - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @return RedirectResponse|Redirector * @throws UserRegistrationException */ protected function socialRegisterCallback(string $socialDriver, SocialUser $socialUser) diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 16a7d5a5e..89fb83fd9 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -541,7 +541,7 @@ class PageController extends Controller public function showRecentlyUpdated() { // TODO - Still exist? - $pages = $this->pageRepo->getRecentlyUpdatedPaginated('page', 20)->setPath(baseUrl('/pages/recently-updated')); + $pages = $this->pageRepo->getRecentlyUpdatedPaginated('page', 20)->setPath(url('/pages/recently-updated')); return view('pages.detailed-listing', [ 'title' => trans('entities.recently_updated_pages'), 'pages' => $pages diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index 4bcf7b40e..1691ee9b0 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -48,7 +48,7 @@ class SearchController extends Controller $this->setPageTitle(trans('entities.search_for_term', ['term' => $searchTerm])); $page = intval($request->get('page', '0')) ?: 1; - $nextPageLink = baseUrl('/search?term=' . urlencode($searchTerm) . '&page=' . ($page+1)); + $nextPageLink = url('/search?term=' . urlencode($searchTerm) . '&page=' . ($page+1)); $results = $this->searchService->searchEntities($searchTerm, 'all', $page, 20); diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 1a3384367..d840a9b2e 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -41,7 +41,7 @@ class Authenticate if ($request->ajax()) { return response('Unauthorized.', 401); } else { - return redirect()->guest(baseUrl('/login')); + return redirect()->guest(url('/login')); } } diff --git a/app/Http/Request.php b/app/Http/Request.php new file mode 100644 index 000000000..bd2761a0b --- /dev/null +++ b/app/Http/Request.php @@ -0,0 +1,26 @@ +getScheme().'://'.$this->getHttpHost(); + } + + return $base; + } + +} \ No newline at end of file diff --git a/app/Notifications/ConfirmEmail.php b/app/Notifications/ConfirmEmail.php index 7ecadc298..229408f5c 100644 --- a/app/Notifications/ConfirmEmail.php +++ b/app/Notifications/ConfirmEmail.php @@ -26,6 +26,6 @@ class ConfirmEmail extends MailNotification ->subject(trans('auth.email_confirm_subject', $appName)) ->greeting(trans('auth.email_confirm_greeting', $appName)) ->line(trans('auth.email_confirm_text')) - ->action(trans('auth.email_confirm_action'), baseUrl('/register/confirm/' . $this->token)); + ->action(trans('auth.email_confirm_action'), url('/register/confirm/' . $this->token)); } } diff --git a/app/Notifications/ResetPassword.php b/app/Notifications/ResetPassword.php index 305a7da72..208752764 100644 --- a/app/Notifications/ResetPassword.php +++ b/app/Notifications/ResetPassword.php @@ -29,7 +29,7 @@ class ResetPassword extends MailNotification return $this->newMailMessage() ->subject(trans('auth.email_reset_subject', ['appName' => setting('app-name')])) ->line(trans('auth.email_reset_text')) - ->action(trans('auth.reset_password'), baseUrl('password/reset/' . $this->token)) + ->action(trans('auth.reset_password'), url('password/reset/' . $this->token)) ->line(trans('auth.email_reset_not_requested')); } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 6bc1f9047..a2fc673f4 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -8,11 +8,11 @@ use BookStack\Entities\Chapter; use BookStack\Entities\Page; use BookStack\Settings\Setting; use BookStack\Settings\SettingService; -use BookStack\UrlGenerator; use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; use Schema; +use URL; use Validator; class AppServiceProvider extends ServiceProvider @@ -24,6 +24,9 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { + // Set root URL + URL::forceRootUrl(config('app.url')); + // Custom validation methods Validator::extend('image_extension', function ($attribute, $value, $parameters, $validator) { $validImageExtensions = ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'tiff', 'webp']; @@ -73,10 +76,5 @@ class AppServiceProvider extends ServiceProvider $this->app->singleton(SettingService::class, function ($app) { return new SettingService($app->make(Setting::class), $app->make('Illuminate\Contracts\Cache\Repository')); }); - - $this->app->bind( - \Illuminate\Contracts\Routing\UrlGenerator::class, - UrlGenerator::class - ); } } diff --git a/app/Providers/PaginationServiceProvider.php b/app/Providers/PaginationServiceProvider.php index 3a695c5e3..1c982b82e 100644 --- a/app/Providers/PaginationServiceProvider.php +++ b/app/Providers/PaginationServiceProvider.php @@ -18,7 +18,7 @@ class PaginationServiceProvider extends IlluminatePaginationServiceProvider }); Paginator::currentPathResolver(function () { - return baseUrl($this->app['request']->path()); + return url($this->app['request']->path()); }); Paginator::currentPageResolver(function ($pageName = 'page') { diff --git a/app/Uploads/Attachment.php b/app/Uploads/Attachment.php index eb9a0fe68..8720d3c09 100644 --- a/app/Uploads/Attachment.php +++ b/app/Uploads/Attachment.php @@ -37,6 +37,6 @@ class Attachment extends Ownable if ($this->external && strpos($this->path, 'http') !== 0) { return $this->path; } - return baseUrl('/attachments/' . $this->id); + return url('/attachments/' . $this->id); } } diff --git a/app/Uploads/ImageService.php b/app/Uploads/ImageService.php index ae1c6a254..860230d00 100644 --- a/app/Uploads/ImageService.php +++ b/app/Uploads/ImageService.php @@ -417,7 +417,7 @@ class ImageService extends UploadService $isLocal = strpos(trim($uri), 'http') !== 0; // Attempt to find local files even if url not absolute - $base = baseUrl('/'); + $base = url('/'); if (!$isLocal && strpos($uri, $base) === 0) { $isLocal = true; $uri = str_replace($base, '', $uri); @@ -474,7 +474,7 @@ class ImageService extends UploadService $this->storageUrl = $storageUrl; } - $basePath = ($this->storageUrl == false) ? baseUrl('/') : $this->storageUrl; + $basePath = ($this->storageUrl == false) ? url('/') : $this->storageUrl; return rtrim($basePath, '/') . $filePath; } } diff --git a/app/UrlGenerator.php b/app/UrlGenerator.php deleted file mode 100644 index 471792cdf..000000000 --- a/app/UrlGenerator.php +++ /dev/null @@ -1,58 +0,0 @@ -formatParameters($extra)) - ); - - $defaultRoot = $this->formatRoot($this->formatScheme($secure)); - - list($path, $query) = $this->extractQueryString($path); - - return $this->formatWithBase( - $defaultRoot, trim($path.'/'.$tail, '/') - ).$query; - } - - /** - * Format the given URL segments into a single URL. - * - * @param string $defaultRoot - * @param string $path - * @return string - */ - public function formatWithBase($defaultRoot, $path) - { - $isFullPath = strpos($path, 'http') === 0; - $setBasePath = trim(config('app.url'), '/'); - - if ($isFullPath) { - return $path; - } - - if (! empty($setBasePath)) { - $defaultRoot = $setBasePath; - } - - // TODO - Add mechanism to set path correctly for intended() and back() redirects - // TODO - Update tests to align with new system - // TODO - Clean up helpers and refactor their usage. - - return trim($defaultRoot. '/' .$path, '/'); - } - -} \ No newline at end of file diff --git a/app/helpers.php b/app/helpers.php index 7bc116555..9bbfcfbf0 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -1,8 +1,9 @@ user() ?: \BookStack\Auth\User::getDefault(); + return auth()->user() ?: User::getDefault(); } /** @@ -63,9 +64,9 @@ function hasAppAccess() : bool * that particular item. * @param string $permission * @param Ownable $ownable - * @return mixed + * @return bool */ -function userCan(string $permission, Ownable $ownable = null) +function userCan(string $permission, Ownable $ownable = null) : bool { if ($ownable === null) { return user() && user()->can($permission); @@ -83,7 +84,7 @@ function userCan(string $permission, Ownable $ownable = null) * @param string|null $entityClass * @return bool */ -function userCanOnAny(string $permission, string $entityClass = null) +function userCanOnAny(string $permission, string $entityClass = null) : bool { $permissionService = app(PermissionService::class); return $permissionService->checkUserHasPermissionOnAnything($permission, $entityClass); @@ -93,84 +94,27 @@ function userCanOnAny(string $permission, string $entityClass = null) * Helper to access system settings. * @param $key * @param bool $default - * @return bool|string|\BookStack\Settings\SettingService + * @return bool|string|SettingService */ function setting($key = null, $default = false) { - $settingService = resolve(\BookStack\Settings\SettingService::class); + $settingService = resolve(SettingService::class); if (is_null($key)) { return $settingService; } return $settingService->get($key, $default); } -/** - * Helper to create url's relative to the applications root path. - * @param string $path - * @param bool $forceAppDomain - * @return string - */ -function baseUrl($path, $forceAppDomain = false) -{ - return url($path); - $isFullUrl = strpos($path, 'http') === 0; - if ($isFullUrl && !$forceAppDomain) { - return $path; - } - - $path = trim($path, '/'); - $base = rtrim(config('app.url'), '/'); - - // Remove non-specified domain if forced and we have a domain - if ($isFullUrl && $forceAppDomain) { - if (!empty($base) && strpos($path, $base) === 0) { - $path = mb_substr($path, mb_strlen($base)); - } else { - $explodedPath = explode('/', $path); - $path = implode('/', array_splice($explodedPath, 3)); - } - } - - // Return normal url path if not specified in config - if (config('app.url') === '') { - return url($path); - } - - return $base . '/' . ltrim($path, '/'); -} - -/** - * Get an instance of the redirector. - * Overrides the default laravel redirect helper. - * Ensures it redirects even when the app is in a subdirectory. - * - * @param string|null $to - * @param int $status - * @param array $headers - * @param bool $secure - * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse - */ -function redirect($to = null, $status = 302, $headers = [], $secure = null) -{ - if (is_null($to)) { - return app('redirect'); - } - - $to = baseUrl($to); - - return app('redirect')->to($to, $status, $headers, $secure); -} - /** * Get a path to a theme resource. * @param string $path - * @return string|boolean + * @return string */ -function theme_path($path = '') +function theme_path($path = '') : string { $theme = config('view.theme'); if (!$theme) { - return false; + return ''; } return base_path('themes/' . $theme .($path ? DIRECTORY_SEPARATOR.$path : $path)); @@ -242,5 +186,5 @@ function sortUrl($path, $data, $overrideData = []) return $path; } - return baseUrl($path . '?' . implode('&', $queryStringSections)); + return url($path . '?' . implode('&', $queryStringSections)); } diff --git a/public/index.php b/public/index.php index ad378d7e0..820576472 100644 --- a/public/index.php +++ b/public/index.php @@ -34,6 +34,7 @@ require __DIR__.'/../bootstrap/init.php'; */ $app = require_once __DIR__.'/../bootstrap/app.php'; +$app->alias('request', \BookStack\Http\Request::class); /* |-------------------------------------------------------------------------- @@ -50,7 +51,7 @@ $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $response = $kernel->handle( - $request = Illuminate\Http\Request::capture() + $request = \BookStack\Http\Request::capture() ); $response->send(); diff --git a/resources/views/auth/forms/login/standard.blade.php b/resources/views/auth/forms/login/standard.blade.php index ea63cf7ac..dc6081637 100644 --- a/resources/views/auth/forms/login/standard.blade.php +++ b/resources/views/auth/forms/login/standard.blade.php @@ -7,6 +7,6 @@ @include('form.password', ['name' => 'password', 'tabindex' => 1]) - {{ trans('auth.forgot_password') }} + {{ trans('auth.forgot_password') }} diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index a0e5f716c..76aa3a6e9 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -9,7 +9,7 @@

{{ title_case(trans('auth.log_in')) }}

-
+ {!! csrf_field() !!}
@@ -38,7 +38,7 @@
@foreach($socialDrivers as $driver => $name) diff --git a/resources/views/auth/passwords/email.blade.php b/resources/views/auth/passwords/email.blade.php index de4edff0a..864b4e7d2 100644 --- a/resources/views/auth/passwords/email.blade.php +++ b/resources/views/auth/passwords/email.blade.php @@ -7,7 +7,7 @@

{{ trans('auth.reset_password_send_instructions') }}

- + {!! csrf_field() !!}
diff --git a/resources/views/auth/passwords/reset.blade.php b/resources/views/auth/passwords/reset.blade.php index fa6ad5b9a..227b39079 100644 --- a/resources/views/auth/passwords/reset.blade.php +++ b/resources/views/auth/passwords/reset.blade.php @@ -6,7 +6,7 @@

{{ trans('auth.reset_password') }}

- + {!! csrf_field() !!} diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index 38904f63b..9cf34f501 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -8,7 +8,7 @@

{{ title_case(trans('auth.sign_up')) }}

- + {!! csrf_field() !!}
@@ -28,7 +28,7 @@
@@ -42,7 +42,7 @@
@foreach($socialDrivers as $driver => $name)
- + @icon('auth/' . $driver) {{ trans('auth.sign_up_with', ['socialDriver' => $name]) }} diff --git a/resources/views/auth/user-unconfirmed.blade.php b/resources/views/auth/user-unconfirmed.blade.php index 54bf6eda3..2142a5dcb 100644 --- a/resources/views/auth/user-unconfirmed.blade.php +++ b/resources/views/auth/user-unconfirmed.blade.php @@ -13,7 +13,7 @@ {{ trans('auth.email_not_confirmed_resend') }}

- + {!! csrf_field() !!}
diff --git a/resources/views/base.blade.php b/resources/views/base.blade.php index f5459a717..da0e6eb44 100644 --- a/resources/views/base.blade.php +++ b/resources/views/base.blade.php @@ -6,7 +6,7 @@ - + diff --git a/resources/views/books/create.blade.php b/resources/views/books/create.blade.php index 40b781441..65958e137 100644 --- a/resources/views/books/create.blade.php +++ b/resources/views/books/create.blade.php @@ -27,7 +27,7 @@

{{ trans('entities.books_create') }}

- + @include('books.form')
diff --git a/resources/views/books/form.blade.php b/resources/views/books/form.blade.php index 4edec240a..5d3f11e2e 100644 --- a/resources/views/books/form.blade.php +++ b/resources/views/books/form.blade.php @@ -18,8 +18,8 @@

{{ trans('common.cover_image_description') }}

@include('components.image-picker', [ - 'defaultImage' => baseUrl('/book_default_cover.png'), - 'currentImage' => (isset($model) && $model->cover) ? $model->getBookCover() : baseUrl('/book_default_cover.png') , + 'defaultImage' => url('/book_default_cover.png'), + 'currentImage' => (isset($model) && $model->cover) ? $model->getBookCover() : url('/book_default_cover.png') , 'name' => 'image', 'imageClass' => 'cover' ]) @@ -36,6 +36,6 @@
- {{ trans('common.cancel') }} + {{ trans('common.cancel') }}
\ No newline at end of file diff --git a/resources/views/books/index.blade.php b/resources/views/books/index.blade.php index 61d998489..b9bd987a9 100644 --- a/resources/views/books/index.blade.php +++ b/resources/views/books/index.blade.php @@ -37,7 +37,7 @@
{{ trans('common.actions') }}
@if($currentUser->can('book-create-all')) - + @icon('add') {{ trans('entities.books_create') }} diff --git a/resources/views/books/list.blade.php b/resources/views/books/list.blade.php index 93d927ec7..84578e3a5 100644 --- a/resources/views/books/list.blade.php +++ b/resources/views/books/list.blade.php @@ -28,7 +28,7 @@ @else

{{ trans('entities.books_empty') }}

@if(userCan('books-create-all')) - @icon('edit'){{ trans('entities.create_now') }} + @icon('edit'){{ trans('entities.create_now') }} @endif @endif
\ No newline at end of file diff --git a/resources/views/common/header.blade.php b/resources/views/common/header.blade.php index 734789899..a5336c3f8 100644 --- a/resources/views/common/header.blade.php +++ b/resources/views/common/header.blade.php @@ -2,9 +2,9 @@
-
-
{{ trans('entities.recently_updated_pages') }}
+
{{ trans('entities.recently_updated_pages') }}
@include('partials.entity-list', [ 'entities' => $recentlyUpdatedPages, diff --git a/resources/views/common/home.blade.php b/resources/views/common/home.blade.php index 2f0189f87..cd27ff568 100644 --- a/resources/views/common/home.blade.php +++ b/resources/views/common/home.blade.php @@ -34,7 +34,7 @@
-

{{ trans('entities.recently_updated_pages') }}

+

{{ trans('entities.recently_updated_pages') }}

@include('partials.entity-list', [ 'entities' => $recentlyUpdatedPages, diff --git a/resources/views/components/expand-toggle.blade.php b/resources/views/components/expand-toggle.blade.php index e8b2220e5..28af63caf 100644 --- a/resources/views/components/expand-toggle.blade.php +++ b/resources/views/components/expand-toggle.blade.php @@ -4,7 +4,7 @@ $key - Unique key for checking existing stored state. --}} getForCurrentUser('section_expansion#'. $key); ?> @icon('expand-text') diff --git a/resources/views/components/page-picker.blade.php b/resources/views/components/page-picker.blade.php index 7a3285fa7..e24ea49f1 100644 --- a/resources/views/components/page-picker.blade.php +++ b/resources/views/components/page-picker.blade.php @@ -3,7 +3,7 @@

diff --git a/resources/views/components/tag-list.blade.php b/resources/views/components/tag-list.blade.php index 1d1cc2d80..f7a9c6c48 100644 --- a/resources/views/components/tag-list.blade.php +++ b/resources/views/components/tag-list.blade.php @@ -1,6 +1,6 @@ @foreach($entity->tags as $tag)
- - @if($tag->value) @endif + + @if($tag->value) @endif
@endforeach \ No newline at end of file diff --git a/resources/views/components/tag-manager.blade.php b/resources/views/components/tag-manager.blade.php index 5ae383198..31585dc41 100644 --- a/resources/views/components/tag-manager.blade.php +++ b/resources/views/components/tag-manager.blade.php @@ -7,11 +7,11 @@
@icon('grip')
-
-
@icon('close')
diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php index 228c51520..c1937ff23 100644 --- a/resources/views/errors/404.blade.php +++ b/resources/views/errors/404.blade.php @@ -10,7 +10,7 @@
{{ trans('errors.sorry_page_not_found') }}
diff --git a/resources/views/errors/500.blade.php b/resources/views/errors/500.blade.php index 3745f2292..8c6822767 100644 --- a/resources/views/errors/500.blade.php +++ b/resources/views/errors/500.blade.php @@ -7,7 +7,7 @@

{{ trans('errors.error_occurred') }}

{{ $message ?? 'An unknown error occurred' }}
-

{{ trans('errors.return_home') }}

+

{{ trans('errors.return_home') }}

diff --git a/resources/views/pages/edit.blade.php b/resources/views/pages/edit.blade.php index 15f5d5d96..4930e30a3 100644 --- a/resources/views/pages/edit.blade.php +++ b/resources/views/pages/edit.blade.php @@ -1,7 +1,7 @@ @extends('base') @section('head') - + @stop @section('body-class', 'flexbox') diff --git a/resources/views/partials/breadcrumbs.blade.php b/resources/views/partials/breadcrumbs.blade.php index df5d1aa04..28c7196ee 100644 --- a/resources/views/partials/breadcrumbs.blade.php +++ b/resources/views/partials/breadcrumbs.blade.php @@ -3,7 +3,7 @@ {{-- Show top level books item --}} @if (count($crumbs) > 0 && array_first($crumbs) instanceof \BookStack\Entities\Book) - + @icon('books') {{ trans('entities.books') }} @@ -12,7 +12,7 @@ {{-- Show top level shelves item --}} @if (count($crumbs) > 0 && array_first($crumbs) instanceof \BookStack\Entities\Bookshelf) - + @icon('bookshelf') {{ trans('entities.shelves') }} @@ -30,11 +30,11 @@ @endif @if (is_string($crumb)) - + {{ $crumb }} @elseif (is_array($crumb)) - + @icon($crumb['icon']) {{ $crumb['text'] }} diff --git a/resources/views/partials/sort.blade.php b/resources/views/partials/sort.blade.php index 9544bcee1..38145df21 100644 --- a/resources/views/partials/sort.blade.php +++ b/resources/views/partials/sort.blade.php @@ -4,7 +4,7 @@ ?>
{{ trans('common.sort') }}
-
id}/change-sort/{$type}") }}" method="post"> + id}/change-sort/{$type}") }}" method="post"> {!! csrf_field() !!} {!! method_field('PATCH') !!} diff --git a/resources/views/partials/view-toggle.blade.php b/resources/views/partials/view-toggle.blade.php index 9eb00e1d9..9f911c882 100644 --- a/resources/views/partials/view-toggle.blade.php +++ b/resources/views/partials/view-toggle.blade.php @@ -1,5 +1,5 @@
- id}/switch-${type}-view") }}" method="POST" class="inline"> + id}/switch-${type}-view") }}" method="POST" class="inline"> {!! csrf_field() !!} {!! method_field('PATCH') !!} diff --git a/resources/views/search/all.blade.php b/resources/views/search/all.blade.php index 03c0b93e7..7a2cf65bd 100644 --- a/resources/views/search/all.blade.php +++ b/resources/views/search/all.blade.php @@ -190,7 +190,7 @@

{{ trans('entities.search_results') }}

- + diff --git a/resources/views/settings/index.blade.php b/resources/views/settings/index.blade.php index 4aa88b047..510e3af1b 100644 --- a/resources/views/settings/index.blade.php +++ b/resources/views/settings/index.blade.php @@ -15,7 +15,7 @@

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

- + {!! csrf_field() !!}
@@ -27,7 +27,7 @@

{!! trans('settings.app_public_access_desc') !!}

@if(userCan('users-manage'))

- {!! trans('settings.app_public_access_desc_guest') !!} + {!! trans('settings.app_public_access_desc_guest') !!}

@endif
@@ -79,7 +79,7 @@

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

- + {!! csrf_field() !!}
@@ -121,7 +121,7 @@ @include('components.image-picker', [ 'removeName' => 'setting-app-logo', 'removeValue' => 'none', - 'defaultImage' => baseUrl('/logo.png'), + 'defaultImage' => url('/logo.png'), 'currentImage' => setting('app-logo'), 'name' => 'app_logo', 'imageClass' => 'logo-image', @@ -180,7 +180,7 @@

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

- + {!! csrf_field() !!}
diff --git a/resources/views/settings/maintenance.blade.php b/resources/views/settings/maintenance.blade.php index c3ca8c96f..6be49cdf2 100644 --- a/resources/views/settings/maintenance.blade.php +++ b/resources/views/settings/maintenance.blade.php @@ -21,7 +21,7 @@

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

- + {!! csrf_field() !!}
diff --git a/resources/views/settings/navbar.blade.php b/resources/views/settings/navbar.blade.php index ddbaa3f2a..51fda5b90 100644 --- a/resources/views/settings/navbar.blade.php +++ b/resources/views/settings/navbar.blade.php @@ -1,13 +1,13 @@ \ No newline at end of file diff --git a/resources/views/settings/roles/create.blade.php b/resources/views/settings/roles/create.blade.php index 80a6fc382..df902133f 100644 --- a/resources/views/settings/roles/create.blade.php +++ b/resources/views/settings/roles/create.blade.php @@ -8,7 +8,7 @@ @include('settings.navbar', ['selected' => 'roles'])
- + @include('settings.roles.form', ['title' => trans('settings.role_create')])
diff --git a/resources/views/settings/roles/delete.blade.php b/resources/views/settings/roles/delete.blade.php index a2ea0d728..e0075fa8a 100644 --- a/resources/views/settings/roles/delete.blade.php +++ b/resources/views/settings/roles/delete.blade.php @@ -12,7 +12,7 @@

{{ trans('settings.role_delete_confirm', ['roleName' => $role->display_name]) }}

-
id}") }}" method="POST"> + id}") }}" method="POST"> {!! csrf_field() !!} @@ -31,7 +31,7 @@
diff --git a/resources/views/settings/roles/edit.blade.php b/resources/views/settings/roles/edit.blade.php index a7b813229..0f83bdb0b 100644 --- a/resources/views/settings/roles/edit.blade.php +++ b/resources/views/settings/roles/edit.blade.php @@ -7,7 +7,7 @@ @include('settings.navbar', ['selected' => 'roles'])
- id}") }}" method="POST"> + id}") }}" method="POST"> @include('settings.roles.form', ['model' => $role, 'title' => trans('settings.role_edit'), 'icon' => 'edit']) diff --git a/resources/views/settings/roles/form.blade.php b/resources/views/settings/roles/form.blade.php index 6d7230867..68b841e03 100644 --- a/resources/views/settings/roles/form.blade.php +++ b/resources/views/settings/roles/form.blade.php @@ -219,9 +219,9 @@
@@ -239,7 +239,7 @@
@@ -26,7 +26,7 @@ @foreach($roles as $role) - id}") }}">{{ $role->display_name }} + id}") }}">{{ $role->display_name }} {{ $role->description }} {{ $role->users->count() }} diff --git a/resources/views/shelves/create.blade.php b/resources/views/shelves/create.blade.php index 706e15d07..aee1c5a42 100644 --- a/resources/views/shelves/create.blade.php +++ b/resources/views/shelves/create.blade.php @@ -19,7 +19,7 @@

{{ trans('entities.shelves_create') }}

-
+ @include('shelves.form', ['shelf' => null, 'books' => $books])
diff --git a/resources/views/shelves/form.blade.php b/resources/views/shelves/form.blade.php index 5803275df..1d152a143 100644 --- a/resources/views/shelves/form.blade.php +++ b/resources/views/shelves/form.blade.php @@ -47,8 +47,8 @@

{{ trans('common.cover_image_description') }}

@include('components.image-picker', [ - 'defaultImage' => baseUrl('/book_default_cover.png'), - 'currentImage' => (isset($shelf) && $shelf->cover) ? $shelf->getBookCover() : baseUrl('/book_default_cover.png') , + 'defaultImage' => url('/book_default_cover.png'), + 'currentImage' => (isset($shelf) && $shelf->cover) ? $shelf->getBookCover() : url('/book_default_cover.png') , 'name' => 'image', 'imageClass' => 'cover' ]) @@ -65,6 +65,6 @@
- {{ trans('common.cancel') }} + {{ trans('common.cancel') }}
\ No newline at end of file diff --git a/resources/views/shelves/index.blade.php b/resources/views/shelves/index.blade.php index 8cf959b1e..98f97f133 100644 --- a/resources/views/shelves/index.blade.php +++ b/resources/views/shelves/index.blade.php @@ -10,7 +10,7 @@
{{ trans('common.actions') }}
@if($currentUser->can('bookshelf-create-all')) - + @icon('add') {{ trans('entities.shelves_new_action') }} diff --git a/resources/views/shelves/list.blade.php b/resources/views/shelves/list.blade.php index 70787f7e8..3f8c266e9 100644 --- a/resources/views/shelves/list.blade.php +++ b/resources/views/shelves/list.blade.php @@ -31,7 +31,7 @@ @else

{{ trans('entities.shelves_empty') }}

@if(userCan('bookshelf-create-all')) - @icon('edit'){{ trans('entities.create_now') }} + @icon('edit'){{ trans('entities.create_now') }} @endif @endif diff --git a/resources/views/users/create.blade.php b/resources/views/users/create.blade.php index cd5d75f8f..b9f404bb7 100644 --- a/resources/views/users/create.blade.php +++ b/resources/views/users/create.blade.php @@ -11,7 +11,7 @@

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

-
+ {!! csrf_field() !!}
@@ -19,7 +19,7 @@
diff --git a/resources/views/users/delete.blade.php b/resources/views/users/delete.blade.php index 15ad7a9ec..aa9811bf5 100644 --- a/resources/views/users/delete.blade.php +++ b/resources/views/users/delete.blade.php @@ -15,11 +15,11 @@

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

- id}") }}" method="POST" class="text-right"> + id}") }}" method="POST" class="text-right"> {!! csrf_field() !!} - id}") }}" class="button outline">{{ trans('common.cancel') }} + id}") }}" class="button outline">{{ trans('common.cancel') }}
diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php index 377500193..92a36c943 100644 --- a/resources/views/users/edit.blade.php +++ b/resources/views/users/edit.blade.php @@ -9,7 +9,7 @@

{{ $user->id === $currentUser->id ? trans('settings.users_edit_profile') : trans('settings.users_edit') }}

-
id}") }}" method="post" enctype="multipart/form-data"> + id}") }}" method="post" enctype="multipart/form-data"> {!! csrf_field() !!} @@ -26,7 +26,7 @@ 'resizeHeight' => '512', 'resizeWidth' => '512', 'showRemove' => false, - 'defaultImage' => baseUrl('/user_avatar.png'), + 'defaultImage' => url('/user_avatar.png'), 'currentImage' => $user->getAvatar(80), 'currentId' => $user->image_id, 'name' => 'profile_image', @@ -54,9 +54,9 @@
@@ -74,9 +74,9 @@
@icon('auth/'. $driver, ['style' => 'width: 56px;height: 56px;'])
diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index af6b4d4f9..72db24075 100644 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -14,7 +14,7 @@
- + @foreach(collect($listDetails)->except('search') as $name => $val) @endforeach @@ -22,7 +22,7 @@
@if(userCan('users-manage')) - {{ trans('settings.users_add_new') }} + {{ trans('settings.users_add_new') }} @endif
@@ -43,7 +43,7 @@ {{ $user->name }} @if(userCan('users-manage') || $currentUser->id == $user->id) - id}") }}"> + id}") }}"> @endif {{ $user->name }}
{{ $user->email }} @if(userCan('users-manage') || $currentUser->id == $user->id) @@ -52,7 +52,7 @@ @foreach($user->roles as $index => $role) -
id}") }}">{{$role->display_name}}@if($index !== count($user->roles) -1),@endif + id}") }}">{{$role->display_name}}@if($index !== count($user->roles) -1),@endif @endforeach diff --git a/resources/views/users/profile.blade.php b/resources/views/users/profile.blade.php index e2689790f..f817e328f 100644 --- a/resources/views/users/profile.blade.php +++ b/resources/views/users/profile.blade.php @@ -60,7 +60,7 @@

{{ trans('entities.recently_created_pages') }} @if (count($recentlyCreated['pages']) > 0) - {{ trans('common.view_all') }} + {{ trans('common.view_all') }} @endif

@if (count($recentlyCreated['pages']) > 0) @@ -74,7 +74,7 @@

{{ trans('entities.recently_created_chapters') }} @if (count($recentlyCreated['chapters']) > 0) - {{ trans('common.view_all') }} + {{ trans('common.view_all') }} @endif

@if (count($recentlyCreated['chapters']) > 0) @@ -88,7 +88,7 @@

{{ trans('entities.recently_created_books') }} @if (count($recentlyCreated['books']) > 0) - {{ trans('common.view_all') }} + {{ trans('common.view_all') }} @endif

@if (count($recentlyCreated['books']) > 0) @@ -102,7 +102,7 @@

{{ trans('entities.recently_created_shelves') }} @if (count($recentlyCreated['shelves']) > 0) - {{ trans('common.view_all') }} + {{ trans('common.view_all') }} @endif

@if (count($recentlyCreated['shelves']) > 0) diff --git a/resources/views/vendor/notifications/email.blade.php b/resources/views/vendor/notifications/email.blade.php index 3e02cbba9..b8a93643a 100644 --- a/resources/views/vendor/notifications/email.blade.php +++ b/resources/views/vendor/notifications/email.blade.php @@ -83,7 +83,7 @@ $style = [ - + {{ setting('app-name') }} @@ -186,7 +186,7 @@ $style = [

© {{ date('Y') }} - {{ setting('app-name') }}. + {{ setting('app-name') }}. {{ trans('common.email_rights') }}

diff --git a/tests/Auth/AuthTest.php b/tests/Auth/AuthTest.php index 0399f2b81..3d36d85b2 100644 --- a/tests/Auth/AuthTest.php +++ b/tests/Auth/AuthTest.php @@ -341,7 +341,7 @@ class AuthTest extends BrowserKitTest $page = Page::query()->first(); $this->visit($page->getUrl()) - ->seePageUrlIs(baseUrl('/login')); + ->seePageUrlIs(url('/login')); $this->login('admin@admin.com', 'password') ->seePageUrlIs($page->getUrl()); } diff --git a/tests/Unit/HelpersTest.php b/tests/Unit/HelpersTest.php deleted file mode 100644 index c8f4ce294..000000000 --- a/tests/Unit/HelpersTest.php +++ /dev/null @@ -1,33 +0,0 @@ -set('app.url', 'http://example.com/bookstack'); - $result = baseUrl('/'); - $this->assertEquals('http://example.com/bookstack/', $result); - } - - public function test_base_url_takes_extra_path_into_account_on_forced_domain() - { - config()->set('app.url', 'http://example.com/bookstack'); - $result = baseUrl('http://example.com/bookstack/', true); - $this->assertEquals('http://example.com/bookstack/', $result); - } - - public function test_base_url_force_domain_works_as_expected_with_full_url_given() - { - config()->set('app.url', 'http://example.com'); - $result = baseUrl('http://examps.com/books/test/page/cat', true); - $this->assertEquals('http://example.com/books/test/page/cat', $result); - } - - public function test_base_url_force_domain_works_when_app_domain_is_same_as_given_url() - { - config()->set('app.url', 'http://example.com'); - $result = baseUrl('http://example.com/books/test/page/cat', true); - $this->assertEquals('http://example.com/books/test/page/cat', $result); - } -} \ No newline at end of file diff --git a/tests/Unit/UrlTest.php b/tests/Unit/UrlTest.php new file mode 100644 index 000000000..c7d33312c --- /dev/null +++ b/tests/Unit/UrlTest.php @@ -0,0 +1,25 @@ +set('app.url', 'http://example.com/bookstack'); + $this->get('/'); + $this->assertEquals('http://example.com/bookstack', request()->getUri()); + + config()->set('app.url', 'http://example.com/docs/content'); + $this->get('/'); + $this->assertEquals('http://example.com/docs/content', request()->getUri()); + } + + public function test_url_helper_takes_custom_url_into_account() + { + putenv('APP_URL=http://example.com/bookstack'); + $this->refreshApplication(); + $this->assertEquals('http://example.com/bookstack/books', url('/books')); + putenv('APP_URL='); + } + +} \ No newline at end of file From 0ac50c0e50bb8a8db35e6218b7a937740721a8f3 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 4 Aug 2019 14:34:02 +0100 Subject: [PATCH 10/13] Updated phpunit instructions to composer phpunit Closes #1555 --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index ccbd41ab8..276a3de20 100644 --- a/readme.md +++ b/readme.md @@ -63,7 +63,7 @@ npm run production npm run dev ``` -BookStack has many integration tests that use Laravel's built-in testing capabilities which makes use of PHPUnit. To use you will need PHPUnit 6 installed and accessible via command line, Directly running the composer-installed version will not work. There is a `mysql_testing` database defined within the app config which is what is used by PHPUnit. This database is set with the following database name, user name and password defined as `bookstack-test`. You will have to create that database and credentials before testing. +BookStack has many integration tests that use Laravel's built-in testing capabilities which makes use of PHPUnit. There is a `mysql_testing` database defined within the app config which is what is used by PHPUnit. This database is set with the database name, user name and password all defined as `bookstack-test`. You will have to create that database and that set of credentials before testing. The testing database will also need migrating and seeding beforehand. This can be done with the following commands: @@ -72,7 +72,7 @@ php artisan migrate --database=mysql_testing php artisan db:seed --class=DummyContentSeeder --database=mysql_testing ``` -Once done you can run `phpunit` in the application root directory to run all tests. +Once done you can run `php vendor/bin/phpunit` in the application root directory to run all tests. ## Translations From 71ebb9df8b53bc6afcb2f38ff6454815ecba7ef6 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 4 Aug 2019 14:41:08 +0100 Subject: [PATCH 11/13] Removed unused config item Left in by mistake during development --- app/Config/app.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/Config/app.php b/app/Config/app.php index 0a0c17a53..aaeafb98d 100755 --- a/app/Config/app.php +++ b/app/Config/app.php @@ -45,10 +45,6 @@ return [ // and used by BookStack in URL generation. 'url' => env('APP_URL', '') === 'http://bookstack.dev' ? '' : env('APP_URL', ''), - // Rewrite URL, Used to rewrite the base of request URLs - // for scenarios - 'url_base_rewrite' => env('APP_URL_BASE_REWRITE', null), - // Application timezone for back-end date functions. 'timezone' => env('APP_TIMEZONE', 'UTC'), From 83ef0864706124676c25bddcac272af44e7ff650 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 4 Aug 2019 16:10:04 +0100 Subject: [PATCH 12/13] Added missing locale option --- app/Config/app.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Config/app.php b/app/Config/app.php index aaeafb98d..88052e94c 100755 --- a/app/Config/app.php +++ b/app/Config/app.php @@ -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', 'cs', 'sv', 'kr', 'ja', 'pl', 'it', 'ru', 'uk', 'zh_CN', 'zh_TW'], + 'locales' => ['en', 'ar', 'de', 'de_informal', 'es', 'es_AR', 'fr', 'hu', 'nl', 'pt_BR', 'sk', 'cs', 'sv', 'kr', 'ja', 'pl', 'it', 'ru', 'uk', 'zh_CN', 'zh_TW'], // Application Fallback Locale 'fallback_locale' => 'en', From 0b1ece664db7bb514e1a9e556964689bbbac2f49 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 4 Aug 2019 16:21:16 +0100 Subject: [PATCH 13/13] Updated editor z-indexing to not hide app menu Closes #1556 --- resources/assets/sass/_header.scss | 2 +- resources/assets/sass/_pages.scss | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/assets/sass/_header.scss b/resources/assets/sass/_header.scss index c4ca4607a..adb014f4a 100644 --- a/resources/assets/sass/_header.scss +++ b/resources/assets/sass/_header.scss @@ -16,7 +16,7 @@ header .grid { header { position: relative; display: block; - z-index: 6; + z-index: 11; top: 0; background-color: $primary-dark; color: #fff; diff --git a/resources/assets/sass/_pages.scss b/resources/assets/sass/_pages.scss index 39e93f5b1..fc784eebe 100755 --- a/resources/assets/sass/_pages.scss +++ b/resources/assets/sass/_pages.scss @@ -20,6 +20,10 @@ } } +body.mce-fullscreen .page-editor .edit-area { + z-index: 12; +} + @include smaller-than($s) { .page-edit-toolbar { overflow-x: scroll;