From 573bc3ec45dcfa754be5768ca62deffac421f635 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sat, 6 May 2023 23:05:25 +0100 Subject: [PATCH 01/10] Added force option for update-url command Includes test to cover. Closes #4223 --- app/Console/Commands/UpdateUrl.php | 43 ++++++++++++------------- tests/Commands/UpdateUrlCommandTest.php | 8 +++++ 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/app/Console/Commands/UpdateUrl.php b/app/Console/Commands/UpdateUrl.php index a4bb6cf22..facb4cc41 100644 --- a/app/Console/Commands/UpdateUrl.php +++ b/app/Console/Commands/UpdateUrl.php @@ -14,7 +14,8 @@ class UpdateUrl extends Command */ protected $signature = 'bookstack:update-url {oldUrl : URL to replace} - {newUrl : URL to use as the replacement}'; + {newUrl : URL to use as the replacement} + {--force : Force the operation to run, ignoring confirmations}'; /** * The console command description. @@ -23,25 +24,12 @@ class UpdateUrl extends Command */ protected $description = 'Find and replace the given URLs in your BookStack database'; - protected $db; - - /** - * Create a new command instance. - * - * @return void - */ - public function __construct(Connection $db) - { - $this->db = $db; - parent::__construct(); - } - /** * Execute the console command. * * @return mixed */ - public function handle() + public function handle(Connection $db) { $oldUrl = str_replace("'", '', $this->argument('oldUrl')); $newUrl = str_replace("'", '', $this->argument('newUrl')); @@ -67,7 +55,7 @@ class UpdateUrl extends Command foreach ($columnsToUpdateByTable as $table => $columns) { foreach ($columns as $column) { - $changeCount = $this->replaceValueInTable($table, $column, $oldUrl, $newUrl); + $changeCount = $this->replaceValueInTable($db, $table, $column, $oldUrl, $newUrl); $this->info("Updated {$changeCount} rows in {$table}->{$column}"); } } @@ -80,7 +68,7 @@ class UpdateUrl extends Command foreach ($columns as $column) { $oldJson = trim(json_encode($oldUrl), '"'); $newJson = trim(json_encode($newUrl), '"'); - $changeCount = $this->replaceValueInTable($table, $column, $oldJson, $newJson); + $changeCount = $this->replaceValueInTable($db, $table, $column, $oldJson, $newJson); $this->info("Updated {$changeCount} JSON encoded rows in {$table}->{$column}"); } } @@ -97,13 +85,18 @@ class UpdateUrl extends Command * Perform a find+replace operations in the provided table and column. * Returns the count of rows changed. */ - protected function replaceValueInTable(string $table, string $column, string $oldUrl, string $newUrl): int - { - $oldQuoted = $this->db->getPdo()->quote($oldUrl); - $newQuoted = $this->db->getPdo()->quote($newUrl); + protected function replaceValueInTable( + Connection $db, + string $table, + string $column, + string $oldUrl, + string $newUrl + ): int { + $oldQuoted = $db->getPdo()->quote($oldUrl); + $newQuoted = $db->getPdo()->quote($newUrl); - return $this->db->table($table)->update([ - $column => $this->db->raw("REPLACE({$column}, {$oldQuoted}, {$newQuoted})"), + return $db->table($table)->update([ + $column => $db->raw("REPLACE({$column}, {$oldQuoted}, {$newQuoted})"), ]); } @@ -113,6 +106,10 @@ class UpdateUrl extends Command */ protected function checkUserOkayToProceed(string $oldUrl, string $newUrl): bool { + if ($this->option('force')) { + return true; + } + $dangerWarning = "This will search for \"{$oldUrl}\" in your database and replace it with \"{$newUrl}\".\n"; $dangerWarning .= 'Are you sure you want to proceed?'; $backupConfirmation = 'This operation could cause issues if used incorrectly. Have you made a backup of your existing database?'; diff --git a/tests/Commands/UpdateUrlCommandTest.php b/tests/Commands/UpdateUrlCommandTest.php index 1788e9452..280c81feb 100644 --- a/tests/Commands/UpdateUrlCommandTest.php +++ b/tests/Commands/UpdateUrlCommandTest.php @@ -2,6 +2,7 @@ namespace Tests\Commands; +use Illuminate\Support\Facades\Artisan; use Symfony\Component\Console\Exception\RuntimeException; use Tests\TestCase; @@ -34,6 +35,13 @@ class UpdateUrlCommandTest extends TestCase $this->artisan('bookstack:update-url https://cats.example.com'); } + public function test_command_force_option_skips_prompt() + { + $this->artisan('bookstack:update-url --force https://cats.example.com/donkey https://cats.example.com/monkey') + ->expectsOutputToContain('URL update procedure complete') + ->assertSuccessful(); + } + public function test_command_updates_settings() { setting()->put('my-custom-item', 'https://example.com/donkey/cat'); From 3bcbf6b9c55c9988b04835473053d514a1cb5df3 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 7 May 2023 19:36:10 +0100 Subject: [PATCH 02/10] Added WYSWIYG editor code editor cancel focus return Focus now returns to the editor properly when you quit out the code editor without saving. This also sets the return location to be correct on normal saving (Would sometimes jump to the end of the document). For #4109. --- resources/js/components/code-editor.js | 22 +++++++++++++++++----- resources/js/wysiwyg/plugin-codeeditor.js | 9 ++++++++- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/resources/js/components/code-editor.js b/resources/js/components/code-editor.js index f9dc2b69f..1c68c2048 100644 --- a/resources/js/components/code-editor.js +++ b/resources/js/components/code-editor.js @@ -8,7 +8,15 @@ export class CodeEditor extends Component { */ editor = null; - callback = null; + /** + * @type {?Function} + */ + saveCallback = null; + + /** + * @type {?Function} + */ + cancelCallback = null; history = {}; @@ -115,15 +123,16 @@ export class CodeEditor extends Component { } save() { - if (this.callback) { - this.callback(this.editor.getContent(), this.languageInput.value); + if (this.saveCallback) { + this.saveCallback(this.editor.getContent(), this.languageInput.value); } this.hide(); } - async open(code, language, callback) { + async open(code, language, saveCallback, cancelCallback) { this.languageInput.value = language; - this.callback = callback; + this.saveCallback = saveCallback; + this.cancelCallback = cancelCallback; await this.show(); this.languageInputChange(language); @@ -141,6 +150,9 @@ export class CodeEditor extends Component { this.editor.focus(); }, () => { this.addHistory(); + if (this.cancelCallback) { + this.cancelCallback(); + } }); } diff --git a/resources/js/wysiwyg/plugin-codeeditor.js b/resources/js/wysiwyg/plugin-codeeditor.js index fa3804ea8..25f774baa 100644 --- a/resources/js/wysiwyg/plugin-codeeditor.js +++ b/resources/js/wysiwyg/plugin-codeeditor.js @@ -9,9 +9,16 @@ function elemIsCodeBlock(elem) { * @param {function(string, string)} callback (Receives (code: string,language: string) */ function showPopup(editor, code, language, callback) { - window.$components.first('code-editor').open(code, language, (newCode, newLang) => { + /** @var {CodeEditor} codeEditor * */ + const codeEditor = window.$components.first('code-editor'); + const bookMark = editor.selection.getBookmark(); + codeEditor.open(code, language, (newCode, newLang) => { callback(newCode, newLang); editor.focus(); + editor.selection.moveToBookmark(bookMark); + }, () => { + editor.focus(); + editor.selection.moveToBookmark(bookMark); }); } From b5cc0a8e38848043295e3d1960b5a347432532dd Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 8 May 2023 12:01:52 +0100 Subject: [PATCH 03/10] Fixed added padding around hr tags in details blocks Due to manual handling & wrapping of non-block content in details block not taking hr elements into account. For #3963 --- resources/js/wysiwyg/config.js | 2 +- resources/js/wysiwyg/util.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/js/wysiwyg/config.js b/resources/js/wysiwyg/config.js index a0e7156ee..37b810718 100644 --- a/resources/js/wysiwyg/config.js +++ b/resources/js/wysiwyg/config.js @@ -268,7 +268,7 @@ export function build(options) { '-doc-root[doc-root|#text]', '-li[details]', '+code-block[pre]', - '+doc-root[p|h1|h2|h3|h4|h5|h6|blockquote|code-block|div]', + '+doc-root[p|h1|h2|h3|h4|h5|h6|blockquote|code-block|div|hr]', ].join(','), plugins: gatherPlugins(options), contextmenu: false, diff --git a/resources/js/wysiwyg/util.js b/resources/js/wysiwyg/util.js index 68b6aabfc..2422da781 100644 --- a/resources/js/wysiwyg/util.js +++ b/resources/js/wysiwyg/util.js @@ -14,4 +14,5 @@ export const blockElementTypes = [ 'ul', 'ol', 'table', + 'hr', ]; From 2523cee0e2b7a1eb31feec65b6448ccaa45d27f4 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 8 May 2023 12:21:53 +0100 Subject: [PATCH 04/10] WYSWIYG code blocks: copied head styles into shadow root Currently only link-based styles are made available in the shadow root code editor environment, this adds normal styles to apply any user-added via custom head content. Fixes #4228 --- resources/js/wysiwyg/plugin-codeeditor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/js/wysiwyg/plugin-codeeditor.js b/resources/js/wysiwyg/plugin-codeeditor.js index 25f774baa..2fe2ac26a 100644 --- a/resources/js/wysiwyg/plugin-codeeditor.js +++ b/resources/js/wysiwyg/plugin-codeeditor.js @@ -53,8 +53,8 @@ function defineCodeBlockCustomElement(editor) { super(); this.attachShadow({mode: 'open'}); - const stylesToCopy = document.querySelectorAll('link[rel="stylesheet"]:not([media="print"])'); - const copiedStyles = Array.from(stylesToCopy).map(styleEl => styleEl.cloneNode(false)); + const stylesToCopy = document.head.querySelectorAll('link[rel="stylesheet"]:not([media="print"]),style'); + const copiedStyles = Array.from(stylesToCopy).map(styleEl => styleEl.cloneNode(true)); const cmContainer = document.createElement('div'); cmContainer.style.pointerEvents = 'none'; From 8846f7d255d9d2f9d6b997d57aff9a511074796f Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 8 May 2023 14:28:03 +0100 Subject: [PATCH 05/10] Prevented shorcuts activating when in codemirror areas For #4227 --- resources/js/components/shortcuts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/components/shortcuts.js b/resources/js/components/shortcuts.js index 1d5bd51d7..85a7c3da7 100644 --- a/resources/js/components/shortcuts.js +++ b/resources/js/components/shortcuts.js @@ -25,7 +25,7 @@ export class Shortcuts extends Component { setupListeners() { window.addEventListener('keydown', event => { - if (event.target.closest('input, select, textarea')) { + if (event.target.closest('input, select, textarea, .cm-editor')) { return; } From ee1e047964e53348c22bbc37a2b4187abd4e2d86 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 8 May 2023 14:37:01 +0100 Subject: [PATCH 06/10] Updated php deps, formatted command changes --- app/Console/Commands/UpdateUrl.php | 8 +-- composer.lock | 109 ++++++++++++++++++++++------- 2 files changed, 89 insertions(+), 28 deletions(-) diff --git a/app/Console/Commands/UpdateUrl.php b/app/Console/Commands/UpdateUrl.php index facb4cc41..0d218b380 100644 --- a/app/Console/Commands/UpdateUrl.php +++ b/app/Console/Commands/UpdateUrl.php @@ -87,10 +87,10 @@ class UpdateUrl extends Command */ protected function replaceValueInTable( Connection $db, - string $table, - string $column, - string $oldUrl, - string $newUrl + string $table, + string $column, + string $oldUrl, + string $newUrl ): int { $oldQuoted = $db->getPdo()->quote($oldUrl); $newQuoted = $db->getPdo()->quote($newUrl); diff --git a/composer.lock b/composer.lock index 1f3d95683..5157a43c6 100644 --- a/composer.lock +++ b/composer.lock @@ -2531,19 +2531,20 @@ }, { "name": "league/flysystem", - "version": "3.14.0", + "version": "3.15.1", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "e2a279d7f47d9098e479e8b21f7fb8b8de230158" + "reference": "a141d430414fcb8bf797a18716b09f759a385bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e2a279d7f47d9098e479e8b21f7fb8b8de230158", - "reference": "e2a279d7f47d9098e479e8b21f7fb8b8de230158", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a141d430414fcb8bf797a18716b09f759a385bed", + "reference": "a141d430414fcb8bf797a18716b09f759a385bed", "shasum": "" }, "require": { + "league/flysystem-local": "^3.0.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" }, @@ -2602,7 +2603,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.14.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.15.1" }, "funding": [ { @@ -2614,20 +2615,20 @@ "type": "github" } ], - "time": "2023-04-11T18:11:47+00:00" + "time": "2023-05-04T09:04:26+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "3.13.0", + "version": "3.15.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "8e04cbb403d4dfd5b73a2f8685f1df395bd177eb" + "reference": "d8de61ee10b6a607e7996cff388c5a3a663e8c8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/8e04cbb403d4dfd5b73a2f8685f1df395bd177eb", - "reference": "8e04cbb403d4dfd5b73a2f8685f1df395bd177eb", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/d8de61ee10b6a607e7996cff388c5a3a663e8c8a", + "reference": "d8de61ee10b6a607e7996cff388c5a3a663e8c8a", "shasum": "" }, "require": { @@ -2668,7 +2669,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.13.0" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.15.0" }, "funding": [ { @@ -2680,7 +2681,67 @@ "type": "github" } ], - "time": "2023-03-16T14:29:01+00:00" + "time": "2023-05-02T20:02:14+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/543f64c397fefdf9cfeac443ffb6beff602796b3", + "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem-local/issues", + "source": "https://github.com/thephpleague/flysystem-local/tree/3.15.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-05-02T20:02:14+00:00" }, { "name": "league/html-to-markdown", @@ -4569,16 +4630,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.16", + "version": "v0.11.17", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "151b145906804eea8e5d71fea23bfb470c904bfb" + "reference": "3dc5d4018dabd80bceb8fe1e3191ba8460569f0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/151b145906804eea8e5d71fea23bfb470c904bfb", - "reference": "151b145906804eea8e5d71fea23bfb470c904bfb", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3dc5d4018dabd80bceb8fe1e3191ba8460569f0a", + "reference": "3dc5d4018dabd80bceb8fe1e3191ba8460569f0a", "shasum": "" }, "require": { @@ -4639,9 +4700,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.16" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.17" }, - "time": "2023-04-26T12:53:57+00:00" + "time": "2023-05-05T20:02:42+00:00" }, { "name": "ralouphie/getallheaders", @@ -9509,16 +9570,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -9563,7 +9624,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -9571,7 +9632,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", From 4489f6537111521fe7d6f8c96527ae23b68cde7c Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 8 May 2023 14:45:45 +0100 Subject: [PATCH 07/10] Fixed code block line-number bar showing in exports Also fixed in print view. Likely crept in during CM6 changes. For #4215 --- resources/sass/_text.scss | 2 +- resources/sass/export-styles.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/sass/_text.scss b/resources/sass/_text.scss index 6745d2a54..adfc87ad1 100644 --- a/resources/sass/_text.scss +++ b/resources/sass/_text.scss @@ -202,7 +202,7 @@ pre { pre { padding-left: 12px; } - pre:after { + pre:before { display: none; } } diff --git a/resources/sass/export-styles.scss b/resources/sass/export-styles.scss index b8160b4c2..1e39bd056 100644 --- a/resources/sass/export-styles.scss +++ b/resources/sass/export-styles.scss @@ -33,7 +33,7 @@ table { pre { padding-left: 12px; } -pre:after { +pre:before { display: none; } pre code { From ae90776927b59990131ef33e87813fd1ff89f71d Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 8 May 2023 14:49:01 +0100 Subject: [PATCH 08/10] Updated translations with latest Crowdin changes (#4211) --- lang/ca/activities.php | 16 ++--- lang/fr/components.php | 8 +-- lang/fr/entities.php | 10 +-- lang/fr/errors.php | 2 +- lang/it/components.php | 8 +-- lang/it/entities.php | 4 +- lang/it/errors.php | 2 +- lang/ja/common.php | 2 +- lang/ja/components.php | 8 +-- lang/ja/entities.php | 4 +- lang/ja/errors.php | 2 +- lang/nl/activities.php | 12 ++-- lang/nl/auth.php | 20 +++--- lang/nl/components.php | 8 +-- lang/nl/entities.php | 4 +- lang/nl/errors.php | 2 +- lang/pl/components.php | 8 +-- lang/pl/entities.php | 4 +- lang/pl/errors.php | 2 +- lang/vi/activities.php | 6 +- lang/vi/common.php | 2 +- lang/vi/components.php | 12 ++-- lang/vi/editor.php | 140 ++++++++++++++++++++-------------------- lang/zh_CN/entities.php | 4 +- lang/zh_CN/errors.php | 2 +- 25 files changed, 146 insertions(+), 146 deletions(-) diff --git a/lang/ca/activities.php b/lang/ca/activities.php index 45ccb45e4..cf360d9b5 100644 --- a/lang/ca/activities.php +++ b/lang/ca/activities.php @@ -7,27 +7,27 @@ return [ // Pages 'page_create' => 'ha creat la pàgina', - 'page_create_notification' => 'Page successfully created', + 'page_create_notification' => 'Pàgina creada correctament', 'page_update' => 'ha actualitzat la pàgina', - 'page_update_notification' => 'Page successfully updated', + 'page_update_notification' => 'Pàgina actualitzada correctament', 'page_delete' => 'ha suprimit una pàgina', - 'page_delete_notification' => 'Page successfully deleted', + 'page_delete_notification' => 'Imatge esborrada correctament', 'page_restore' => 'ha restaurat la pàgina', - 'page_restore_notification' => 'Page successfully restored', + 'page_restore_notification' => 'Pàgina restaurada correctament', 'page_move' => 'ha mogut la pàgina', // Chapters 'chapter_create' => 'ha creat el capítol', - 'chapter_create_notification' => 'Chapter successfully created', + 'chapter_create_notification' => 'Capítol creat correctament', 'chapter_update' => 'ha actualitzat el capítol', - 'chapter_update_notification' => 'Chapter successfully updated', + 'chapter_update_notification' => 'Capítol actualitzat correctament', 'chapter_delete' => 'ha suprimit un capítol', - 'chapter_delete_notification' => 'Chapter successfully deleted', + 'chapter_delete_notification' => 'Capítol esborrat correctament', 'chapter_move' => 'ha mogut el capítol', // Books 'book_create' => 'ha creat el llibre', - 'book_create_notification' => 'Book successfully created', + 'book_create_notification' => 'Llibre creat correctament', 'book_create_from_chapter' => 'converted chapter to book', 'book_create_from_chapter_notification' => 'Chapter successfully converted to a book', 'book_update' => 'ha actualitzat el llibre', diff --git a/lang/fr/components.php b/lang/fr/components.php index 310ec071b..04bedf7d8 100644 --- a/lang/fr/components.php +++ b/lang/fr/components.php @@ -6,9 +6,9 @@ return [ // Image Manager 'image_select' => 'Sélectionner une image', - 'image_upload' => 'Upload Image', - 'image_intro' => 'Here you can select and manage images that have been previously uploaded to the system.', - 'image_intro_upload' => 'Upload a new image by dragging an image file into this window, or by using the "Upload Image" button above.', + 'image_upload' => 'Téléverser une image', + 'image_intro' => 'Ici, vous pouvez sélectionner et gérer les images qui ont été précédemment téléversées sur le système.', + 'image_intro_upload' => 'Téléverser une nouvelle image en glissant un fichier image dans cette fenêtre, ou en utilisant le bouton "Téléverser une image" ci-dessus.', 'image_all' => 'Toutes', 'image_all_title' => 'Voir toutes les images', 'image_book_title' => 'Voir les images ajoutées à ce livre', @@ -21,7 +21,7 @@ return [ 'image_delete_confirm_text' => 'Êtes-vous sûr de vouloir supprimer cette image ?', 'image_select_image' => 'Sélectionner l\'image', 'image_dropzone' => 'Glissez les images ici ou cliquez pour les ajouter', - 'image_dropzone_drop' => 'Drop images here to upload', + 'image_dropzone_drop' => 'Déposer des images ici pour les téléverser', 'images_deleted' => 'Images supprimées', 'image_preview' => 'Prévisualiser l\'image', 'image_upload_success' => 'Image ajoutée avec succès', diff --git a/lang/fr/entities.php b/lang/fr/entities.php index c75060064..2fb803baf 100644 --- a/lang/fr/entities.php +++ b/lang/fr/entities.php @@ -309,16 +309,16 @@ return [ 'tags_view_existing_tags' => 'Voir les mots-clés existants', 'tags_list_empty_hint' => 'Les mots-clés peuvent être assignés via la barre latérale de l\'éditeur de page ou lors de l\'édition des détails d\'un livre, d\'un chapitre ou d\'une étagère.', 'attachments' => 'Fichiers joints', - 'attachments_explain' => 'Ajouter des fichiers ou des liens pour les afficher sur votre page. Ils seront affichés dans la barre latérale', + 'attachments_explain' => 'Ajouter des fichiers ou des liens pour les afficher sur votre page. Ils seront affichés dans la barre latérale.', 'attachments_explain_instant_save' => 'Ces changements sont enregistrés immédiatement.', - 'attachments_upload' => 'Uploader un fichier', + 'attachments_upload' => 'Téléverser un fichier', 'attachments_link' => 'Attacher un lien', - 'attachments_upload_drop' => 'Alternatively you can drag and drop a file here to upload it as an attachment.', + 'attachments_upload_drop' => 'Vous pouvez également glisser-déposer un fichier ici pour le téléverser en tant que pièce jointe.', 'attachments_set_link' => 'Définir un lien', 'attachments_delete' => 'Êtes-vous sûr de vouloir supprimer la pièce jointe ?', - 'attachments_dropzone' => 'Drop files here to upload', + 'attachments_dropzone' => 'Déposer des fichiers ici pour les téléverser', 'attachments_no_files' => 'Aucun fichier ajouté', - 'attachments_explain_link' => 'Vous pouvez ajouter un lien si vous ne souhaitez pas uploader un fichier.', + 'attachments_explain_link' => 'Vous pouvez ajouter un lien si vous ne souhaitez pas téléverser un fichier.', 'attachments_link_name' => 'Nom du lien', 'attachment_link' => 'Lien de l\'attachement', 'attachments_link_url' => 'Lien sur un fichier', diff --git a/lang/fr/errors.php b/lang/fr/errors.php index 976655ae3..ade5b6563 100644 --- a/lang/fr/errors.php +++ b/lang/fr/errors.php @@ -53,7 +53,7 @@ return [ // Attachments 'attachment_not_found' => 'Fichier joint non trouvé', - 'attachment_upload_error' => 'An error occurred uploading the attachment file', + 'attachment_upload_error' => 'Une erreur s\'est produite avec le téléversement du fichier joint', // Pages 'page_draft_autosave_fail' => 'Le brouillon n\'a pas pu être enregistré. Vérifiez votre connexion internet', diff --git a/lang/it/components.php b/lang/it/components.php index ad0b40426..882213bb1 100644 --- a/lang/it/components.php +++ b/lang/it/components.php @@ -6,9 +6,9 @@ return [ // Image Manager 'image_select' => 'Selezione Immagine', - 'image_upload' => 'Upload Image', - 'image_intro' => 'Here you can select and manage images that have been previously uploaded to the system.', - 'image_intro_upload' => 'Upload a new image by dragging an image file into this window, or by using the "Upload Image" button above.', + 'image_upload' => 'Carica Immagine', + 'image_intro' => 'Qui è possibile selezionare e gestire le immagini che sono state precedentemente caricate nel sistema.', + 'image_intro_upload' => 'Carica una nuova immagine trascinando un file immagine in questa finestra oppure utilizzando il pulsante "Carica immagine" in alto.', 'image_all' => 'Tutte', 'image_all_title' => 'Visualizza tutte le immagini', 'image_book_title' => 'Visualizza immagini caricate in questo libro', @@ -21,7 +21,7 @@ return [ 'image_delete_confirm_text' => 'Sei sicuro di voler eliminare questa immagine?', 'image_select_image' => 'Seleziona Immagine', 'image_dropzone' => 'Rilascia immagini o clicca qui per caricarle', - 'image_dropzone_drop' => 'Drop images here to upload', + 'image_dropzone_drop' => 'Trascina qui le immagini da caricare', 'images_deleted' => 'Immagini Eliminate', 'image_preview' => 'Anteprima Immagine', 'image_upload_success' => 'Immagine caricata correttamente', diff --git a/lang/it/entities.php b/lang/it/entities.php index 1d81f5ae0..07f7bbda1 100644 --- a/lang/it/entities.php +++ b/lang/it/entities.php @@ -313,10 +313,10 @@ return [ 'attachments_explain_instant_save' => 'I cambiamenti qui sono salvati istantaneamente.', 'attachments_upload' => 'Carica File', 'attachments_link' => 'Allega Link', - 'attachments_upload_drop' => 'Alternatively you can drag and drop a file here to upload it as an attachment.', + 'attachments_upload_drop' => 'In alternativa puoi trascinare un file qui per caricarlo come allegato.', 'attachments_set_link' => 'Imposta Link', 'attachments_delete' => 'Sei sicuro di voler eliminare questo allegato?', - 'attachments_dropzone' => 'Drop files here to upload', + 'attachments_dropzone' => 'Trascina qui i file da caricare', 'attachments_no_files' => 'Nessun file è stato caricato', 'attachments_explain_link' => 'Puoi allegare un link se preferisci non caricare un file. Questo può essere un link a un\'altra pagina o a un file nel cloud.', 'attachments_link_name' => 'Nome Link', diff --git a/lang/it/errors.php b/lang/it/errors.php index e2e7d49cd..ad3e5f8cf 100644 --- a/lang/it/errors.php +++ b/lang/it/errors.php @@ -53,7 +53,7 @@ return [ // Attachments 'attachment_not_found' => 'Allegato non trovato', - 'attachment_upload_error' => 'An error occurred uploading the attachment file', + 'attachment_upload_error' => 'Si è verificato un errore durante il caricamento del file allegato', // Pages 'page_draft_autosave_fail' => 'Impossibile salvare la bozza. Controlla di essere connesso ad internet prima di salvare questa pagina', diff --git a/lang/ja/common.php b/lang/ja/common.php index 78454bfd8..bc3c8befe 100644 --- a/lang/ja/common.php +++ b/lang/ja/common.php @@ -68,7 +68,7 @@ return [ 'back_to_top' => '上に戻る', 'skip_to_main_content' => 'メインコンテンツへスキップ', 'toggle_details' => '概要の表示切替', - 'toggle_thumbnails' => 'Toggle Thumbnails', + 'toggle_thumbnails' => 'サムネイルの切り替え', 'details' => '詳細', 'grid_view' => 'グリッド形式', 'list_view' => 'リスト形式', diff --git a/lang/ja/components.php b/lang/ja/components.php index 7fcc87d1d..f492c7414 100644 --- a/lang/ja/components.php +++ b/lang/ja/components.php @@ -6,9 +6,9 @@ return [ // Image Manager 'image_select' => '画像を選択', - 'image_upload' => 'Upload Image', - 'image_intro' => 'Here you can select and manage images that have been previously uploaded to the system.', - 'image_intro_upload' => 'Upload a new image by dragging an image file into this window, or by using the "Upload Image" button above.', + 'image_upload' => '画像をアップロード', + 'image_intro' => 'ここでは、システムに以前アップロードされた画像を選択して管理できます。', + 'image_intro_upload' => 'このウィンドウに画像ファイルをドラッグするか、上の「画像をアップロード」ボタンを使用して新しい画像をアップロードします。', 'image_all' => 'すべて', 'image_all_title' => '全ての画像を表示', 'image_book_title' => 'このブックにアップロードされた画像を表示', @@ -21,7 +21,7 @@ return [ 'image_delete_confirm_text' => 'この画像を削除してもよろしいですか?', 'image_select_image' => '画像を選択', 'image_dropzone' => '画像をドロップするか、クリックしてアップロード', - 'image_dropzone_drop' => 'Drop images here to upload', + 'image_dropzone_drop' => 'アップロードする画像をここにドロップ', 'images_deleted' => '画像を削除しました', 'image_preview' => '画像プレビュー', 'image_upload_success' => '画像がアップロードされました', diff --git a/lang/ja/entities.php b/lang/ja/entities.php index ae952cd02..599d1835d 100644 --- a/lang/ja/entities.php +++ b/lang/ja/entities.php @@ -313,10 +313,10 @@ return [ 'attachments_explain_instant_save' => 'この変更は即座に保存されます。', 'attachments_upload' => 'アップロード', 'attachments_link' => 'リンクを添付', - 'attachments_upload_drop' => 'Alternatively you can drag and drop a file here to upload it as an attachment.', + 'attachments_upload_drop' => 'ファイルをここにドラッグアンドドロップして添付ファイルとしてアップロードすることもできます。', 'attachments_set_link' => 'リンクを設定', 'attachments_delete' => 'この添付ファイルを削除してよろしいですか?', - 'attachments_dropzone' => 'Drop files here to upload', + 'attachments_dropzone' => 'アップロードするファイルをここにドロップ', 'attachments_no_files' => 'ファイルはアップロードされていません', 'attachments_explain_link' => 'ファイルをアップロードしたくない場合、他のページやクラウド上のファイルへのリンクを添付できます。', 'attachments_link_name' => 'リンク名', diff --git a/lang/ja/errors.php b/lang/ja/errors.php index 945a02ab0..fe6126fdc 100644 --- a/lang/ja/errors.php +++ b/lang/ja/errors.php @@ -53,7 +53,7 @@ return [ // Attachments 'attachment_not_found' => '添付ファイルが見つかりません', - 'attachment_upload_error' => 'An error occurred uploading the attachment file', + 'attachment_upload_error' => '添付ファイルのアップロード中にエラーが発生しました', // Pages 'page_draft_autosave_fail' => '下書きの保存に失敗しました。インターネットへ接続してください。', diff --git a/lang/nl/activities.php b/lang/nl/activities.php index 310be612b..29a2482c6 100644 --- a/lang/nl/activities.php +++ b/lang/nl/activities.php @@ -12,9 +12,9 @@ return [ 'page_update_notification' => 'Pagina succesvol bijgewerkt', 'page_delete' => 'verwijderde pagina', 'page_delete_notification' => 'Pagina succesvol verwijderd', - 'page_restore' => 'pagina hersteld', + 'page_restore' => 'herstelde pagina', 'page_restore_notification' => 'Pagina succesvol hersteld', - 'page_move' => 'pagina verplaatst', + 'page_move' => 'verplaatste pagina', // Chapters 'chapter_create' => 'maakte hoofdstuk', @@ -23,18 +23,18 @@ return [ 'chapter_update_notification' => 'Hoofdstuk succesvol bijgewerkt', 'chapter_delete' => 'verwijderde hoofdstuk', 'chapter_delete_notification' => 'Hoofdstuk succesvol verwijderd', - 'chapter_move' => 'hoofdstuk verplaatst', + 'chapter_move' => 'verplaatste hoofdstuk', // Books 'book_create' => 'maakte boek', 'book_create_notification' => 'Boek succesvol aangemaakt', - 'book_create_from_chapter' => 'hoofdstuk omzetten naar boek', - 'book_create_from_chapter_notification' => 'Hoofdstuk is omgezet naar een boek', + 'book_create_from_chapter' => 'heeft hoofdstuk geconverteerd naar boek', + 'book_create_from_chapter_notification' => 'Hoofdstuk is succesvol geconverteerd naar boekenplank', 'book_update' => 'wijzigde boek', 'book_update_notification' => 'Boek succesvol bijgewerkt', 'book_delete' => 'verwijderde boek', 'book_delete_notification' => 'Boek succesvol verwijderd', - 'book_sort' => 'boek gesorteerd', + 'book_sort' => 'sorteerde boek', 'book_sort_notification' => 'Boek succesvol opnieuw gesorteerd', // Bookshelves diff --git a/lang/nl/auth.php b/lang/nl/auth.php index e0bbe36a7..dab15caca 100644 --- a/lang/nl/auth.php +++ b/lang/nl/auth.php @@ -20,22 +20,22 @@ return [ 'username' => 'Gebruikersnaam', 'email' => 'E-mail', 'password' => 'Wachtwoord', - 'password_confirm' => 'Wachtwoord bevestigen', + 'password_confirm' => 'Wachtwoord Bevestigen', 'password_hint' => 'Moet uit minstens 8 tekens bestaan', 'forgot_password' => 'Wachtwoord vergeten?', 'remember_me' => 'Mij onthouden', - 'ldap_email_hint' => 'Geef een emailadres op voor dit account.', + 'ldap_email_hint' => 'Geef een e-mailadres op voor dit account.', 'create_account' => 'Account aanmaken', 'already_have_account' => 'Heb je al een account?', 'dont_have_account' => 'Nog geen account?', 'social_login' => 'Aanmelden via een sociaal netwerk', - 'social_registration' => 'Social registratie', + 'social_registration' => 'Registratie via een sociaal netwerk', 'social_registration_text' => 'Registreer en log in met een andere service.', 'register_thanks' => 'Bedankt voor het registreren!', - 'register_confirm' => 'Controleer je e-mail en bevestig je registratie om in te loggen op :appName.', + 'register_confirm' => 'Controleer je e-mail en klik op de bevestigingsknop om toegang te krijgen tot :appName.', 'registrations_disabled' => 'Registratie is momenteel niet mogelijk', - 'registration_email_domain_invalid' => 'Dit e-maildomein is niet toegestaan', + 'registration_email_domain_invalid' => 'Dit e-maildomein wordt niet toegelaten tot deze applicatie', 'register_success' => 'Bedankt voor het aanmelden! Je bent nu geregistreerd en aangemeld.', // Login auto-initiation @@ -45,22 +45,22 @@ return [ // Password Reset 'reset_password' => 'Wachtwoord herstellen', - 'reset_password_send_instructions' => 'Geef je e-mail en we sturen je een link om je wachtwoord te herstellen', + 'reset_password_send_instructions' => 'Geef je e-mailadres op en er wordt een link gestuurd om je wachtwoord te herstellen.', 'reset_password_send_button' => 'Link sturen', 'reset_password_sent' => 'Een link om het wachtwoord te resetten zal verstuurd worden naar :email als dat e-mailadres in het systeem gevonden is.', 'reset_password_success' => 'Je wachtwoord is succesvol hersteld.', 'email_reset_subject' => 'Herstel je wachtwoord van :appName', - 'email_reset_text' => 'Je ontvangt deze e-mail omdat je een wachtwoord herstel verzoek had verzonden.', + 'email_reset_text' => 'Je ontvangt deze e-mail omdat we een wachtwoordresetverzoek voor uw account hebben ontvangen.', 'email_reset_not_requested' => 'Als je geen wachtwoord herstel hebt aangevraagd, hoef je niets te doen.', // Email Confirmation 'email_confirm_subject' => 'Bevestig je e-mailadres op :appName', 'email_confirm_greeting' => 'Bedankt voor je aanmelding op :appName!', - 'email_confirm_text' => 'Bevestig je registratie door op onderstaande knop te drukken:', + 'email_confirm_text' => 'Bevestig je e-mailadres door op onderstaande knop te drukken:', 'email_confirm_action' => 'Bevestig je e-mail', - 'email_confirm_send_error' => 'E-mail bevestiging is vereisd maar het systeem kon geen mail verzenden. Neem contact op met de beheerder.', + 'email_confirm_send_error' => 'Een e-mailbevestiging is vereist, maar het systeem kon de e-mail niet verzenden. Neem contact op met de beheerder.', 'email_confirm_success' => 'Uw e-mailadres is bevestigd! U zou nu moeten kunnen inloggen met dit e-mailadres.', - 'email_confirm_resent' => 'De bevestigingse-mails is opnieuw verzonden. Controleer je inbox.', + 'email_confirm_resent' => 'Bevestigingsmail opnieuw verzonden, controleer je inbox.', 'email_confirm_thanks' => 'Bedankt voor de bevestiging!', 'email_confirm_thanks_desc' => 'Wacht even terwijl uw bevestiging wordt behandeld. Als u na 3 seconden niet wordt doorverwezen, drukt u op de onderstaande link "Doorgaan" om verder te gaan.', diff --git a/lang/nl/components.php b/lang/nl/components.php index 1a210c648..a3f98b41d 100644 --- a/lang/nl/components.php +++ b/lang/nl/components.php @@ -6,9 +6,9 @@ return [ // Image Manager 'image_select' => 'Selecteer Afbeelding', - 'image_upload' => 'Upload Image', - 'image_intro' => 'Here you can select and manage images that have been previously uploaded to the system.', - 'image_intro_upload' => 'Upload a new image by dragging an image file into this window, or by using the "Upload Image" button above.', + 'image_upload' => 'Upload afbeelding', + 'image_intro' => 'Hier kan je eerder geüploade afbeeldingen selecteren en beheren.', + 'image_intro_upload' => 'Sleep een afbeeldingsbestand naar dit venster of gebruik de "Upload afbeelding"-knop om een afbeelding te uploaden.', 'image_all' => 'Alles', 'image_all_title' => 'Alle afbeeldingen weergeven', 'image_book_title' => 'Bekijk afbeeldingen die naar dit boek zijn geüpload', @@ -21,7 +21,7 @@ return [ 'image_delete_confirm_text' => 'Weet u zeker dat u deze afbeelding wilt verwijderen?', 'image_select_image' => 'Kies afbeelding', 'image_dropzone' => 'Sleep afbeeldingen naar hier of klik hier om te uploaden', - 'image_dropzone_drop' => 'Drop images here to upload', + 'image_dropzone_drop' => 'Sleep hier de afbeeldingen naar toe', 'images_deleted' => 'Afbeeldingen verwijderd', 'image_preview' => 'Afbeelding voorbeeld', 'image_upload_success' => 'Afbeelding succesvol geüpload', diff --git a/lang/nl/entities.php b/lang/nl/entities.php index 2d67a3dc0..b2c50135c 100644 --- a/lang/nl/entities.php +++ b/lang/nl/entities.php @@ -313,10 +313,10 @@ return [ 'attachments_explain_instant_save' => 'Wijzigingen worden meteen opgeslagen.', 'attachments_upload' => 'Bestand uploaden', 'attachments_link' => 'Link toevoegen', - 'attachments_upload_drop' => 'Alternatively you can drag and drop a file here to upload it as an attachment.', + 'attachments_upload_drop' => 'Of je kan een bestand hiernaartoe slepen om het als bijlage te uploaden.', 'attachments_set_link' => 'Zet link', 'attachments_delete' => 'Weet u zeker dat u deze bijlage wilt verwijderen?', - 'attachments_dropzone' => 'Drop files here to upload', + 'attachments_dropzone' => 'Sleep hier de bestanden naar toe', 'attachments_no_files' => 'Er zijn geen bestanden geüpload', 'attachments_explain_link' => 'Je kunt een hyperlink toevoegen als je geen bestanden wilt uploaden. Dit kan een link naar een andere pagina op deze website zijn, maar ook een link naar een andere website.', 'attachments_link_name' => 'Link naam', diff --git a/lang/nl/errors.php b/lang/nl/errors.php index 04a020065..6ced15dc3 100644 --- a/lang/nl/errors.php +++ b/lang/nl/errors.php @@ -53,7 +53,7 @@ return [ // Attachments 'attachment_not_found' => 'Bijlage niet gevonden', - 'attachment_upload_error' => 'An error occurred uploading the attachment file', + 'attachment_upload_error' => 'Er is een fout opgetreden bij het uploaden van het bestand', // Pages 'page_draft_autosave_fail' => 'Kon het concept niet opslaan. Zorg ervoor dat je een werkende internetverbinding hebt', diff --git a/lang/pl/components.php b/lang/pl/components.php index 2de01266b..e822059ce 100644 --- a/lang/pl/components.php +++ b/lang/pl/components.php @@ -6,9 +6,9 @@ return [ // Image Manager 'image_select' => 'Wybór obrazka', - 'image_upload' => 'Upload Image', - 'image_intro' => 'Here you can select and manage images that have been previously uploaded to the system.', - 'image_intro_upload' => 'Upload a new image by dragging an image file into this window, or by using the "Upload Image" button above.', + 'image_upload' => 'Prześlij obraz', + 'image_intro' => 'Tutaj możesz wybrać i zarządzać obrazami, które zostały wcześniej przesłane do systemu.', + 'image_intro_upload' => 'Prześlij nowy obraz przeciągając plik obrazu do tego okna lub używając przycisku "Prześlij obraz" powyżej.', 'image_all' => 'Wszystkie', 'image_all_title' => 'Zobacz wszystkie obrazki', 'image_book_title' => 'Zobacz obrazki zapisane w tej książce', @@ -21,7 +21,7 @@ return [ 'image_delete_confirm_text' => 'Czy na pewno chcesz usunąć ten obraz?', 'image_select_image' => 'Wybierz obrazek', 'image_dropzone' => 'Upuść obrazki tutaj lub kliknij by wybrać obrazki do przesłania', - 'image_dropzone_drop' => 'Drop images here to upload', + 'image_dropzone_drop' => 'Upuść obrazy tutaj, aby przesłać', 'images_deleted' => 'Usunięte obrazki', 'image_preview' => 'Podgląd obrazka', 'image_upload_success' => 'Obrazek przesłany pomyślnie', diff --git a/lang/pl/entities.php b/lang/pl/entities.php index 1f3e242f4..bcdf9951e 100644 --- a/lang/pl/entities.php +++ b/lang/pl/entities.php @@ -313,10 +313,10 @@ return [ 'attachments_explain_instant_save' => 'Zmiany są zapisywane natychmiastowo.', 'attachments_upload' => 'Dodaj plik', 'attachments_link' => 'Dodaj link', - 'attachments_upload_drop' => 'Alternatively you can drag and drop a file here to upload it as an attachment.', + 'attachments_upload_drop' => 'Alternatywnie możesz przeciągnąć i upuścić plik tutaj, aby przesłać go jako załącznik.', 'attachments_set_link' => 'Ustaw link', 'attachments_delete' => 'Jesteś pewien, że chcesz usunąć ten załącznik?', - 'attachments_dropzone' => 'Drop files here to upload', + 'attachments_dropzone' => 'Upuść pliki tutaj, aby przesłać', 'attachments_no_files' => 'Nie przesłano żadnych plików', 'attachments_explain_link' => 'Możesz załączyć link jeśli nie chcesz przesyłać pliku. Może być to link do innej strony lub link do pliku w chmurze.', 'attachments_link_name' => 'Nazwa linku', diff --git a/lang/pl/errors.php b/lang/pl/errors.php index baea4f6aa..bbadfac58 100644 --- a/lang/pl/errors.php +++ b/lang/pl/errors.php @@ -53,7 +53,7 @@ return [ // Attachments 'attachment_not_found' => 'Nie znaleziono załącznika', - 'attachment_upload_error' => 'An error occurred uploading the attachment file', + 'attachment_upload_error' => 'Wystąpił błąd podczas przesyłania pliku załącznika', // Pages 'page_draft_autosave_fail' => 'Zapis wersji roboczej nie powiódł się. Upewnij się, że posiadasz połączenie z internetem.', diff --git a/lang/vi/activities.php b/lang/vi/activities.php index 23ae35f7f..280da03df 100644 --- a/lang/vi/activities.php +++ b/lang/vi/activities.php @@ -68,9 +68,9 @@ return [ 'user_delete_notification' => 'Người dùng đã được xóa thành công', // Roles - 'role_create_notification' => 'Role successfully created', - 'role_update_notification' => 'Role successfully updated', - 'role_delete_notification' => 'Role successfully deleted', + 'role_create_notification' => 'Vai trò mới đã được tạo thành công', + 'role_update_notification' => 'Vai trò đã được cập nhật thành công', + 'role_delete_notification' => 'Vai trò đã được xóa thành công', // Other 'commented_on' => 'đã bình luận về', diff --git a/lang/vi/common.php b/lang/vi/common.php index dab9e0975..eda90a769 100644 --- a/lang/vi/common.php +++ b/lang/vi/common.php @@ -17,7 +17,7 @@ return [ // Form Labels 'name' => 'Tên', 'description' => 'Mô tả', - 'role' => 'Quyền', + 'role' => 'Vai trò', 'cover_image' => 'Ảnh bìa', 'cover_image_description' => 'Ảnh nên có kích thước 440x250px.', diff --git a/lang/vi/components.php b/lang/vi/components.php index 4af522517..2c4e52e84 100644 --- a/lang/vi/components.php +++ b/lang/vi/components.php @@ -6,13 +6,13 @@ return [ // Image Manager 'image_select' => 'Chọn Ảnh', - 'image_upload' => 'Upload Image', - 'image_intro' => 'Here you can select and manage images that have been previously uploaded to the system.', - 'image_intro_upload' => 'Upload a new image by dragging an image file into this window, or by using the "Upload Image" button above.', + 'image_upload' => 'Tải ảnh lên', + 'image_intro' => 'Bạn có thể lựa chọn và quản lý các hình ảnh đã được tải lên hệ thống từ trước ở đây.', + 'image_intro_upload' => 'Tải lên ảnh mới bằng cách kéo và thả nó vào cửa sổ này, hoặc sử dụng nút tải ảnh ở bên trên.', 'image_all' => 'Tất cả', 'image_all_title' => 'Xem tất cả các ảnh', - 'image_book_title' => 'Xem các ảnh đã được tải lên sách này', - 'image_page_title' => 'Xem các ảnh đã được tải lên trang này', + 'image_book_title' => 'Xem các ảnh đã được tải lên trong sách này', + 'image_page_title' => 'Xem các ảnh đã được tải lên trong trang này', 'image_search_hint' => 'Tìm kiếm ảnh bằng tên', 'image_uploaded' => 'Đã tải lên :uploadedDate', 'image_load_more' => 'Hiện thêm', @@ -21,7 +21,7 @@ return [ 'image_delete_confirm_text' => 'Bạn có chắc chắn muốn xóa hình ảnh này?', 'image_select_image' => 'Chọn Ảnh', 'image_dropzone' => 'Thả các ảnh hoặc bấm vào đây để tải lên', - 'image_dropzone_drop' => 'Drop images here to upload', + 'image_dropzone_drop' => 'Kéo các tệp vào đây để tải lên', 'images_deleted' => 'Các ảnh đã được xóa', 'image_preview' => 'Xem trước Ảnh', 'image_upload_success' => 'Ảnh đã tải lên thành công', diff --git a/lang/vi/editor.php b/lang/vi/editor.php index 47803ee5d..d1eebd0b3 100644 --- a/lang/vi/editor.php +++ b/lang/vi/editor.php @@ -62,58 +62,58 @@ return [ 'table' => 'Bảng', 'insert_image' => 'Chèn hình ảnh', 'insert_image_title' => 'Chèn/Sửa hình ảnh', - 'insert_link' => 'Insert/edit link', - 'insert_link_title' => 'Insert/Edit Link', - 'insert_horizontal_line' => 'Insert horizontal line', - 'insert_code_block' => 'Insert code block', - 'edit_code_block' => 'Edit code block', - 'insert_drawing' => 'Insert/edit drawing', - 'drawing_manager' => 'Drawing manager', - 'insert_media' => 'Insert/edit media', - 'insert_media_title' => 'Insert/Edit Media', - 'clear_formatting' => 'Clear formatting', - 'source_code' => 'Source code', - 'source_code_title' => 'Source Code', - 'fullscreen' => 'Fullscreen', - 'image_options' => 'Image options', + 'insert_link' => 'Chèn/sửa liên kết', + 'insert_link_title' => 'Chèn/sửa liên kết', + 'insert_horizontal_line' => 'Chèn đường ngang', + 'insert_code_block' => 'Chèn khối mã', + 'edit_code_block' => 'Chỉnh sửa khối mã', + 'insert_drawing' => 'Chèn/chỉnh sửa bản vẻ', + 'drawing_manager' => 'Quản lý hình vẽ', + 'insert_media' => 'Chèn/chỉnh sửa media', + 'insert_media_title' => 'Chèn/chỉnh sửa media', + 'clear_formatting' => 'Xóa định dạng', + 'source_code' => 'Mã nguồn', + 'source_code_title' => 'Mã Nguồn', + 'fullscreen' => 'Toàn màn hình', + 'image_options' => 'Tuỳ chọn hình ảnh', // Tables - 'table_properties' => 'Table properties', - 'table_properties_title' => 'Table Properties', - 'delete_table' => 'Delete table', - 'insert_row_before' => 'Insert row before', - 'insert_row_after' => 'Insert row after', - 'delete_row' => 'Delete row', - 'insert_column_before' => 'Insert column before', - 'insert_column_after' => 'Insert column after', - 'delete_column' => 'Delete column', - 'table_cell' => 'Cell', - 'table_row' => 'Row', - 'table_column' => 'Column', - 'cell_properties' => 'Cell properties', - 'cell_properties_title' => 'Cell Properties', - 'cell_type' => 'Cell type', - 'cell_type_cell' => 'Cell', - 'cell_scope' => 'Scope', - 'cell_type_header' => 'Header cell', - 'merge_cells' => 'Merge cells', - 'split_cell' => 'Split cell', - 'table_row_group' => 'Row Group', - 'table_column_group' => 'Column Group', - 'horizontal_align' => 'Horizontal align', - 'vertical_align' => 'Vertical align', - 'border_width' => 'Border width', - 'border_style' => 'Border style', - 'border_color' => 'Border color', - 'row_properties' => 'Row properties', - 'row_properties_title' => 'Row Properties', - 'cut_row' => 'Cut row', - 'copy_row' => 'Copy row', - 'paste_row_before' => 'Paste row before', - 'paste_row_after' => 'Paste row after', - 'row_type' => 'Row type', - 'row_type_header' => 'Header', - 'row_type_body' => 'Body', + 'table_properties' => 'Thuộc tính bảng', + 'table_properties_title' => 'Thuộc tính bảng', + 'delete_table' => 'Xóa bảng', + 'insert_row_before' => 'Chèn thêm hàng ở trên', + 'insert_row_after' => 'Chèn thêm hàng ở dưới', + 'delete_row' => 'Xóa hàng', + 'insert_column_before' => 'Chèn cột mới vào bên trái', + 'insert_column_after' => 'Chèn cột mới vào bên phải', + 'delete_column' => 'Xóa cột', + 'table_cell' => 'Ô', + 'table_row' => 'Hàng', + 'table_column' => 'Cột', + 'cell_properties' => 'Đặt thuộc tính ô', + 'cell_properties_title' => 'Đặt thuộc tính ô', + 'cell_type' => 'Kiểu ô', + 'cell_type_cell' => 'Ô', + 'cell_scope' => 'Phạm vi', + 'cell_type_header' => 'Ô tiêu đề', + 'merge_cells' => 'Sát nhập các ô', + 'split_cell' => 'Chia tách ô', + 'table_row_group' => 'Nhóm hàng', + 'table_column_group' => 'Nhóm cột', + 'horizontal_align' => 'Căn chỉnh theo chiều ngang', + 'vertical_align' => 'Căn chỉnh theo chiều dọc', + 'border_width' => 'Chiều rộng viền', + 'border_style' => 'Kiểu đường viền', + 'border_color' => 'Màu viền', + 'row_properties' => 'Đặt thuộc tính hàng', + 'row_properties_title' => 'Đặt thuộc tính hàng', + 'cut_row' => 'Tách cột', + 'copy_row' => 'Sao chép cột', + 'paste_row_before' => 'Dán cột vào bên trái', + 'paste_row_after' => 'Dán cột vào bên phải', + 'row_type' => 'Kiểu hàng', + 'row_type_header' => 'Tiêu đề', + 'row_type_body' => 'Nội dung', 'row_type_footer' => 'Cuối trang', 'alignment' => 'Canh lề', 'cut_column' => 'Cắt cột', @@ -134,39 +134,39 @@ return [ 'cell_border_inset' => 'Inset', 'cell_border_outset' => 'Outset', 'cell_border_none' => 'None', - 'cell_border_hidden' => 'Hidden', + 'cell_border_hidden' => 'Ẩn', // Images, links, details/summary & embed - 'source' => 'Source', - 'alt_desc' => 'Alternative description', + 'source' => 'Nguồn', + 'alt_desc' => 'Mô tả thay thế', 'embed' => 'Mã nhúng', - 'paste_embed' => 'Paste your embed code below:', + 'paste_embed' => 'Dán mã đính kèm của bạn vào bên dưới:', 'url' => 'Đường dẫn', 'text_to_display' => 'Các văn bản hiển thị', - 'title' => 'Title', - 'open_link' => 'Open link', - 'open_link_in' => 'Open link in...', - 'open_link_current' => 'Current window', - 'open_link_new' => 'New window', - 'remove_link' => 'Remove link', + 'title' => 'Tiêu đề', + 'open_link' => 'Mở liên kết', + 'open_link_in' => 'Mở liên kết trong...', + 'open_link_current' => 'Cửa sổ hiện tại', + 'open_link_new' => 'Cửa sổ mới', + 'remove_link' => 'Loại bỏ liên kết', 'insert_collapsible' => 'Insert collapsible block', 'collapsible_unwrap' => 'Unwrap', - 'edit_label' => 'Edit label', + 'edit_label' => 'Chỉnh sửa nhãn', 'toggle_open_closed' => 'Toggle open/closed', 'collapsible_edit' => 'Edit collapsible block', 'toggle_label' => 'Toggle label', // About view - 'about' => 'About the editor', - 'about_title' => 'About the WYSIWYG Editor', - 'editor_license' => 'Editor License & Copyright', - 'editor_tiny_license' => 'This editor is built using :tinyLink which is provided under the MIT license.', - 'editor_tiny_license_link' => 'The copyright and license details of TinyMCE can be found here.', - 'save_continue' => 'Save Page & Continue', + 'about' => 'Giới thiệu về trình soạn thảo', + 'about_title' => 'Giới thiệu về trình soạn thảo WYSIWYG', + 'editor_license' => 'Giáy phép & Bản quyền của trình soạn thảo', + 'editor_tiny_license' => 'Trình soạn thảo này được xây dựng bằng các sử dụng :tinyLink theo giấy phép MIT.', + 'editor_tiny_license_link' => 'Chi tiết về bản quyền và giấy phép của TinyMCE có thể được tìm thấy tại đây.', + 'save_continue' => 'Lưu trang & Tiếp tục', 'callouts_cycle' => '(Keep pressing to toggle through types)', - 'link_selector' => 'Link to content', - 'shortcuts' => 'Shortcuts', - 'shortcut' => 'Shortcut', + 'link_selector' => 'Liên kết đến nội dung', + 'shortcuts' => 'Phím tắt', + 'shortcut' => 'Phím tắt', 'shortcuts_intro' => 'The following shortcuts are available in the editor:', 'windows_linux' => '(Windows/Linux)', 'mac' => '(Mac)', diff --git a/lang/zh_CN/entities.php b/lang/zh_CN/entities.php index 66c4a2158..467106742 100644 --- a/lang/zh_CN/entities.php +++ b/lang/zh_CN/entities.php @@ -313,10 +313,10 @@ return [ 'attachments_explain_instant_save' => '这里的更改将立即保存。', 'attachments_upload' => '上传文件', 'attachments_link' => '附加链接', - 'attachments_upload_drop' => 'Alternatively you can drag and drop a file here to upload it as an attachment.', + 'attachments_upload_drop' => '或者,您可以拖放一个文件到此处上传它作为附件。', 'attachments_set_link' => '设置链接', 'attachments_delete' => '您确定要删除此附件吗?', - 'attachments_dropzone' => 'Drop files here to upload', + 'attachments_dropzone' => '将文件拖放在此处上传', 'attachments_no_files' => '尚未上传文件', 'attachments_explain_link' => '如果您不想上传文件,则可以附加链接,这可以是指向其他页面的链接,也可以是指向云端文件的链接。', 'attachments_link_name' => '链接名', diff --git a/lang/zh_CN/errors.php b/lang/zh_CN/errors.php index 7ca1a9a08..c27390363 100644 --- a/lang/zh_CN/errors.php +++ b/lang/zh_CN/errors.php @@ -53,7 +53,7 @@ return [ // Attachments 'attachment_not_found' => '找不到附件', - 'attachment_upload_error' => 'An error occurred uploading the attachment file', + 'attachment_upload_error' => '上传附件时出错', // Pages 'page_draft_autosave_fail' => '无法保存草稿,确保您在保存页面之前已经连接到互联网', From 9f1a6947ab0b462217cacb87b1226c757d133dcb Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 8 May 2023 15:16:30 +0100 Subject: [PATCH 09/10] Updated system CLI - Fixed wrong env details being used on restore. - Updated update-url on restore actually work. - Added better support for symlinked locations. - Added warning against updating in docker-like (non git controlled) environments. --- bookstack-system-cli | Bin 354449 -> 355466 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bookstack-system-cli b/bookstack-system-cli index ef82d04d66099a5e606196455c62eccf05bb8cc5..dbb16470a6bd746918037d14ae4aacb4d418e5b5 100755 GIT binary patch delta 23163 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 From c17906c758e5cd6497a96d48afd7fe9bd4307eca Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 8 May 2023 16:04:02 +0100 Subject: [PATCH 10/10] Updated translator attribution before release v23.05.1 --- .github/translators.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/translators.txt b/.github/translators.txt index a448c4a0e..5d4752c94 100644 --- a/.github/translators.txt +++ b/.github/translators.txt @@ -327,3 +327,5 @@ H.-H. Peng (Hsins) :: Chinese Traditional Mosi Wang (mosiwang) :: Chinese Traditional 骆言 (LawssssCat) :: Chinese Simplified Stickers Gaming Shøw (StickerSGSHOW) :: French +Le Van Chinh (Chino) (lvanchinh86) :: Vietnamese +Rubens nagios (rubenix) :: Catalan