diff options
Diffstat (limited to 'apps')
29 files changed, 240 insertions, 157 deletions
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml index e0f4608e8c2..2b3a9fcede8 100644 --- a/apps/dav/appinfo/info.xml +++ b/apps/dav/appinfo/info.xml @@ -41,6 +41,7 @@ <step>OCA\DAV\Migration\BuildSocialSearchIndex</step> <step>OCA\DAV\Migration\RefreshWebcalJobRegistrar</step> <step>OCA\DAV\Migration\RegisterBuildReminderIndexBackgroundJob</step> + <step>OCA\DAV\Migration\RegisterUpdateCalendarResourcesRoomBackgroundJob</step> <step>OCA\DAV\Migration\RemoveOrphanEventsAndContacts</step> <step>OCA\DAV\Migration\RemoveClassifiedEventActivity</step> <step>OCA\DAV\Migration\RemoveDeletedUsersCalendarSubscriptions</step> diff --git a/apps/dav/appinfo/v1/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php index aa16d6c584a..af49ca5462c 100644 --- a/apps/dav/appinfo/v1/publicwebdav.php +++ b/apps/dav/appinfo/v1/publicwebdav.php @@ -104,11 +104,9 @@ $server = $serverFactory->createServer(false, $baseuri, $requestUri, $authPlugin if (!$isReadable) { $filesDropPlugin->enable(); } - - $view = new View($node->getPath()); - $filesDropPlugin->setView($view); $filesDropPlugin->setShare($share); + $view = new View($node->getPath()); return $view; }); diff --git a/apps/dav/appinfo/v2/publicremote.php b/apps/dav/appinfo/v2/publicremote.php index 62336a9b80f..fbb3ddd2cb3 100644 --- a/apps/dav/appinfo/v2/publicremote.php +++ b/apps/dav/appinfo/v2/publicremote.php @@ -131,11 +131,9 @@ $server = $serverFactory->createServer(true, $baseuri, $requestUri, $authPlugin, if (!$isReadable) { $filesDropPlugin->enable(); } - - $view = new View($node->getPath()); - $filesDropPlugin->setView($view); $filesDropPlugin->setShare($share); + $view = new View($node->getPath()); return $view; }); diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index 913f5b46d98..fc753e79908 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -316,6 +316,7 @@ return array( 'OCA\\DAV\\Migration\\RefreshWebcalJobRegistrar' => $baseDir . '/../lib/Migration/RefreshWebcalJobRegistrar.php', 'OCA\\DAV\\Migration\\RegenerateBirthdayCalendars' => $baseDir . '/../lib/Migration/RegenerateBirthdayCalendars.php', 'OCA\\DAV\\Migration\\RegisterBuildReminderIndexBackgroundJob' => $baseDir . '/../lib/Migration/RegisterBuildReminderIndexBackgroundJob.php', + 'OCA\\DAV\\Migration\\RegisterUpdateCalendarResourcesRoomBackgroundJob' => $baseDir . '/../lib/Migration/RegisterUpdateCalendarResourcesRoomBackgroundJob.php', 'OCA\\DAV\\Migration\\RemoveClassifiedEventActivity' => $baseDir . '/../lib/Migration/RemoveClassifiedEventActivity.php', 'OCA\\DAV\\Migration\\RemoveDeletedUsersCalendarSubscriptions' => $baseDir . '/../lib/Migration/RemoveDeletedUsersCalendarSubscriptions.php', 'OCA\\DAV\\Migration\\RemoveObjectProperties' => $baseDir . '/../lib/Migration/RemoveObjectProperties.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index 6369511343e..cd46530ecd4 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -331,6 +331,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\Migration\\RefreshWebcalJobRegistrar' => __DIR__ . '/..' . '/../lib/Migration/RefreshWebcalJobRegistrar.php', 'OCA\\DAV\\Migration\\RegenerateBirthdayCalendars' => __DIR__ . '/..' . '/../lib/Migration/RegenerateBirthdayCalendars.php', 'OCA\\DAV\\Migration\\RegisterBuildReminderIndexBackgroundJob' => __DIR__ . '/..' . '/../lib/Migration/RegisterBuildReminderIndexBackgroundJob.php', + 'OCA\\DAV\\Migration\\RegisterUpdateCalendarResourcesRoomBackgroundJob' => __DIR__ . '/..' . '/../lib/Migration/RegisterUpdateCalendarResourcesRoomBackgroundJob.php', 'OCA\\DAV\\Migration\\RemoveClassifiedEventActivity' => __DIR__ . '/..' . '/../lib/Migration/RemoveClassifiedEventActivity.php', 'OCA\\DAV\\Migration\\RemoveDeletedUsersCalendarSubscriptions' => __DIR__ . '/..' . '/../lib/Migration/RemoveDeletedUsersCalendarSubscriptions.php', 'OCA\\DAV\\Migration\\RemoveObjectProperties' => __DIR__ . '/..' . '/../lib/Migration/RemoveObjectProperties.php', diff --git a/apps/dav/lib/Files/Sharing/FilesDropPlugin.php b/apps/dav/lib/Files/Sharing/FilesDropPlugin.php index ad7648795da..9aee5283ea9 100644 --- a/apps/dav/lib/Files/Sharing/FilesDropPlugin.php +++ b/apps/dav/lib/Files/Sharing/FilesDropPlugin.php @@ -5,7 +5,8 @@ */ namespace OCA\DAV\Files\Sharing; -use OC\Files\View; +use OCP\Files\Folder; +use OCP\Files\NotFoundException; use OCP\Share\IShare; use Sabre\DAV\Exception\MethodNotAllowed; use Sabre\DAV\ServerPlugin; @@ -17,14 +18,9 @@ use Sabre\HTTP\ResponseInterface; */ class FilesDropPlugin extends ServerPlugin { - private ?View $view = null; private ?IShare $share = null; private bool $enabled = false; - public function setView(View $view): void { - $this->view = $view; - } - public function setShare(IShare $share): void { $this->share = $share; } @@ -33,7 +29,6 @@ class FilesDropPlugin extends ServerPlugin { $this->enabled = true; } - /** * This initializes the plugin. * It is ONLY initialized by the server on a file drop request. @@ -45,7 +40,12 @@ class FilesDropPlugin extends ServerPlugin { } public function onMkcol(RequestInterface $request, ResponseInterface $response) { - if (!$this->enabled || $this->share === null || $this->view === null) { + if (!$this->enabled || $this->share === null) { + return; + } + + $node = $this->share->getNode(); + if (!($node instanceof Folder)) { return; } @@ -57,7 +57,12 @@ class FilesDropPlugin extends ServerPlugin { } public function beforeMethod(RequestInterface $request, ResponseInterface $response) { - if (!$this->enabled || $this->share === null || $this->view === null) { + if (!$this->enabled || $this->share === null) { + return; + } + + $node = $this->share->getNode(); + if (!($node instanceof Folder)) { return; } @@ -127,45 +132,55 @@ class FilesDropPlugin extends ServerPlugin { } // Create the folders along the way - $folders = $this->getPathSegments(dirname($relativePath)); - foreach ($folders as $folder) { - if ($folder === '') { + $folder = $node; + $pathSegments = $this->getPathSegments(dirname($relativePath)); + foreach ($pathSegments as $pathSegment) { + if ($pathSegment === '') { continue; - } // skip empty parts - if (!$this->view->file_exists($folder)) { - $this->view->mkdir($folder); + } + + try { + // get the current folder + $currentFolder = $folder->get($pathSegment); + // check target is a folder + if ($currentFolder instanceof Folder) { + $folder = $currentFolder; + } else { + // otherwise look in the parent folder if we already create an unique folder name + foreach ($folder->getDirectoryListing() as $child) { + // we look for folders which match "NAME (SUFFIX)" + if ($child instanceof Folder && str_starts_with($child->getName(), $pathSegment)) { + $suffix = substr($child->getName(), strlen($pathSegment)); + if (preg_match('/^ \(\d+\)$/', $suffix)) { + // we found the unique folder name and can use it + $folder = $child; + break; + } + } + } + // no folder found so we need to create a new unique folder name + if (!isset($child) || $child !== $folder) { + $folder = $folder->newFolder($folder->getNonExistingName($pathSegment)); + } + } + } catch (NotFoundException) { + // the folder does simply not exist so we create it + $folder = $folder->newFolder($pathSegment); } } // Finally handle conflicts on the end files - $noConflictPath = \OC_Helper::buildNotExistingFileNameForView(dirname($relativePath), basename($relativePath), $this->view); - $path = '/files/' . $token . '/' . $noConflictPath; - $url = $request->getBaseUrl() . str_replace('//', '/', $path); + $uniqueName = $folder->getNonExistingName(basename($relativePath)); + $relativePath = substr($folder->getPath(), strlen($node->getPath())); + $path = '/files/' . $token . '/' . $relativePath . '/' . $uniqueName; + $url = rtrim($request->getBaseUrl(), '/') . str_replace('//', '/', $path); $request->setUrl($url); } private function getPathSegments(string $path): array { // Normalize slashes and remove trailing slash - $path = rtrim(str_replace('\\', '/', $path), '/'); - - // Handle absolute paths starting with / - $isAbsolute = str_starts_with($path, '/'); - - $segments = explode('/', $path); - - // Add back the leading slash for the first segment if needed - $result = []; - $current = $isAbsolute ? '/' : ''; - - foreach ($segments as $segment) { - if ($segment === '') { - // skip empty parts - continue; - } - $current = rtrim($current, '/') . '/' . $segment; - $result[] = $current; - } + $path = trim(str_replace('\\', '/', $path), '/'); - return $result; + return explode('/', $path); } } diff --git a/apps/dav/lib/Migration/RegisterUpdateCalendarResourcesRoomBackgroundJob.php b/apps/dav/lib/Migration/RegisterUpdateCalendarResourcesRoomBackgroundJob.php new file mode 100644 index 00000000000..9d77aefafd2 --- /dev/null +++ b/apps/dav/lib/Migration/RegisterUpdateCalendarResourcesRoomBackgroundJob.php @@ -0,0 +1,30 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\DAV\Migration; + +use OCA\DAV\BackgroundJob\UpdateCalendarResourcesRoomsBackgroundJob; +use OCP\BackgroundJob\IJobList; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +class RegisterUpdateCalendarResourcesRoomBackgroundJob implements IRepairStep { + public function __construct( + private readonly IJobList $jobList, + ) { + } + + public function getName() { + return 'Register a background job to update rooms and resources'; + } + + public function run(IOutput $output) { + $this->jobList->add(UpdateCalendarResourcesRoomsBackgroundJob::class); + } +} diff --git a/apps/dav/tests/unit/Files/Sharing/FilesDropPluginTest.php b/apps/dav/tests/unit/Files/Sharing/FilesDropPluginTest.php index dc1e067dafd..16891ced3d0 100644 --- a/apps/dav/tests/unit/Files/Sharing/FilesDropPluginTest.php +++ b/apps/dav/tests/unit/Files/Sharing/FilesDropPluginTest.php @@ -5,10 +5,12 @@ */ namespace OCA\DAV\Tests\Files\Sharing; -use OC\Files\View; use OCA\DAV\Files\Sharing\FilesDropPlugin; +use OCP\Files\Folder; +use OCP\Files\NotFoundException; use OCP\Share\IAttributes; use OCP\Share\IShare; +use PHPUnit\Framework\MockObject\MockObject; use Sabre\DAV\Exception\MethodNotAllowed; use Sabre\DAV\Server; use Sabre\HTTP\RequestInterface; @@ -17,29 +19,25 @@ use Test\TestCase; class FilesDropPluginTest extends TestCase { - /** @var View|\PHPUnit\Framework\MockObject\MockObject */ - private $view; + private FilesDropPlugin $plugin; - /** @var IShare|\PHPUnit\Framework\MockObject\MockObject */ - private $share; - - /** @var Server|\PHPUnit\Framework\MockObject\MockObject */ - private $server; - - /** @var FilesDropPlugin */ - private $plugin; - - /** @var RequestInterface|\PHPUnit\Framework\MockObject\MockObject */ - private $request; - - /** @var ResponseInterface|\PHPUnit\Framework\MockObject\MockObject */ - private $response; + private Folder&MockObject $node; + private IShare&MockObject $share; + private Server&MockObject $server; + private RequestInterface&MockObject $request; + private ResponseInterface&MockObject $response; protected function setUp(): void { parent::setUp(); - $this->view = $this->createMock(View::class); + $this->node = $this->createMock(Folder::class); + $this->node->method('getPath') + ->willReturn('/files/token'); + $this->share = $this->createMock(IShare::class); + $this->share->expects(self::any()) + ->method('getNode') + ->willReturn($this->node); $this->server = $this->createMock(Server::class); $this->plugin = new FilesDropPlugin(); @@ -56,28 +54,7 @@ class FilesDropPluginTest extends TestCase { ->willReturn('token'); } - public function testInitialize(): void { - $this->server->expects($this->at(0)) - ->method('on') - ->with( - $this->equalTo('beforeMethod:*'), - $this->equalTo([$this->plugin, 'beforeMethod']), - $this->equalTo(999) - ); - $this->server->expects($this->at(1)) - ->method('on') - ->with( - $this->equalTo('method:MKCOL'), - $this->equalTo([$this->plugin, 'onMkcol']), - ); - - $this->plugin->initialize($this->server); - } - public function testNotEnabled(): void { - $this->view->expects($this->never()) - ->method($this->anything()); - $this->request->expects($this->never()) ->method($this->anything()); @@ -86,7 +63,6 @@ class FilesDropPluginTest extends TestCase { public function testValid(): void { $this->plugin->enable(); - $this->plugin->setView($this->view); $this->plugin->setShare($this->share); $this->request->method('getMethod') @@ -98,9 +74,10 @@ class FilesDropPluginTest extends TestCase { $this->request->method('getBaseUrl') ->willReturn('https://example.com'); - $this->view->method('file_exists') - ->with('/file.txt') - ->willReturn(false); + $this->node->expects(self::once()) + ->method('getNonExistingName') + ->with('file.txt') + ->willReturn('file.txt'); $this->request->expects($this->once()) ->method('setUrl') @@ -111,7 +88,6 @@ class FilesDropPluginTest extends TestCase { public function testFileAlreadyExistsValid(): void { $this->plugin->enable(); - $this->plugin->setView($this->view); $this->plugin->setShare($this->share); $this->request->method('getMethod') @@ -123,14 +99,9 @@ class FilesDropPluginTest extends TestCase { $this->request->method('getBaseUrl') ->willReturn('https://example.com'); - $this->view->method('file_exists') - ->willReturnCallback(function ($path) { - if ($path === 'file.txt' || $path === '/file.txt') { - return true; - } else { - return false; - } - }); + $this->node->method('getNonExistingName') + ->with('file.txt') + ->willReturn('file (2).txt'); $this->request->expects($this->once()) ->method('setUrl') @@ -141,7 +112,6 @@ class FilesDropPluginTest extends TestCase { public function testNoMKCOLWithoutNickname(): void { $this->plugin->enable(); - $this->plugin->setView($this->view); $this->plugin->setShare($this->share); $this->request->method('getMethod') @@ -154,7 +124,6 @@ class FilesDropPluginTest extends TestCase { public function testMKCOLWithNickname(): void { $this->plugin->enable(); - $this->plugin->setView($this->view); $this->plugin->setShare($this->share); $this->request->method('getMethod') @@ -174,7 +143,6 @@ class FilesDropPluginTest extends TestCase { public function testSubdirPut(): void { $this->plugin->enable(); - $this->plugin->setView($this->view); $this->plugin->setShare($this->share); $this->request->method('getMethod') @@ -193,14 +161,30 @@ class FilesDropPluginTest extends TestCase { $this->request->method('getBaseUrl') ->willReturn('https://example.com'); - $this->view->method('file_exists') - ->willReturnCallback(function ($path) { - if ($path === 'file.txt' || $path === '/folder/file.txt') { - return true; - } else { - return false; - } - }); + $nodeName = $this->createMock(Folder::class); + $nodeFolder = $this->createMock(Folder::class); + $nodeFolder->expects(self::once()) + ->method('getPath') + ->willReturn('/files/token/nickname/folder'); + $nodeFolder->method('getNonExistingName') + ->with('file.txt') + ->willReturn('file.txt'); + $nodeName->expects(self::once()) + ->method('get') + ->with('folder') + ->willThrowException(new NotFoundException()); + $nodeName->expects(self::once()) + ->method('newFolder') + ->with('folder') + ->willReturn($nodeFolder); + + $this->node->expects(self::once()) + ->method('get') + ->willThrowException(new NotFoundException()); + $this->node->expects(self::once()) + ->method('newFolder') + ->with('nickname') + ->willReturn($nodeName); $this->request->expects($this->once()) ->method('setUrl') @@ -211,7 +195,6 @@ class FilesDropPluginTest extends TestCase { public function testRecursiveFolderCreation(): void { $this->plugin->enable(); - $this->plugin->setView($this->view); $this->plugin->setShare($this->share); $this->request->method('getMethod') @@ -227,40 +210,40 @@ class FilesDropPluginTest extends TestCase { ->willReturn('/files/token/folder/subfolder/file.txt'); $this->request->method('getBaseUrl') ->willReturn('https://example.com'); - $this->view->method('file_exists') - ->willReturn(false); - - $this->view->expects($this->exactly(4)) - ->method('file_exists') - ->withConsecutive( - ['/nickname'], - ['/nickname/folder'], - ['/nickname/folder/subfolder'], - ['/nickname/folder/subfolder/file.txt'] - ) - ->willReturnOnConsecutiveCalls( - false, - false, - false, - false, - ); - $this->view->expects($this->exactly(3)) - ->method('mkdir') - ->withConsecutive( - ['/nickname'], - ['/nickname/folder'], - ['/nickname/folder/subfolder'], - ); $this->request->expects($this->once()) ->method('setUrl') ->with($this->equalTo('https://example.com/files/token/nickname/folder/subfolder/file.txt')); + + $subfolder = $this->createMock(Folder::class); + $subfolder->expects(self::once()) + ->method('getNonExistingName') + ->with('file.txt') + ->willReturn('file.txt'); + $subfolder->expects(self::once()) + ->method('getPath') + ->willReturn('/files/token/nickname/folder/subfolder'); + + $folder = $this->createMock(Folder::class); + $folder->expects(self::once()) + ->method('get') + ->with('subfolder') + ->willReturn($subfolder); + + $nickname = $this->createMock(Folder::class); + $nickname->expects(self::once()) + ->method('get') + ->with('folder') + ->willReturn($folder); + + $this->node->method('get') + ->with('nickname') + ->willReturn($nickname); $this->plugin->beforeMethod($this->request, $this->response); } public function testOnMkcol(): void { $this->plugin->enable(); - $this->plugin->setView($this->view); $this->plugin->setShare($this->share); $this->response->expects($this->once()) diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js index a4a71d0087f..f4b11b60bfe 100644 --- a/apps/files/l10n/de.js +++ b/apps/files/l10n/de.js @@ -98,6 +98,7 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" in \"{newName}\" umbenannt", "Rename file" : "Datei umbenennen", "Folder" : "Ordner", + "Unknown file type" : "Unbekannter Dateityp", "Pending" : "Ausstehend", "Unknown date" : "Unbekanntes Datum", "Clear filter" : "Filter zurücksetzen", @@ -108,6 +109,7 @@ OC.L10N.register( "Total rows summary" : "Zusammenfassung aller Zeilen", "Toggle selection for all files and folders" : "Auswahl für alle Dateien und Ordner umschalten", "Name" : "Name", + "File type" : "Dateityp", "Size" : "Größe", "\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen", "\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt", @@ -186,6 +188,7 @@ OC.L10N.register( "Sort favorites first" : "Favoriten zuerst sortieren", "Sort folders before files" : "Ordner vor Dateien sortieren", "Show hidden files" : "Versteckte Dateien anzeigen", + "Show file type column" : "Dateityp-Spalte anzeigen", "Crop image previews" : "Bildvorschauen zuschneiden", "Enable the grid view" : "Kachelansicht aktivieren", "Enable folder tree" : "Ordnerstruktur aktivieren", diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json index 8c460f60c44..f34d8585898 100644 --- a/apps/files/l10n/de.json +++ b/apps/files/l10n/de.json @@ -96,6 +96,7 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" in \"{newName}\" umbenannt", "Rename file" : "Datei umbenennen", "Folder" : "Ordner", + "Unknown file type" : "Unbekannter Dateityp", "Pending" : "Ausstehend", "Unknown date" : "Unbekanntes Datum", "Clear filter" : "Filter zurücksetzen", @@ -106,6 +107,7 @@ "Total rows summary" : "Zusammenfassung aller Zeilen", "Toggle selection for all files and folders" : "Auswahl für alle Dateien und Ordner umschalten", "Name" : "Name", + "File type" : "Dateityp", "Size" : "Größe", "\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen", "\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt", @@ -184,6 +186,7 @@ "Sort favorites first" : "Favoriten zuerst sortieren", "Sort folders before files" : "Ordner vor Dateien sortieren", "Show hidden files" : "Versteckte Dateien anzeigen", + "Show file type column" : "Dateityp-Spalte anzeigen", "Crop image previews" : "Bildvorschauen zuschneiden", "Enable the grid view" : "Kachelansicht aktivieren", "Enable folder tree" : "Ordnerstruktur aktivieren", diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index b65015e0f68..cbb4d16f40a 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -98,6 +98,7 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" in \"{newName}\" umbenannt", "Rename file" : "Datei umbenennen", "Folder" : "Ordner", + "Unknown file type" : "Unbekannter Dateityp", "Pending" : "Ausstehend", "Unknown date" : "Unbekanntes Datum", "Clear filter" : "Filter zurücksetzen", @@ -108,6 +109,7 @@ OC.L10N.register( "Total rows summary" : "Zusammenfassung aller Zeilen", "Toggle selection for all files and folders" : "Auswahl für alle Dateien und Ordner umschalten", "Name" : "Name", + "File type" : "Dateityp", "Size" : "Größe", "\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen", "\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt", @@ -186,6 +188,7 @@ OC.L10N.register( "Sort favorites first" : "Favoriten zuerst sortieren", "Sort folders before files" : "Ordner vor Dateien sortieren", "Show hidden files" : "Versteckte Dateien anzeigen", + "Show file type column" : "Dateityp-Spalte anzeigen", "Crop image previews" : "Bildvorschauen zuschneiden", "Enable the grid view" : "Kachelansicht aktivieren", "Enable folder tree" : "Ordnerstruktur aktivieren", diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index 3818398effb..8e1f611f317 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -96,6 +96,7 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" in \"{newName}\" umbenannt", "Rename file" : "Datei umbenennen", "Folder" : "Ordner", + "Unknown file type" : "Unbekannter Dateityp", "Pending" : "Ausstehend", "Unknown date" : "Unbekanntes Datum", "Clear filter" : "Filter zurücksetzen", @@ -106,6 +107,7 @@ "Total rows summary" : "Zusammenfassung aller Zeilen", "Toggle selection for all files and folders" : "Auswahl für alle Dateien und Ordner umschalten", "Name" : "Name", + "File type" : "Dateityp", "Size" : "Größe", "\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen", "\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt", @@ -184,6 +186,7 @@ "Sort favorites first" : "Favoriten zuerst sortieren", "Sort folders before files" : "Ordner vor Dateien sortieren", "Show hidden files" : "Versteckte Dateien anzeigen", + "Show file type column" : "Dateityp-Spalte anzeigen", "Crop image previews" : "Bildvorschauen zuschneiden", "Enable the grid view" : "Kachelansicht aktivieren", "Enable folder tree" : "Ordnerstruktur aktivieren", diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js index 78db65694c1..17330fbf036 100644 --- a/apps/files/l10n/et_EE.js +++ b/apps/files/l10n/et_EE.js @@ -98,6 +98,7 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "Failinimi on muutunud „{oldName}“ ⇨ „{newName}“", "Rename file" : "Muuda failinime", "Folder" : "Kaust", + "Unknown file type" : "Tundmatu failitüüp", "Pending" : "Ootel", "Unknown date" : "Tundmatu kuupäev", "Clear filter" : "Tühjenda filter", @@ -108,6 +109,7 @@ OC.L10N.register( "Total rows summary" : "Ridade koondkokkuvõte", "Toggle selection for all files and folders" : "Lülita kõikide failide ja kaustade valik sisse/välja", "Name" : "Nimi", + "File type" : "Failitüüp", "Size" : "Suurus", "\"{displayName}\" failed on some elements" : "„{displayName}“ ei toiminud mõne objekti puhul", "\"{displayName}\" batch action executed successfully" : "Pakktöötlus õnnestus: „{displayName}“", @@ -186,6 +188,7 @@ OC.L10N.register( "Sort favorites first" : "Järjesta lemmikud esimesena", "Sort folders before files" : "Järjesta kaustad enne faile", "Show hidden files" : "Näita peidetud faile", + "Show file type column" : "Näita failitüübi veergu", "Crop image previews" : "Kadreeri piltide eelvaated", "Enable the grid view" : "Võta kasutusele ruudustikuvaade", "Enable folder tree" : "Võta kasutusele kaustapuu", diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json index 428758f0287..cb2182202e8 100644 --- a/apps/files/l10n/et_EE.json +++ b/apps/files/l10n/et_EE.json @@ -96,6 +96,7 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "Failinimi on muutunud „{oldName}“ ⇨ „{newName}“", "Rename file" : "Muuda failinime", "Folder" : "Kaust", + "Unknown file type" : "Tundmatu failitüüp", "Pending" : "Ootel", "Unknown date" : "Tundmatu kuupäev", "Clear filter" : "Tühjenda filter", @@ -106,6 +107,7 @@ "Total rows summary" : "Ridade koondkokkuvõte", "Toggle selection for all files and folders" : "Lülita kõikide failide ja kaustade valik sisse/välja", "Name" : "Nimi", + "File type" : "Failitüüp", "Size" : "Suurus", "\"{displayName}\" failed on some elements" : "„{displayName}“ ei toiminud mõne objekti puhul", "\"{displayName}\" batch action executed successfully" : "Pakktöötlus õnnestus: „{displayName}“", @@ -184,6 +186,7 @@ "Sort favorites first" : "Järjesta lemmikud esimesena", "Sort folders before files" : "Järjesta kaustad enne faile", "Show hidden files" : "Näita peidetud faile", + "Show file type column" : "Näita failitüübi veergu", "Crop image previews" : "Kadreeri piltide eelvaated", "Enable the grid view" : "Võta kasutusele ruudustikuvaade", "Enable folder tree" : "Võta kasutusele kaustapuu", diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index a98cb8fe96d..03a1cda9804 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -98,6 +98,7 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "Rinominato \"{oldName}\" in \"{newName}\"", "Rename file" : "Rinomina file", "Folder" : "Cartella", + "Unknown file type" : "Tipo di file sconosciuto", "Pending" : "In corso", "Unknown date" : "Data sconosciuta", "Clear filter" : "Pulisci il filtro", @@ -108,6 +109,7 @@ OC.L10N.register( "Total rows summary" : "Riepilogo totale delle righe", "Toggle selection for all files and folders" : "Attiva/disattiva la selezione per tutti i file e le cartelle", "Name" : "Nome", + "File type" : "Tipo di file", "Size" : "Dimensione", "\"{displayName}\" failed on some elements" : "\"{displayName}\" non riuscito su alcuni elementi", "\"{displayName}\" batch action executed successfully" : "L'azione batch \"{displayName}\" è stata eseguita correttamente", @@ -186,6 +188,7 @@ OC.L10N.register( "Sort favorites first" : "Ordina prima i preferiti", "Sort folders before files" : "Ordina cartelle prima dei files", "Show hidden files" : "Mostra i file nascosti", + "Show file type column" : "Mostra colonna tipo di file", "Crop image previews" : "Ritaglia le anteprime delle immagini", "Enable the grid view" : "Attiva visuale a griglia", "Enable folder tree" : "Abilita l'albero delle cartelle", diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index f645e6940bc..e83848ed70a 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -96,6 +96,7 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "Rinominato \"{oldName}\" in \"{newName}\"", "Rename file" : "Rinomina file", "Folder" : "Cartella", + "Unknown file type" : "Tipo di file sconosciuto", "Pending" : "In corso", "Unknown date" : "Data sconosciuta", "Clear filter" : "Pulisci il filtro", @@ -106,6 +107,7 @@ "Total rows summary" : "Riepilogo totale delle righe", "Toggle selection for all files and folders" : "Attiva/disattiva la selezione per tutti i file e le cartelle", "Name" : "Nome", + "File type" : "Tipo di file", "Size" : "Dimensione", "\"{displayName}\" failed on some elements" : "\"{displayName}\" non riuscito su alcuni elementi", "\"{displayName}\" batch action executed successfully" : "L'azione batch \"{displayName}\" è stata eseguita correttamente", @@ -184,6 +186,7 @@ "Sort favorites first" : "Ordina prima i preferiti", "Sort folders before files" : "Ordina cartelle prima dei files", "Show hidden files" : "Mostra i file nascosti", + "Show file type column" : "Mostra colonna tipo di file", "Crop image previews" : "Ritaglia le anteprime delle immagini", "Enable the grid view" : "Attiva visuale a griglia", "Enable folder tree" : "Abilita l'albero delle cartelle", diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 3308568155b..65358d419aa 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -98,6 +98,7 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" foi renomeado para \"{newName}\"", "Rename file" : "Renomear arquivo", "Folder" : "Pasta", + "Unknown file type" : "Tipo de arquivo desconhecido", "Pending" : "Pendente", "Unknown date" : "Data desconhecida", "Clear filter" : "Limpar filtro", @@ -108,6 +109,7 @@ OC.L10N.register( "Total rows summary" : "Resumo do total de linhas", "Toggle selection for all files and folders" : "Alternar seleção para todos os arquivos e pastas", "Name" : "Nome", + "File type" : "Tipo de arquivo", "Size" : "Tamanho", "\"{displayName}\" failed on some elements" : "\"{displayName}\" falhou em alguns elementos", "\"{displayName}\" batch action executed successfully" : "Ação em lote \"{displayName}\" executada com êxito", @@ -186,6 +188,7 @@ OC.L10N.register( "Sort favorites first" : "Ordenar favoritos primeiro", "Sort folders before files" : "Ordenar pastas antes de arquivos", "Show hidden files" : "Mostrar arquivos ocultos", + "Show file type column" : "Mostrar coluna de tipo de arquivo", "Crop image previews" : "Cortar visualizações de imagem", "Enable the grid view" : "Ativar a visualização em grade", "Enable folder tree" : "Ativar árvore de pastas", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index ceec9ac85f4..7b39fa76f77 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -96,6 +96,7 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" foi renomeado para \"{newName}\"", "Rename file" : "Renomear arquivo", "Folder" : "Pasta", + "Unknown file type" : "Tipo de arquivo desconhecido", "Pending" : "Pendente", "Unknown date" : "Data desconhecida", "Clear filter" : "Limpar filtro", @@ -106,6 +107,7 @@ "Total rows summary" : "Resumo do total de linhas", "Toggle selection for all files and folders" : "Alternar seleção para todos os arquivos e pastas", "Name" : "Nome", + "File type" : "Tipo de arquivo", "Size" : "Tamanho", "\"{displayName}\" failed on some elements" : "\"{displayName}\" falhou em alguns elementos", "\"{displayName}\" batch action executed successfully" : "Ação em lote \"{displayName}\" executada com êxito", @@ -184,6 +186,7 @@ "Sort favorites first" : "Ordenar favoritos primeiro", "Sort folders before files" : "Ordenar pastas antes de arquivos", "Show hidden files" : "Mostrar arquivos ocultos", + "Show file type column" : "Mostrar coluna de tipo de arquivo", "Crop image previews" : "Cortar visualizações de imagem", "Enable the grid view" : "Ativar a visualização em grade", "Enable folder tree" : "Ativar árvore de pastas", diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index af800f5614f..51c97322725 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -98,6 +98,7 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "已將「{oldName}」重新命名為「{newName}」", "Rename file" : "重新命名檔案", "Folder" : "資料夾", + "Unknown file type" : "未知檔案類型", "Pending" : "待處理", "Unknown date" : "未知日期", "Clear filter" : "清除過濾條件", @@ -108,6 +109,7 @@ OC.L10N.register( "Total rows summary" : "總列摘要", "Toggle selection for all files and folders" : "切換所有檔案和資料夾的選取", "Name" : "名稱", + "File type" : "檔案類型", "Size" : "大小", "\"{displayName}\" failed on some elements" : "「{displayName}」在某些元素上失敗", "\"{displayName}\" batch action executed successfully" : "「{displayName}」批次動作執行成功", @@ -186,6 +188,7 @@ OC.L10N.register( "Sort favorites first" : "先排序喜愛", "Sort folders before files" : "將資料夾排序在檔案前", "Show hidden files" : "顯示隱藏檔", + "Show file type column" : "顯示檔案類型欄位", "Crop image previews" : "圖片裁剪預覽", "Enable the grid view" : "啟用格狀檢視", "Enable folder tree" : "啟用資料夾樹", diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index 3c1c8d347fa..ead55fc3891 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -96,6 +96,7 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "已將「{oldName}」重新命名為「{newName}」", "Rename file" : "重新命名檔案", "Folder" : "資料夾", + "Unknown file type" : "未知檔案類型", "Pending" : "待處理", "Unknown date" : "未知日期", "Clear filter" : "清除過濾條件", @@ -106,6 +107,7 @@ "Total rows summary" : "總列摘要", "Toggle selection for all files and folders" : "切換所有檔案和資料夾的選取", "Name" : "名稱", + "File type" : "檔案類型", "Size" : "大小", "\"{displayName}\" failed on some elements" : "「{displayName}」在某些元素上失敗", "\"{displayName}\" batch action executed successfully" : "「{displayName}」批次動作執行成功", @@ -184,6 +186,7 @@ "Sort favorites first" : "先排序喜愛", "Sort folders before files" : "將資料夾排序在檔案前", "Show hidden files" : "顯示隱藏檔", + "Show file type column" : "顯示檔案類型欄位", "Crop image previews" : "圖片裁剪預覽", "Enable the grid view" : "啟用格狀檢視", "Enable folder tree" : "啟用資料夾樹", diff --git a/apps/files/lib/AppInfo/Application.php b/apps/files/lib/AppInfo/Application.php index 4b3948d43b5..32c072ef0f4 100644 --- a/apps/files/lib/AppInfo/Application.php +++ b/apps/files/lib/AppInfo/Application.php @@ -132,7 +132,6 @@ class Application extends App implements IBootstrap { public function boot(IBootContext $context): void { $context->injectFn(Closure::fromCallable([$this, 'registerCollaboration'])); $context->injectFn([Listener::class, 'register']); - $this->registerTemplates(); $this->registerHooks(); } @@ -140,13 +139,6 @@ class Application extends App implements IBootstrap { $providerManager->registerResourceProvider(ResourceProvider::class); } - private function registerTemplates(): void { - $templateManager = \OC_Helper::getFileTemplateManager(); - $templateManager->registerTemplate('application/vnd.oasis.opendocument.presentation', 'core/templates/filetemplates/template.odp'); - $templateManager->registerTemplate('application/vnd.oasis.opendocument.text', 'core/templates/filetemplates/template.odt'); - $templateManager->registerTemplate('application/vnd.oasis.opendocument.spreadsheet', 'core/templates/filetemplates/template.ods'); - } - private function registerHooks(): void { Util::connectHook('\OCP\Config', 'js', '\OCA\Files\App', 'extendJsConfig'); } diff --git a/apps/files/src/components/FileEntry.vue b/apps/files/src/components/FileEntry.vue index 3e455a2f135..d66c3fa0ed7 100644 --- a/apps/files/src/components/FileEntry.vue +++ b/apps/files/src/components/FileEntry.vue @@ -97,6 +97,7 @@ import { FileType, formatFileSize } from '@nextcloud/files' import { useHotKey } from '@nextcloud/vue/composables/useHotKey' import { defineComponent } from 'vue' +import { t } from '@nextcloud/l10n' import NcDateTime from '@nextcloud/vue/components/NcDateTime' import { useNavigation } from '../composables/useNavigation.ts' @@ -208,6 +209,25 @@ export default defineComponent({ return t('files', 'Unknown file type') } + if (window.OC?.MimeTypeList?.names?.[this.source.mime]) { + return window.OC.MimeTypeList.names[this.source.mime] + } + + const baseType = this.source.mime.split('/')[0] + const ext = this.source?.extension?.toUpperCase().replace(/^\./, '') || '' + if (baseType === 'image') { + return t('files', '{ext} image', { ext }) + } + if (baseType === 'video') { + return t('files', '{ext} video', { ext }) + } + if (baseType === 'audio') { + return t('files', '{ext} audio', { ext }) + } + if (baseType === 'text') { + return t('files', '{ext} text', { ext }) + } + return this.source.mime }, size() { diff --git a/apps/files_sharing/l10n/ko.js b/apps/files_sharing/l10n/ko.js index 6c6967c59a8..d946d802981 100644 --- a/apps/files_sharing/l10n/ko.js +++ b/apps/files_sharing/l10n/ko.js @@ -311,7 +311,7 @@ OC.L10N.register( "Link shares" : "링크 공유", "Shares" : "공유", "Use this method to share files with individuals or teams within your organization. If the recipient already has access to the share but cannot locate it, you can send them the internal share link for easy access." : "이 방법을 사용하여 조직 내 개인 또는 팀과 파일을 공유하세요. 수신자가 이미 공유 폴더에 접근할 수 있지만 위치를 찾을 수 없는 경우, 쉽게 접근할 수 있도록 내부 공유 링크를 보낼 수 있습니다.", - "Use this method to share files with individuals or organizations outside your organization. Files and folders can be shared via public share links and email addresses. You can also share to other Nextcloud accounts hosted on different instances using their federated cloud ID." : "이 방법을 사용하면 조직 외부의 조직이나 개인과 파일을 공유할 수 있습니다. 파일과 폴더는 공개 공유 링크와 이메일 주소를 통해 공유할 수 있습니다. 또한, 다른 인스턴스에 소속된 다른 Nextcloud 계정과도 연합 클라우드 ID를 사용하여 공유할 수 있습니다.", + "Use this method to share files with individuals or organizations outside your organization. Files and folders can be shared via public share links and email addresses. You can also share to other Nextcloud accounts hosted on different instances using their federated cloud ID." : "이 방법을 사용하여 이 조직 외부의 개인이나 조직과 파일을 공유하세요. 파일과 폴더는 공개 공유 링크와 이메일 주소를 통해 공유할 수 있습니다. 다른 인스턴스에 소속된 다른 Nextcloud 계정과도 연합 클라우드 ID를 사용하여 공유할 수 있습니다.", "Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "내부 또는 외부 공유에 포함되지 않은 공유입니다. 앱이나 다른 소스에서 공유된 내용이 여기에 해당할 수 있습니다.", "Share with accounts, teams, federated cloud IDs" : "계정, 팀 및 연합 클라우드 ID와 공유", "Share with accounts and teams" : "계정 및 팀과 공유", diff --git a/apps/files_sharing/l10n/ko.json b/apps/files_sharing/l10n/ko.json index d08e914da29..4d9e598e1b5 100644 --- a/apps/files_sharing/l10n/ko.json +++ b/apps/files_sharing/l10n/ko.json @@ -309,7 +309,7 @@ "Link shares" : "링크 공유", "Shares" : "공유", "Use this method to share files with individuals or teams within your organization. If the recipient already has access to the share but cannot locate it, you can send them the internal share link for easy access." : "이 방법을 사용하여 조직 내 개인 또는 팀과 파일을 공유하세요. 수신자가 이미 공유 폴더에 접근할 수 있지만 위치를 찾을 수 없는 경우, 쉽게 접근할 수 있도록 내부 공유 링크를 보낼 수 있습니다.", - "Use this method to share files with individuals or organizations outside your organization. Files and folders can be shared via public share links and email addresses. You can also share to other Nextcloud accounts hosted on different instances using their federated cloud ID." : "이 방법을 사용하면 조직 외부의 조직이나 개인과 파일을 공유할 수 있습니다. 파일과 폴더는 공개 공유 링크와 이메일 주소를 통해 공유할 수 있습니다. 또한, 다른 인스턴스에 소속된 다른 Nextcloud 계정과도 연합 클라우드 ID를 사용하여 공유할 수 있습니다.", + "Use this method to share files with individuals or organizations outside your organization. Files and folders can be shared via public share links and email addresses. You can also share to other Nextcloud accounts hosted on different instances using their federated cloud ID." : "이 방법을 사용하여 이 조직 외부의 개인이나 조직과 파일을 공유하세요. 파일과 폴더는 공개 공유 링크와 이메일 주소를 통해 공유할 수 있습니다. 다른 인스턴스에 소속된 다른 Nextcloud 계정과도 연합 클라우드 ID를 사용하여 공유할 수 있습니다.", "Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "내부 또는 외부 공유에 포함되지 않은 공유입니다. 앱이나 다른 소스에서 공유된 내용이 여기에 해당할 수 있습니다.", "Share with accounts, teams, federated cloud IDs" : "계정, 팀 및 연합 클라우드 ID와 공유", "Share with accounts and teams" : "계정 및 팀과 공유", diff --git a/apps/files_sharing/src/files_filters/AccountFilter.ts b/apps/files_sharing/src/files_filters/AccountFilter.ts index 56bcef07200..4f185d9fd9c 100644 --- a/apps/files_sharing/src/files_filters/AccountFilter.ts +++ b/apps/files_sharing/src/files_filters/AccountFilter.ts @@ -10,6 +10,7 @@ import { ShareType } from '@nextcloud/sharing' import Vue from 'vue' import FileListFilterAccount from '../components/FileListFilterAccount.vue' +import { isPublicShare } from '@nextcloud/sharing/public' export interface IAccountData { uid: string @@ -152,5 +153,10 @@ class AccountFilter extends FileListFilter { * Register the file list filter by owner or sharees */ export function registerAccountFilter() { + if (isPublicShare()) { + // We do not show the filter on public pages - it makes no sense + return + } + registerFileListFilter(new AccountFilter()) } diff --git a/apps/settings/l10n/et_EE.js b/apps/settings/l10n/et_EE.js index 35fc7a5d4e3..b04802d8704 100644 --- a/apps/settings/l10n/et_EE.js +++ b/apps/settings/l10n/et_EE.js @@ -485,6 +485,7 @@ OC.L10N.register( "Visibility" : "Nähtavus", "Show language" : "Näita keelt", "Show last login" : "Näita viimast sisselogimist", + "Sorting" : "Järjestus", "Sorting only applies to the currently loaded groups for performance reasons. Groups will be loaded as you navigate or search through the list." : "Jõudluse mõttes kehtib järjestus vaid hetkel laaditud gruppidele. Uued grupid lisanduvad sedamööda, kuidas sa loendis edasi liigud.", "Send email" : "Saada kiri", "Defaults" : "Vaikeväärtused", diff --git a/apps/settings/l10n/et_EE.json b/apps/settings/l10n/et_EE.json index a29cfa38243..c820494e24b 100644 --- a/apps/settings/l10n/et_EE.json +++ b/apps/settings/l10n/et_EE.json @@ -483,6 +483,7 @@ "Visibility" : "Nähtavus", "Show language" : "Näita keelt", "Show last login" : "Näita viimast sisselogimist", + "Sorting" : "Järjestus", "Sorting only applies to the currently loaded groups for performance reasons. Groups will be loaded as you navigate or search through the list." : "Jõudluse mõttes kehtib järjestus vaid hetkel laaditud gruppidele. Uued grupid lisanduvad sedamööda, kuidas sa loendis edasi liigud.", "Send email" : "Saada kiri", "Defaults" : "Vaikeväärtused", diff --git a/apps/user_ldap/l10n/da.js b/apps/user_ldap/l10n/da.js index 1982f52351f..0c909bddbf0 100644 --- a/apps/user_ldap/l10n/da.js +++ b/apps/user_ldap/l10n/da.js @@ -20,10 +20,10 @@ OC.L10N.register( "Good password" : "God adgangskode", "Strong password" : "Stærk adgangskode", "The Base DN appears to be wrong" : "Base DN synes at være forkert", - "Testing configuration…" : "Test af konfiguration...", - "Configuration incorrect" : "Indstilling forkert", + "Testing configuration…" : "Tester konfiguration...", + "Configuration incorrect" : "Konfiguration forkert", "Configuration incomplete" : "Konfiguration ufuldstændig", - "Configuration OK" : "Indstilling OK", + "Configuration OK" : "Konfiguration OK", "Select groups" : "Vælg grupper", "Select object classes" : "Vælg objektklasser", "Please check the credentials, they seem to be wrong." : "Tjek venligst legitimationerne.", @@ -35,7 +35,7 @@ OC.L10N.register( "More than 1,000 directory entries available." : "Mere end 1.000 mappeindgange til rådighed.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} indgang tilgængelig i den givne Base DN","{objectsFound} poster tilgængelige inden for den givne Base DN"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN samt tilslutningsindstillinger og legitimationsoplysninger.", - "Do you really want to delete the current Server Configuration?" : "Vil du virkelig slette den aktuelle serverindstilling?", + "Do you really want to delete the current Server Configuration?" : "Vil du virkelig slette den aktuelle server konfiguration?", "Confirm Deletion" : "Bekræft sletning", "Mappings cleared successfully!" : "Mappings ryddet med succes!", "Error while clearing the mappings." : "Fejl under rydning af tilknytninger.", @@ -46,7 +46,7 @@ OC.L10N.register( "Mode switch" : "Tilstandsafbryder", "Select attributes" : "Vælg attributter", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Brugeren ikke fundet. Tjek venligst dine login attributter og brugernavn. Effektiv filter (til copy- and - paste til kommandolinjevalidering): < br / >", - "User found and settings verified." : "Brugerfundet og indstillinger verificeret.", + "User found and settings verified." : "Bruger fundet og indstillinger verificeret.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Overvej at indsnævre din søgning, som det omfattede mange brugere, kun den første af dem vil være i stand til at logge ind.", "An unspecified error occurred. Please check log and settings." : "En uspecificeret fejl opstod. Tjek log og indstillinger.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Søgefilteret er ugyldigt, sandsynligvis på grund af syntaksspørgsmål som ulige antal åbne og lukkede parenteser. Vær venlig at revidere.", @@ -101,7 +101,7 @@ OC.L10N.register( "When logging in, %s will find the user based on the following attributes:" : "Når du logger ind, vil %s finde brugeren baseret på følgende egenskaber:", "LDAP/AD Username:" : "LDAP / AD Brugernavn:", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillader login mod LDAP / AD brugernavn, som er enten \"uid\" eller \"SAMAccountName\" og vil blive opdaget.", - "LDAP/AD Email Address:" : "LDAP / AD Email adresse:", + "LDAP/AD Email Address:" : "LDAP / AD E-mail adresse:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillader login mod en e- mail- attribut. \"mail\" og \"mailPrimaryAddress\" tilladt.", "Other Attributes:" : "Andre attributter:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer det filter der skal anvendes, når login er forsøgt. \"%% uid\" erstatter brugernavnet i login-handlingen. Eksempel: \"uid =%% uid\"", @@ -131,7 +131,7 @@ OC.L10N.register( "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "De mest almindelige objektklasser for brugere er organisationalPerson, person, bruger og inetOrgPerson. Hvis du ikke er sikker på hvilken objektklasse du skal vælge, bedes du konsultere din mappe- admin.", "The filter specifies which LDAP users shall have access to the %s instance." : "Filteret angiver, hvilke LDAP-brugere der skal have adgang til %s instansen.", "Verify settings and count users" : "Verificér indstillinger og tæller brugere", - "Saving" : "Gemning", + "Saving" : "Gemmer", "Back" : "Tilbage", "Continue" : "Fortsæt", "Please renew your password." : "Venligst forny din adgangskode.", diff --git a/apps/user_ldap/l10n/da.json b/apps/user_ldap/l10n/da.json index 22050580fcb..99ad292499e 100644 --- a/apps/user_ldap/l10n/da.json +++ b/apps/user_ldap/l10n/da.json @@ -18,10 +18,10 @@ "Good password" : "God adgangskode", "Strong password" : "Stærk adgangskode", "The Base DN appears to be wrong" : "Base DN synes at være forkert", - "Testing configuration…" : "Test af konfiguration...", - "Configuration incorrect" : "Indstilling forkert", + "Testing configuration…" : "Tester konfiguration...", + "Configuration incorrect" : "Konfiguration forkert", "Configuration incomplete" : "Konfiguration ufuldstændig", - "Configuration OK" : "Indstilling OK", + "Configuration OK" : "Konfiguration OK", "Select groups" : "Vælg grupper", "Select object classes" : "Vælg objektklasser", "Please check the credentials, they seem to be wrong." : "Tjek venligst legitimationerne.", @@ -33,7 +33,7 @@ "More than 1,000 directory entries available." : "Mere end 1.000 mappeindgange til rådighed.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} indgang tilgængelig i den givne Base DN","{objectsFound} poster tilgængelige inden for den givne Base DN"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN samt tilslutningsindstillinger og legitimationsoplysninger.", - "Do you really want to delete the current Server Configuration?" : "Vil du virkelig slette den aktuelle serverindstilling?", + "Do you really want to delete the current Server Configuration?" : "Vil du virkelig slette den aktuelle server konfiguration?", "Confirm Deletion" : "Bekræft sletning", "Mappings cleared successfully!" : "Mappings ryddet med succes!", "Error while clearing the mappings." : "Fejl under rydning af tilknytninger.", @@ -44,7 +44,7 @@ "Mode switch" : "Tilstandsafbryder", "Select attributes" : "Vælg attributter", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Brugeren ikke fundet. Tjek venligst dine login attributter og brugernavn. Effektiv filter (til copy- and - paste til kommandolinjevalidering): < br / >", - "User found and settings verified." : "Brugerfundet og indstillinger verificeret.", + "User found and settings verified." : "Bruger fundet og indstillinger verificeret.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Overvej at indsnævre din søgning, som det omfattede mange brugere, kun den første af dem vil være i stand til at logge ind.", "An unspecified error occurred. Please check log and settings." : "En uspecificeret fejl opstod. Tjek log og indstillinger.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Søgefilteret er ugyldigt, sandsynligvis på grund af syntaksspørgsmål som ulige antal åbne og lukkede parenteser. Vær venlig at revidere.", @@ -99,7 +99,7 @@ "When logging in, %s will find the user based on the following attributes:" : "Når du logger ind, vil %s finde brugeren baseret på følgende egenskaber:", "LDAP/AD Username:" : "LDAP / AD Brugernavn:", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillader login mod LDAP / AD brugernavn, som er enten \"uid\" eller \"SAMAccountName\" og vil blive opdaget.", - "LDAP/AD Email Address:" : "LDAP / AD Email adresse:", + "LDAP/AD Email Address:" : "LDAP / AD E-mail adresse:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillader login mod en e- mail- attribut. \"mail\" og \"mailPrimaryAddress\" tilladt.", "Other Attributes:" : "Andre attributter:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer det filter der skal anvendes, når login er forsøgt. \"%% uid\" erstatter brugernavnet i login-handlingen. Eksempel: \"uid =%% uid\"", @@ -129,7 +129,7 @@ "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "De mest almindelige objektklasser for brugere er organisationalPerson, person, bruger og inetOrgPerson. Hvis du ikke er sikker på hvilken objektklasse du skal vælge, bedes du konsultere din mappe- admin.", "The filter specifies which LDAP users shall have access to the %s instance." : "Filteret angiver, hvilke LDAP-brugere der skal have adgang til %s instansen.", "Verify settings and count users" : "Verificér indstillinger og tæller brugere", - "Saving" : "Gemning", + "Saving" : "Gemmer", "Back" : "Tilbage", "Continue" : "Fortsæt", "Please renew your password." : "Venligst forny din adgangskode.", |