diff options
Diffstat (limited to 'apps')
108 files changed, 1034 insertions, 959 deletions
diff --git a/apps/contactsinteraction/l10n/fr.js b/apps/contactsinteraction/l10n/fr.js index 2318a1d66a8..f93ab8d71a5 100644 --- a/apps/contactsinteraction/l10n/fr.js +++ b/apps/contactsinteraction/l10n/fr.js @@ -4,6 +4,6 @@ OC.L10N.register( "Recently contacted" : "Contacté récemment", "Contacts Interaction" : "Interaction avec les contacts", "Manages interaction between accounts and contacts" : "Gère l'interaction entre les comptes et les contacts", - "Collect data about accounts and contacts interactions and provide an address book for the data" : "Collectez des données sur les interactions entre les comptes et les contacts et fournissez un répertoire pour ces données" + "Collect data about accounts and contacts interactions and provide an address book for the data" : "Collecte des données sur les interactions entre les comptes et les contacts et fournit un répertoire pour ces données" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/contactsinteraction/l10n/fr.json b/apps/contactsinteraction/l10n/fr.json index bd51f4d59a5..0f825180e8d 100644 --- a/apps/contactsinteraction/l10n/fr.json +++ b/apps/contactsinteraction/l10n/fr.json @@ -2,6 +2,6 @@ "Recently contacted" : "Contacté récemment", "Contacts Interaction" : "Interaction avec les contacts", "Manages interaction between accounts and contacts" : "Gère l'interaction entre les comptes et les contacts", - "Collect data about accounts and contacts interactions and provide an address book for the data" : "Collectez des données sur les interactions entre les comptes et les contacts et fournissez un répertoire pour ces données" + "Collect data about accounts and contacts interactions and provide an address book for the data" : "Collecte des données sur les interactions entre les comptes et les contacts et fournit un répertoire pour ces données" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file 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/l10n/de.js b/apps/dav/l10n/de.js index d6569cdc4f9..66e17898188 100644 --- a/apps/dav/l10n/de.js +++ b/apps/dav/l10n/de.js @@ -282,7 +282,7 @@ OC.L10N.register( "Saved availability" : "Verfügbarkeit gespeichert", "Failed to save availability" : "Verfügbarkeit konnte nicht gespeichert werden", "Time zone:" : "Zeitzone:", - "to" : "an", + "to" : "bis", "Delete slot" : "Slot löschen", "No working hours set" : "Keine Arbeitszeiten konfiguriert", "Add slot" : "Slot hinzufügen", diff --git a/apps/dav/l10n/de.json b/apps/dav/l10n/de.json index e3a6f980ba1..94354959e6f 100644 --- a/apps/dav/l10n/de.json +++ b/apps/dav/l10n/de.json @@ -280,7 +280,7 @@ "Saved availability" : "Verfügbarkeit gespeichert", "Failed to save availability" : "Verfügbarkeit konnte nicht gespeichert werden", "Time zone:" : "Zeitzone:", - "to" : "an", + "to" : "bis", "Delete slot" : "Slot löschen", "No working hours set" : "Keine Arbeitszeiten konfiguriert", "Add slot" : "Slot hinzufügen", diff --git a/apps/dav/l10n/de_DE.js b/apps/dav/l10n/de_DE.js index 1072d8f9ff2..0a53ba564a7 100644 --- a/apps/dav/l10n/de_DE.js +++ b/apps/dav/l10n/de_DE.js @@ -282,7 +282,7 @@ OC.L10N.register( "Saved availability" : "Verfügbarkeit gespeichert", "Failed to save availability" : "Verfügbarkeit konnte nicht gespeichert werden", "Time zone:" : "Zeitzone:", - "to" : "an", + "to" : "bis", "Delete slot" : "Zeitfenster löschen", "No working hours set" : "Keine Arbeitszeiten konfiguriert", "Add slot" : "Zeitfenster hinzufügen", diff --git a/apps/dav/l10n/de_DE.json b/apps/dav/l10n/de_DE.json index 721cee8c91a..7bf998eec36 100644 --- a/apps/dav/l10n/de_DE.json +++ b/apps/dav/l10n/de_DE.json @@ -280,7 +280,7 @@ "Saved availability" : "Verfügbarkeit gespeichert", "Failed to save availability" : "Verfügbarkeit konnte nicht gespeichert werden", "Time zone:" : "Zeitzone:", - "to" : "an", + "to" : "bis", "Delete slot" : "Zeitfenster löschen", "No working hours set" : "Keine Arbeitszeiten konfiguriert", "Add slot" : "Zeitfenster hinzufügen", diff --git a/apps/dav/l10n/et_EE.js b/apps/dav/l10n/et_EE.js index 69f941b3daa..2cf7703d686 100644 --- a/apps/dav/l10n/et_EE.js +++ b/apps/dav/l10n/et_EE.js @@ -31,7 +31,11 @@ OC.L10N.register( "{actor} deleted event {event} from calendar {calendar}" : "{actor} kustutas sündmuse {event} kalendrist {calendar}", "You deleted event {event} from calendar {calendar}" : "Sa kustutasid sündmuse {event} kalendrist {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} uuendas sündmust {event} kalendris {calendar}", - "You updated event {event} in calendar {calendar}" : "Sa uuendasid sündmust {event} kalendris {calendar}", + "You updated event {event} in calendar {calendar}" : "Sa uuendasid „{event}“ sündmust „{calendar}“ kalendris", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} teisaldas „{event}“ sündmuse „{sourceCalendar}“ kalendrist „{targetCalendar}“ kalendrisse", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Sina teisaldasid „{event}“ sündmuse „{sourceCalendar}“ kalendrist „{targetCalendar}“ kalendrisse", + "{actor} restored event {event} of calendar {calendar}" : "{actor} taastas „{event}“ sündmuse „{calendar}“ kalendris", + "You restored event {event} of calendar {calendar}" : "Sina taastasid „{event}“ sündmuse „{calendar}“ kalendris", "Busy" : "Hõivatud", "{actor} created to-do {todo} in list {calendar}" : "{actor} lisas {todo} ülesande {calendar} loendissse", "You created to-do {todo} in list {calendar}" : "Sina lisasid {todo} ülesande {calendar} loendisse", @@ -68,6 +72,7 @@ OC.L10N.register( "Description: %s" : "Kirjeldus: %s", "Where: %s" : "Kus: %s", "%1$s via %2$s" : "%1$s %2$s kaudu", + "Every Day between %1$s - %2$s until %3$s" : "Iga päev ajavahemikus %1$s-%2$s kuni %3$s", "Cancelled: %1$s" : "Tühistatud: %1$s", "\"%1$s\" has been canceled" : "„%1$s“ on tühistatud", "Re: %1$s" : "Re: %1$s", diff --git a/apps/dav/l10n/et_EE.json b/apps/dav/l10n/et_EE.json index 2eed43d0c8f..e4615d45ca2 100644 --- a/apps/dav/l10n/et_EE.json +++ b/apps/dav/l10n/et_EE.json @@ -29,7 +29,11 @@ "{actor} deleted event {event} from calendar {calendar}" : "{actor} kustutas sündmuse {event} kalendrist {calendar}", "You deleted event {event} from calendar {calendar}" : "Sa kustutasid sündmuse {event} kalendrist {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} uuendas sündmust {event} kalendris {calendar}", - "You updated event {event} in calendar {calendar}" : "Sa uuendasid sündmust {event} kalendris {calendar}", + "You updated event {event} in calendar {calendar}" : "Sa uuendasid „{event}“ sündmust „{calendar}“ kalendris", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} teisaldas „{event}“ sündmuse „{sourceCalendar}“ kalendrist „{targetCalendar}“ kalendrisse", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Sina teisaldasid „{event}“ sündmuse „{sourceCalendar}“ kalendrist „{targetCalendar}“ kalendrisse", + "{actor} restored event {event} of calendar {calendar}" : "{actor} taastas „{event}“ sündmuse „{calendar}“ kalendris", + "You restored event {event} of calendar {calendar}" : "Sina taastasid „{event}“ sündmuse „{calendar}“ kalendris", "Busy" : "Hõivatud", "{actor} created to-do {todo} in list {calendar}" : "{actor} lisas {todo} ülesande {calendar} loendissse", "You created to-do {todo} in list {calendar}" : "Sina lisasid {todo} ülesande {calendar} loendisse", @@ -66,6 +70,7 @@ "Description: %s" : "Kirjeldus: %s", "Where: %s" : "Kus: %s", "%1$s via %2$s" : "%1$s %2$s kaudu", + "Every Day between %1$s - %2$s until %3$s" : "Iga päev ajavahemikus %1$s-%2$s kuni %3$s", "Cancelled: %1$s" : "Tühistatud: %1$s", "\"%1$s\" has been canceled" : "„%1$s“ on tühistatud", "Re: %1$s" : "Re: %1$s", diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php index 045b9d7e784..98e0f2e9e4b 100644 --- a/apps/dav/lib/Connector/Sabre/File.php +++ b/apps/dav/lib/Connector/Sabre/File.php @@ -19,6 +19,7 @@ use OCA\DAV\Connector\Sabre\Exception\Forbidden as DAVForbiddenException; use OCA\DAV\Connector\Sabre\Exception\UnsupportedMediaType; use OCP\App\IAppManager; use OCP\Encryption\Exceptions\GenericEncryptionException; +use OCP\Files; use OCP\Files\EntityTooLargeException; use OCP\Files\FileInfo; use OCP\Files\ForbiddenException; @@ -229,7 +230,7 @@ class File extends Node implements IFile { // because we have no clue about the cause we can only throw back a 500/Internal Server Error throw new Exception($this->l10n->t('Could not write file contents')); } - [$count, $result] = \OC_Helper::streamCopy($data, $target); + [$count, $result] = Files::streamCopy($data, $target, true); fclose($target); } 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/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/federatedfilesharing/l10n/de_DE.js b/apps/federatedfilesharing/l10n/de_DE.js index 40ad6b5be23..d1e9d2c2e71 100644 --- a/apps/federatedfilesharing/l10n/de_DE.js +++ b/apps/federatedfilesharing/l10n/de_DE.js @@ -53,7 +53,7 @@ OC.L10N.register( "Federated Cloud" : "Federated Cloud", "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit jedem teilen, der einen Nextcloud-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Geben Sie einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com", "Your Federated Cloud ID" : "Ihre Federated-Cloud-ID", - "Share it so your friends can share files with you:" : "Teilen Sie es, so dass Ihre Freunde Dateien mit Ihnen teilen können:", + "Share it so your friends can share files with you:" : "Teilen Sie es, damit Ihre Freunde Dateien mit Ihnen teilen können:", "Facebook" : "Facebook", "X (formerly Twitter)" : "X (früher Twitter)", "formerly Twitter" : "früher Twitter", diff --git a/apps/federatedfilesharing/l10n/de_DE.json b/apps/federatedfilesharing/l10n/de_DE.json index c6cdd274032..962f6fb0857 100644 --- a/apps/federatedfilesharing/l10n/de_DE.json +++ b/apps/federatedfilesharing/l10n/de_DE.json @@ -51,7 +51,7 @@ "Federated Cloud" : "Federated Cloud", "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit jedem teilen, der einen Nextcloud-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Geben Sie einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com", "Your Federated Cloud ID" : "Ihre Federated-Cloud-ID", - "Share it so your friends can share files with you:" : "Teilen Sie es, so dass Ihre Freunde Dateien mit Ihnen teilen können:", + "Share it so your friends can share files with you:" : "Teilen Sie es, damit Ihre Freunde Dateien mit Ihnen teilen können:", "Facebook" : "Facebook", "X (formerly Twitter)" : "X (früher Twitter)", "formerly Twitter" : "früher Twitter", diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js index f4b11b60bfe..3237a8b49d0 100644 --- a/apps/files/l10n/de.js +++ b/apps/files/l10n/de.js @@ -99,6 +99,10 @@ OC.L10N.register( "Rename file" : "Datei umbenennen", "Folder" : "Ordner", "Unknown file type" : "Unbekannter Dateityp", + "{ext} image" : "{ext}-Bild", + "{ext} video" : "{ext}-Video", + "{ext} audio" : "{ext}-Audio", + "{ext} text" : "{ext}-Text", "Pending" : "Ausstehend", "Unknown date" : "Unbekanntes Datum", "Clear filter" : "Filter zurücksetzen", diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json index f34d8585898..f5ebd06c5a8 100644 --- a/apps/files/l10n/de.json +++ b/apps/files/l10n/de.json @@ -97,6 +97,10 @@ "Rename file" : "Datei umbenennen", "Folder" : "Ordner", "Unknown file type" : "Unbekannter Dateityp", + "{ext} image" : "{ext}-Bild", + "{ext} video" : "{ext}-Video", + "{ext} audio" : "{ext}-Audio", + "{ext} text" : "{ext}-Text", "Pending" : "Ausstehend", "Unknown date" : "Unbekanntes Datum", "Clear filter" : "Filter zurücksetzen", diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index cbb4d16f40a..bcf374148b5 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -99,6 +99,10 @@ OC.L10N.register( "Rename file" : "Datei umbenennen", "Folder" : "Ordner", "Unknown file type" : "Unbekannter Dateityp", + "{ext} image" : "{ext}-Bild", + "{ext} video" : "{ext}-Video", + "{ext} audio" : "{ext}-Audio", + "{ext} text" : "{ext}-Text", "Pending" : "Ausstehend", "Unknown date" : "Unbekanntes Datum", "Clear filter" : "Filter zurücksetzen", diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index 8e1f611f317..fd0d1714920 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -97,6 +97,10 @@ "Rename file" : "Datei umbenennen", "Folder" : "Ordner", "Unknown file type" : "Unbekannter Dateityp", + "{ext} image" : "{ext}-Bild", + "{ext} video" : "{ext}-Video", + "{ext} audio" : "{ext}-Audio", + "{ext} text" : "{ext}-Text", "Pending" : "Ausstehend", "Unknown date" : "Unbekanntes Datum", "Clear filter" : "Filter zurücksetzen", diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js index fd8ec312af7..4949fbd61b3 100644 --- a/apps/files/l10n/en_GB.js +++ b/apps/files/l10n/en_GB.js @@ -98,6 +98,11 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "Renamed \"{oldName}\" to \"{newName}\"", "Rename file" : "Rename file", "Folder" : "Folder", + "Unknown file type" : "Unknown file type", + "{ext} image" : "{ext} image", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} audio", + "{ext} text" : "{ext} text", "Pending" : "Pending", "Unknown date" : "Unknown date", "Clear filter" : "Clear filter", @@ -108,6 +113,7 @@ OC.L10N.register( "Total rows summary" : "Total rows summary", "Toggle selection for all files and folders" : "Toggle selection for all files and folders", "Name" : "Name", + "File type" : "File type", "Size" : "Size", "\"{displayName}\" failed on some elements" : "\"{displayName}\" failed on some elements", "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" batch action executed successfully", @@ -186,6 +192,7 @@ OC.L10N.register( "Sort favorites first" : "Sort favourites first", "Sort folders before files" : "Sort folders before files", "Show hidden files" : "Show hidden files", + "Show file type column" : "Show file type column", "Crop image previews" : "Crop image previews", "Enable the grid view" : "Enable the grid view", "Enable folder tree" : "Enable folder tree", diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json index 912befe3b81..eb30639fa72 100644 --- a/apps/files/l10n/en_GB.json +++ b/apps/files/l10n/en_GB.json @@ -96,6 +96,11 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "Renamed \"{oldName}\" to \"{newName}\"", "Rename file" : "Rename file", "Folder" : "Folder", + "Unknown file type" : "Unknown file type", + "{ext} image" : "{ext} image", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} audio", + "{ext} text" : "{ext} text", "Pending" : "Pending", "Unknown date" : "Unknown date", "Clear filter" : "Clear filter", @@ -106,6 +111,7 @@ "Total rows summary" : "Total rows summary", "Toggle selection for all files and folders" : "Toggle selection for all files and folders", "Name" : "Name", + "File type" : "File type", "Size" : "Size", "\"{displayName}\" failed on some elements" : "\"{displayName}\" failed on some elements", "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" batch action executed successfully", @@ -184,6 +190,7 @@ "Sort favorites first" : "Sort favourites first", "Sort folders before files" : "Sort folders before files", "Show hidden files" : "Show hidden files", + "Show file type column" : "Show file type column", "Crop image previews" : "Crop image previews", "Enable the grid view" : "Enable the grid view", "Enable folder tree" : "Enable folder tree", diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js index 17330fbf036..86f79a96ea9 100644 --- a/apps/files/l10n/et_EE.js +++ b/apps/files/l10n/et_EE.js @@ -99,6 +99,10 @@ OC.L10N.register( "Rename file" : "Muuda failinime", "Folder" : "Kaust", "Unknown file type" : "Tundmatu failitüüp", + "{ext} image" : "{ext} pilt", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} helifail", + "{ext} text" : "{ext} tekst", "Pending" : "Ootel", "Unknown date" : "Tundmatu kuupäev", "Clear filter" : "Tühjenda filter", diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json index cb2182202e8..7c1baa0915c 100644 --- a/apps/files/l10n/et_EE.json +++ b/apps/files/l10n/et_EE.json @@ -97,6 +97,10 @@ "Rename file" : "Muuda failinime", "Folder" : "Kaust", "Unknown file type" : "Tundmatu failitüüp", + "{ext} image" : "{ext} pilt", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} helifail", + "{ext} text" : "{ext} tekst", "Pending" : "Ootel", "Unknown date" : "Tundmatu kuupäev", "Clear filter" : "Tühjenda filter", diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index 6e5809bbed8..4fbb46411f3 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -71,6 +71,8 @@ OC.L10N.register( "Transferred from %1$s on %2$s" : "Transféré de %1$s à %2$s", "Files compatibility" : "Compatibilité des fichiers", "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permet de restreindre les noms de fichiers pour s'assurer que les fichiers peuvent être synchronisés avec tous les clients. Par défaut, tous les noms de fichier valides sur POSIX (c'est à dire sur Linux ou MacOS) sont acceptés.", + "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Après avoir activé les noms de fichiers compatibles Windows, les fichiers existants ne peuvent plus être modifiés mais peuvent être renommés avec de nouveaux noms valides par leur propriétaire.", + "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Il est également possible de migrer les fichiers automatiquement après avoir activé ce paramètre, veuillez vous référer à la documentation sur la commande occ.", "Enforce Windows compatibility" : "Forcer la compatibilité Windows", "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Cela va bloquer les noms de fichier non valides sur les systèmes Windows, comme utiliser des noms réservés ou des caractères spéciaux. Mais cela ne renforcera pas la compatibilité de la sensibilité à la casse.", "File Management" : "Gestion de fichiers", @@ -96,6 +98,11 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" renommé en \"{newName}\"", "Rename file" : "Renommer le fichier", "Folder" : "Dossier", + "Unknown file type" : "Type de fichier inconnu", + "{ext} image" : "{ext} image", + "{ext} video" : "{ext} vidéo", + "{ext} audio" : "{ext} audio", + "{ext} text" : "{ext} texte", "Pending" : "En attente", "Unknown date" : "Date inconnue", "Clear filter" : "Supprimer le filtre", @@ -106,6 +113,7 @@ OC.L10N.register( "Total rows summary" : "Récapitulatif du nombre total de lignes", "Toggle selection for all files and folders" : "Basculer la sélection pour tous les fichiers et dossiers", "Name" : "Nom", + "File type" : "Type de fichier", "Size" : "Taille", "\"{displayName}\" failed on some elements" : "\"{displayName}\" a échoué pour certains éléments", "\"{displayName}\" batch action executed successfully" : "L’action « {displayName} » par lot a été exécutée avec succès", @@ -184,6 +192,7 @@ OC.L10N.register( "Sort favorites first" : "Trier les favoris en premier", "Sort folders before files" : "Trier les dossiers avant les fichiers", "Show hidden files" : "Montrer les fichiers masqués", + "Show file type column" : "Afficher la colonne du type de fichier", "Crop image previews" : "Afficher en miniatures carrées", "Enable the grid view" : "Activer la vue en grille", "Enable folder tree" : "Activer l'arborescence des dossiers", @@ -194,6 +203,7 @@ OC.L10N.register( "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV", "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si vous avez activé le 2FA, vous devez créer et utiliser un nouveau mot de passe d'application en cliquant ici.", "Warnings" : "Avertissements", + "Prevent warning dialogs from open or reenable them." : "Empêchez l'ouverture des boîtes de dialogue d'avertissement ou réactivez-les.", "Show a warning dialog when changing a file extension." : "Afficher un avertissement quand l'extension du fichier est modifiée.", "Keyboard shortcuts" : "Raccourcis clavier", "Speed up your Files experience with these quick shortcuts." : "Accélérez votre expérience Fichiers avec ces raccourcis rapides.", @@ -235,6 +245,8 @@ OC.L10N.register( "Failed to convert files: {message}" : "Impossible de convertir les fichiers : {message}", "All files failed to be converted" : "Aucun fichier n'a pu être converti", "One file could not be converted: {message}" : "Le fichier {message} n'a pas pu être converti", + "_One file could not be converted_::_%n files could not be converted_" : ["Un fichier n'a pas pu être converti","%n fichiers n'ont pas pu être convertis","%n fichiers n'ont pas pu être convertis"], + "_One file successfully converted_::_%n files successfully converted_" : ["Un fichier converti avec succès","%n fichiers convertis avec succès","%n fichiers convertis avec succès"], "Files successfully converted" : "Fichiers convertis avec succès", "Failed to convert files" : "Impossible de convertir les fichiers", "Converting file …" : "Conversion du fichier...", @@ -280,6 +292,7 @@ OC.L10N.register( "Open file locally" : "Ouvrir le fichier localement", "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Le fichier devrait maintenant s'ouvrir sur votre appareil. Si ce n'est pas le cas, vérifiez que vous avez installé l'application de bureau.", "Retry and close" : "Réessayer et fermer", + "Open online" : "Ouvrir en ligne", "Failed to redirect to client" : "Échec de la redirection vers le client", "Open locally" : "Ouvrir localement", "Rename" : "Renommer", @@ -325,6 +338,7 @@ OC.L10N.register( "Unexpected error: {error}" : "Erreur inattendue: {error}", "_%n file_::_%n files_" : ["%n fichier","%n fichiers","%n fichiers"], "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers","%n dossiers"], + "_%n hidden_::_%n hidden_" : ["%n caché","%n cachés","%n cachés"], "Filename must not be empty." : "Le nom du fichier ne doit pas être vide.", "\"{char}\" is not allowed inside a filename." : "\"{char}\" n'est pas autorisé dans un nom de fichier.", "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" est un nom réservé et il n'est pas autorisé dans les noms de fichier.", diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 6d03efc424b..77f0ae5147d 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -69,6 +69,8 @@ "Transferred from %1$s on %2$s" : "Transféré de %1$s à %2$s", "Files compatibility" : "Compatibilité des fichiers", "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Permet de restreindre les noms de fichiers pour s'assurer que les fichiers peuvent être synchronisés avec tous les clients. Par défaut, tous les noms de fichier valides sur POSIX (c'est à dire sur Linux ou MacOS) sont acceptés.", + "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Après avoir activé les noms de fichiers compatibles Windows, les fichiers existants ne peuvent plus être modifiés mais peuvent être renommés avec de nouveaux noms valides par leur propriétaire.", + "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Il est également possible de migrer les fichiers automatiquement après avoir activé ce paramètre, veuillez vous référer à la documentation sur la commande occ.", "Enforce Windows compatibility" : "Forcer la compatibilité Windows", "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Cela va bloquer les noms de fichier non valides sur les systèmes Windows, comme utiliser des noms réservés ou des caractères spéciaux. Mais cela ne renforcera pas la compatibilité de la sensibilité à la casse.", "File Management" : "Gestion de fichiers", @@ -94,6 +96,11 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" renommé en \"{newName}\"", "Rename file" : "Renommer le fichier", "Folder" : "Dossier", + "Unknown file type" : "Type de fichier inconnu", + "{ext} image" : "{ext} image", + "{ext} video" : "{ext} vidéo", + "{ext} audio" : "{ext} audio", + "{ext} text" : "{ext} texte", "Pending" : "En attente", "Unknown date" : "Date inconnue", "Clear filter" : "Supprimer le filtre", @@ -104,6 +111,7 @@ "Total rows summary" : "Récapitulatif du nombre total de lignes", "Toggle selection for all files and folders" : "Basculer la sélection pour tous les fichiers et dossiers", "Name" : "Nom", + "File type" : "Type de fichier", "Size" : "Taille", "\"{displayName}\" failed on some elements" : "\"{displayName}\" a échoué pour certains éléments", "\"{displayName}\" batch action executed successfully" : "L’action « {displayName} » par lot a été exécutée avec succès", @@ -182,6 +190,7 @@ "Sort favorites first" : "Trier les favoris en premier", "Sort folders before files" : "Trier les dossiers avant les fichiers", "Show hidden files" : "Montrer les fichiers masqués", + "Show file type column" : "Afficher la colonne du type de fichier", "Crop image previews" : "Afficher en miniatures carrées", "Enable the grid view" : "Activer la vue en grille", "Enable folder tree" : "Activer l'arborescence des dossiers", @@ -192,6 +201,7 @@ "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers via WebDAV", "If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si vous avez activé le 2FA, vous devez créer et utiliser un nouveau mot de passe d'application en cliquant ici.", "Warnings" : "Avertissements", + "Prevent warning dialogs from open or reenable them." : "Empêchez l'ouverture des boîtes de dialogue d'avertissement ou réactivez-les.", "Show a warning dialog when changing a file extension." : "Afficher un avertissement quand l'extension du fichier est modifiée.", "Keyboard shortcuts" : "Raccourcis clavier", "Speed up your Files experience with these quick shortcuts." : "Accélérez votre expérience Fichiers avec ces raccourcis rapides.", @@ -233,6 +243,8 @@ "Failed to convert files: {message}" : "Impossible de convertir les fichiers : {message}", "All files failed to be converted" : "Aucun fichier n'a pu être converti", "One file could not be converted: {message}" : "Le fichier {message} n'a pas pu être converti", + "_One file could not be converted_::_%n files could not be converted_" : ["Un fichier n'a pas pu être converti","%n fichiers n'ont pas pu être convertis","%n fichiers n'ont pas pu être convertis"], + "_One file successfully converted_::_%n files successfully converted_" : ["Un fichier converti avec succès","%n fichiers convertis avec succès","%n fichiers convertis avec succès"], "Files successfully converted" : "Fichiers convertis avec succès", "Failed to convert files" : "Impossible de convertir les fichiers", "Converting file …" : "Conversion du fichier...", @@ -278,6 +290,7 @@ "Open file locally" : "Ouvrir le fichier localement", "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Le fichier devrait maintenant s'ouvrir sur votre appareil. Si ce n'est pas le cas, vérifiez que vous avez installé l'application de bureau.", "Retry and close" : "Réessayer et fermer", + "Open online" : "Ouvrir en ligne", "Failed to redirect to client" : "Échec de la redirection vers le client", "Open locally" : "Ouvrir localement", "Rename" : "Renommer", @@ -323,6 +336,7 @@ "Unexpected error: {error}" : "Erreur inattendue: {error}", "_%n file_::_%n files_" : ["%n fichier","%n fichiers","%n fichiers"], "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers","%n dossiers"], + "_%n hidden_::_%n hidden_" : ["%n caché","%n cachés","%n cachés"], "Filename must not be empty." : "Le nom du fichier ne doit pas être vide.", "\"{char}\" is not allowed inside a filename." : "\"{char}\" n'est pas autorisé dans un nom de fichier.", "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" est un nom réservé et il n'est pas autorisé dans les noms de fichier.", diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index 3d61616343b..6c16223edef 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -71,6 +71,8 @@ OC.L10N.register( "Transferred from %1$s on %2$s" : "%1$sから%2$sに転送", "Files compatibility" : "ファイルの互換性", "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "ファイルをすべてのクライアントと同期できるようにするために、ファイル名を制限することを許可します。デフォルトではPOSIX(LinuxやmacOSなど)で有効なすべてのファイル名が許可されています。", + "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows 互換のファイル名を有効にすると、既存のファイルは変更できなくなりますが、所有者が有効な新しいファイル名に変更できるようになります。", + "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "この設定を有効にした後、自動的にファイルを移行することも可能です。occコマンドに関するドキュメントを参照してください。", "Enforce Windows compatibility" : "Windowsとの互換性を強制", "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "予約名や特殊文字のような、Windowsシステムにおいて有効でないファイル名をブロックします。これは大文字、小文字の互換性を強制するものではありません。", "File Management" : "ファイル管理", @@ -96,6 +98,11 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" から \"{newName}\" に名前を変更済み", "Rename file" : "ファイル名の変更", "Folder" : "フォルダー", + "Unknown file type" : "不明なファイルタイプ", + "{ext} image" : "{ext}画像", + "{ext} video" : "{ext}ビデオ", + "{ext} audio" : "{ext}音声", + "{ext} text" : "{ext}テキスト", "Pending" : "保留中", "Unknown date" : "不明な日付", "Clear filter" : "フィルターをクリア", @@ -106,6 +113,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}\" バッチアクションが正常に実行されました。", @@ -184,6 +192,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/ja.json b/apps/files/l10n/ja.json index e778a19f0bb..6e24c0a0326 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -69,6 +69,8 @@ "Transferred from %1$s on %2$s" : "%1$sから%2$sに転送", "Files compatibility" : "ファイルの互換性", "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "ファイルをすべてのクライアントと同期できるようにするために、ファイル名を制限することを許可します。デフォルトではPOSIX(LinuxやmacOSなど)で有効なすべてのファイル名が許可されています。", + "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows 互換のファイル名を有効にすると、既存のファイルは変更できなくなりますが、所有者が有効な新しいファイル名に変更できるようになります。", + "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "この設定を有効にした後、自動的にファイルを移行することも可能です。occコマンドに関するドキュメントを参照してください。", "Enforce Windows compatibility" : "Windowsとの互換性を強制", "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "予約名や特殊文字のような、Windowsシステムにおいて有効でないファイル名をブロックします。これは大文字、小文字の互換性を強制するものではありません。", "File Management" : "ファイル管理", @@ -94,6 +96,11 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "\"{oldName}\" から \"{newName}\" に名前を変更済み", "Rename file" : "ファイル名の変更", "Folder" : "フォルダー", + "Unknown file type" : "不明なファイルタイプ", + "{ext} image" : "{ext}画像", + "{ext} video" : "{ext}ビデオ", + "{ext} audio" : "{ext}音声", + "{ext} text" : "{ext}テキスト", "Pending" : "保留中", "Unknown date" : "不明な日付", "Clear filter" : "フィルターをクリア", @@ -104,6 +111,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}\" バッチアクションが正常に実行されました。", @@ -182,6 +190,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/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 65358d419aa..8e77d1b2bb5 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -99,6 +99,10 @@ OC.L10N.register( "Rename file" : "Renomear arquivo", "Folder" : "Pasta", "Unknown file type" : "Tipo de arquivo desconhecido", + "{ext} image" : "imagem {ext}", + "{ext} video" : "vídeo {ext}", + "{ext} audio" : "áudio {ext}", + "{ext} text" : "texto {ext}", "Pending" : "Pendente", "Unknown date" : "Data desconhecida", "Clear filter" : "Limpar filtro", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index 7b39fa76f77..09de897bc56 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -97,6 +97,10 @@ "Rename file" : "Renomear arquivo", "Folder" : "Pasta", "Unknown file type" : "Tipo de arquivo desconhecido", + "{ext} image" : "imagem {ext}", + "{ext} video" : "vídeo {ext}", + "{ext} audio" : "áudio {ext}", + "{ext} text" : "texto {ext}", "Pending" : "Pendente", "Unknown date" : "Data desconhecida", "Clear filter" : "Limpar filtro", diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index 2847bc373c7..ad6b2e96bf4 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -98,6 +98,11 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "Bytte namn på \"{oldName}\" till \"{newName}\"", "Rename file" : "Byt namn på fil", "Folder" : "Mapp", + "Unknown file type" : "Okänd filtyp", + "{ext} image" : "{ext} bild", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} ljud", + "{ext} text" : "{ext} text", "Pending" : "Väntar", "Unknown date" : "Okänt datum", "Clear filter" : "Rensa filter", @@ -108,6 +113,7 @@ OC.L10N.register( "Total rows summary" : "Sammanfattning antal rader", "Toggle selection for all files and folders" : "Växla markering för alla filer och mappar", "Name" : "Namn", + "File type" : "Filtyp", "Size" : "Storlek", "\"{displayName}\" failed on some elements" : "\"{displayName}\" misslyckades med vissa element", "\"{displayName}\" batch action executed successfully" : "Batchåtgärden \"{displayName}\" har utförts", @@ -186,6 +192,7 @@ OC.L10N.register( "Sort favorites first" : "Sortera favoriter först", "Sort folders before files" : "Sortera mappar före filer", "Show hidden files" : "Visa dolda filer", + "Show file type column" : "Visa kolumn för filtyp", "Crop image previews" : "Beskär förhandsgranskningar för bilder", "Enable the grid view" : "Aktivera rutnätsvy", "Enable folder tree" : "Aktivera mappträd", diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index affd94daa75..514dd77aab7 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -96,6 +96,11 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "Bytte namn på \"{oldName}\" till \"{newName}\"", "Rename file" : "Byt namn på fil", "Folder" : "Mapp", + "Unknown file type" : "Okänd filtyp", + "{ext} image" : "{ext} bild", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} ljud", + "{ext} text" : "{ext} text", "Pending" : "Väntar", "Unknown date" : "Okänt datum", "Clear filter" : "Rensa filter", @@ -106,6 +111,7 @@ "Total rows summary" : "Sammanfattning antal rader", "Toggle selection for all files and folders" : "Växla markering för alla filer och mappar", "Name" : "Namn", + "File type" : "Filtyp", "Size" : "Storlek", "\"{displayName}\" failed on some elements" : "\"{displayName}\" misslyckades med vissa element", "\"{displayName}\" batch action executed successfully" : "Batchåtgärden \"{displayName}\" har utförts", @@ -184,6 +190,7 @@ "Sort favorites first" : "Sortera favoriter först", "Sort folders before files" : "Sortera mappar före filer", "Show hidden files" : "Visa dolda filer", + "Show file type column" : "Visa kolumn för filtyp", "Crop image previews" : "Beskär förhandsgranskningar för bilder", "Enable the grid view" : "Aktivera rutnätsvy", "Enable folder tree" : "Aktivera mappträd", diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js index 24c6af3046f..b0cc1433457 100644 --- a/apps/files/l10n/zh_CN.js +++ b/apps/files/l10n/zh_CN.js @@ -98,6 +98,11 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "已将“{oldName}”重命名为“{newName}”", "Rename file" : "重命名文件", "Folder" : "文件夹", + "Unknown file type" : "未知文件类型", + "{ext} image" : "{ext} 图片", + "{ext} video" : "{ext} 视频", + "{ext} audio" : "{ext} 音频", + "{ext} text" : "{ext} 文本", "Pending" : "等待", "Unknown date" : "未知日期", "Clear filter" : "清除筛选", @@ -108,6 +113,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 +192,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_CN.json b/apps/files/l10n/zh_CN.json index 6fb7facb3b6..e15d9f5b180 100644 --- a/apps/files/l10n/zh_CN.json +++ b/apps/files/l10n/zh_CN.json @@ -96,6 +96,11 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "已将“{oldName}”重命名为“{newName}”", "Rename file" : "重命名文件", "Folder" : "文件夹", + "Unknown file type" : "未知文件类型", + "{ext} image" : "{ext} 图片", + "{ext} video" : "{ext} 视频", + "{ext} audio" : "{ext} 音频", + "{ext} text" : "{ext} 文本", "Pending" : "等待", "Unknown date" : "未知日期", "Clear filter" : "清除筛选", @@ -106,6 +111,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 +190,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/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js index 5b593dc8428..af981fd94cc 100644 --- a/apps/files/l10n/zh_HK.js +++ b/apps/files/l10n/zh_HK.js @@ -98,6 +98,11 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "已將「{oldName}」重新命名為「{newName}」", "Rename file" : "重新命名檔案", "Folder" : "資料夾", + "Unknown file type" : "檔案類型不詳", + "{ext} image" : "{ext} 圖像", + "{ext} video" : "{ext} 視像", + "{ext} audio" : "{ext} 音頻", + "{ext} text" : "{ext} 文字", "Pending" : "待定的", "Unknown date" : "日期不詳", "Clear filter" : "清空過濾器", @@ -108,6 +113,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 +192,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_HK.json b/apps/files/l10n/zh_HK.json index 927fc7dc8ef..e04500132ed 100644 --- a/apps/files/l10n/zh_HK.json +++ b/apps/files/l10n/zh_HK.json @@ -96,6 +96,11 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "已將「{oldName}」重新命名為「{newName}」", "Rename file" : "重新命名檔案", "Folder" : "資料夾", + "Unknown file type" : "檔案類型不詳", + "{ext} image" : "{ext} 圖像", + "{ext} video" : "{ext} 視像", + "{ext} audio" : "{ext} 音頻", + "{ext} text" : "{ext} 文字", "Pending" : "待定的", "Unknown date" : "日期不詳", "Clear filter" : "清空過濾器", @@ -106,6 +111,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 +190,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/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 51c97322725..4ff34d480e5 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -99,6 +99,10 @@ OC.L10N.register( "Rename file" : "重新命名檔案", "Folder" : "資料夾", "Unknown file type" : "未知檔案類型", + "{ext} image" : "{ext} 影像", + "{ext} video" : "{ext} 視訊", + "{ext} audio" : "{ext} 音訊", + "{ext} text" : "{ext} 文字", "Pending" : "待處理", "Unknown date" : "未知日期", "Clear filter" : "清除過濾條件", diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index ead55fc3891..0def7339d4d 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -97,6 +97,10 @@ "Rename file" : "重新命名檔案", "Folder" : "資料夾", "Unknown file type" : "未知檔案類型", + "{ext} image" : "{ext} 影像", + "{ext} video" : "{ext} 視訊", + "{ext} audio" : "{ext} 音訊", + "{ext} text" : "{ext} 文字", "Pending" : "待處理", "Unknown date" : "未知日期", "Clear filter" : "清除過濾條件", 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_external/l10n/fr.js b/apps/files_external/l10n/fr.js index 34809db9d1d..bb6ed322fea 100644 --- a/apps/files_external/l10n/fr.js +++ b/apps/files_external/l10n/fr.js @@ -7,6 +7,7 @@ OC.L10N.register( "Error configuring OAuth2" : "Erreur lors de la configuration de OAuth2", "Generate keys" : "Générer des clés", "Error generating key pair" : "Erreur lors de la génération des clés", + "Permission denied" : "Autorisation refusée", "Forbidden to manage local mounts" : "Interdiction de gérer les montages locaux.", "Storage with ID \"%d\" not found" : "Stockage avec l'ID \"%d\" non trouvé", "Invalid backend or authentication mechanism class" : "Service ou méthode d'authentification non valable", diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json index e36b5cd05f8..23e6346641f 100644 --- a/apps/files_external/l10n/fr.json +++ b/apps/files_external/l10n/fr.json @@ -5,6 +5,7 @@ "Error configuring OAuth2" : "Erreur lors de la configuration de OAuth2", "Generate keys" : "Générer des clés", "Error generating key pair" : "Erreur lors de la génération des clés", + "Permission denied" : "Autorisation refusée", "Forbidden to manage local mounts" : "Interdiction de gérer les montages locaux.", "Storage with ID \"%d\" not found" : "Stockage avec l'ID \"%d\" non trouvé", "Invalid backend or authentication mechanism class" : "Service ou méthode d'authentification non valable", diff --git a/apps/files_reminders/l10n/fr.js b/apps/files_reminders/l10n/fr.js index 5db5e281323..7faf292ac61 100644 --- a/apps/files_reminders/l10n/fr.js +++ b/apps/files_reminders/l10n/fr.js @@ -5,15 +5,18 @@ OC.L10N.register( "Reminder for {name}" : "Rappel pour {name}", "View file" : "Voir le fichier", "View folder" : "Voir le dossier", + "Files reminder" : "Rappel des fichiers", + "The \"files_reminders\" app can work properly." : "L'application « files_reminders » peut fonctionner correctement.", + "The \"files_reminders\" app needs the notification app to work properly. You should either enable notifications or disable files_reminder." : "L'application « files_reminders » a besoin de l'application de notifications pour fonctionner correctement. Vous devez activer les notifications ou désactiver « files_reminder ».", "Set file reminders" : "Définir des rappels pour des fichiers", "**📣 File reminders**\n\nSet file reminders.\n\nNote: to use the `File reminders` app, ensure that the `Notifications` app is installed and enabled. The `Notifications` app provides the necessary APIs for the `File reminders` app to work correctly." : "**📣 Rappels de fichiers**\n\nDéfinit des rappels de fichiers.\n\nNote: pour utiliser l'application `Rappels de fichiers`, assurez-vous que l'application `Notifications` est installée et activée. L'application `Notifications` fournit les APIs nécessaires pour que l'application `Rappels de fichiers` fonctionne correctement.", - "Set reminder for \"{fileName}\"" : "Définir un rappel pour « {fileName} »", + "Set reminder for \"{fileName}\"" : "Définir un rappel pour « {fileName} »", "Set reminder at custom date & time" : "Définition d'un rappel à une date et une heure personnalisées", "Clear reminder" : "Effacer le rappel", "Please choose a valid date & time" : "Veuillez choisir une date et une heure valables", "Reminder set for \"{fileName}\"" : "Définition d’un rappel pour « {fileName} »", "Failed to set reminder" : "Échec de la définition du rappel", - "Reminder cleared for \"{fileName}\"" : "Rappel effacé pour « {fileName} »", + "Reminder cleared for \"{fileName}\"" : "Rappel effacé pour « {fileName} »", "Failed to clear reminder" : "Échec de l'effacement du rappel", "We will remind you of this file" : "Nous vous rappellerons de ce fichier", "Cancel" : "Annuler", @@ -27,6 +30,8 @@ OC.L10N.register( "This weekend" : "Ce week-end", "Set reminder for this weekend" : "Définir un rappel pour ce week-end", "Next week" : "Semaine suivante", - "Set reminder for next week" : "Définir un rappel pour la semaine prochaine" + "Set reminder for next week" : "Définir un rappel pour la semaine prochaine", + "This files_reminder can work properly." : "Ce fichier_reminder peut fonctionner correctement.", + "The files_reminder app needs the notification app to work properly. You should either enable notifications or disable files_reminder." : "L'application files_reminder a besoin de l'application de notifications pour fonctionner correctement. Vous devez activer les notifications ou désactiver files_reminder." }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files_reminders/l10n/fr.json b/apps/files_reminders/l10n/fr.json index 2d876b6080e..17f299e934e 100644 --- a/apps/files_reminders/l10n/fr.json +++ b/apps/files_reminders/l10n/fr.json @@ -3,15 +3,18 @@ "Reminder for {name}" : "Rappel pour {name}", "View file" : "Voir le fichier", "View folder" : "Voir le dossier", + "Files reminder" : "Rappel des fichiers", + "The \"files_reminders\" app can work properly." : "L'application « files_reminders » peut fonctionner correctement.", + "The \"files_reminders\" app needs the notification app to work properly. You should either enable notifications or disable files_reminder." : "L'application « files_reminders » a besoin de l'application de notifications pour fonctionner correctement. Vous devez activer les notifications ou désactiver « files_reminder ».", "Set file reminders" : "Définir des rappels pour des fichiers", "**📣 File reminders**\n\nSet file reminders.\n\nNote: to use the `File reminders` app, ensure that the `Notifications` app is installed and enabled. The `Notifications` app provides the necessary APIs for the `File reminders` app to work correctly." : "**📣 Rappels de fichiers**\n\nDéfinit des rappels de fichiers.\n\nNote: pour utiliser l'application `Rappels de fichiers`, assurez-vous que l'application `Notifications` est installée et activée. L'application `Notifications` fournit les APIs nécessaires pour que l'application `Rappels de fichiers` fonctionne correctement.", - "Set reminder for \"{fileName}\"" : "Définir un rappel pour « {fileName} »", + "Set reminder for \"{fileName}\"" : "Définir un rappel pour « {fileName} »", "Set reminder at custom date & time" : "Définition d'un rappel à une date et une heure personnalisées", "Clear reminder" : "Effacer le rappel", "Please choose a valid date & time" : "Veuillez choisir une date et une heure valables", "Reminder set for \"{fileName}\"" : "Définition d’un rappel pour « {fileName} »", "Failed to set reminder" : "Échec de la définition du rappel", - "Reminder cleared for \"{fileName}\"" : "Rappel effacé pour « {fileName} »", + "Reminder cleared for \"{fileName}\"" : "Rappel effacé pour « {fileName} »", "Failed to clear reminder" : "Échec de l'effacement du rappel", "We will remind you of this file" : "Nous vous rappellerons de ce fichier", "Cancel" : "Annuler", @@ -25,6 +28,8 @@ "This weekend" : "Ce week-end", "Set reminder for this weekend" : "Définir un rappel pour ce week-end", "Next week" : "Semaine suivante", - "Set reminder for next week" : "Définir un rappel pour la semaine prochaine" + "Set reminder for next week" : "Définir un rappel pour la semaine prochaine", + "This files_reminder can work properly." : "Ce fichier_reminder peut fonctionner correctement.", + "The files_reminder app needs the notification app to work properly. You should either enable notifications or disable files_reminder." : "L'application files_reminder a besoin de l'application de notifications pour fonctionner correctement. Vous devez activer les notifications ou désactiver files_reminder." },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js index f6aa0685ab2..e686a33970e 100644 --- a/apps/files_sharing/l10n/de.js +++ b/apps/files_sharing/l10n/de.js @@ -182,7 +182,7 @@ OC.L10N.register( "Choose a default folder for accepted shares" : "Einen Standardordner für akzeptierte Freigaben wählen", "Invalid path selected" : "Ungültigen Pfad ausgewählt", "Unknown error" : "Unbekannter Fehler", - "Set default folder for accepted shares" : "Standardordner für akzeptierte Freigaben wählen", + "Set default folder for accepted shares" : "Standardordner für angenommene Freigaben", "Reset" : "Zurücksetzen", "Reset folder to system default" : "Ordner auf Systemstandard zurücksetzen", "Share expiration: " : "Freigabe-Ablaufdatum:", diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json index 52b17773dbd..a797c90fe56 100644 --- a/apps/files_sharing/l10n/de.json +++ b/apps/files_sharing/l10n/de.json @@ -180,7 +180,7 @@ "Choose a default folder for accepted shares" : "Einen Standardordner für akzeptierte Freigaben wählen", "Invalid path selected" : "Ungültigen Pfad ausgewählt", "Unknown error" : "Unbekannter Fehler", - "Set default folder for accepted shares" : "Standardordner für akzeptierte Freigaben wählen", + "Set default folder for accepted shares" : "Standardordner für angenommene Freigaben", "Reset" : "Zurücksetzen", "Reset folder to system default" : "Ordner auf Systemstandard zurücksetzen", "Share expiration: " : "Freigabe-Ablaufdatum:", diff --git a/apps/files_sharing/l10n/de_DE.js b/apps/files_sharing/l10n/de_DE.js index 1269c6a0cfb..608e60101c9 100644 --- a/apps/files_sharing/l10n/de_DE.js +++ b/apps/files_sharing/l10n/de_DE.js @@ -182,7 +182,7 @@ OC.L10N.register( "Choose a default folder for accepted shares" : "Wählen Sie einen Standardordner für akzeptierte Freigaben", "Invalid path selected" : "Ungültiger Pfad ausgewählt", "Unknown error" : "Unbekannter Fehler", - "Set default folder for accepted shares" : "Standardordner für akzeptierte Freigaben wählen", + "Set default folder for accepted shares" : "Standardordner für angenommene Freigaben", "Reset" : "Zurücksetzen", "Reset folder to system default" : "Ordner auf Systemstandard zurücksetzen", "Share expiration: " : "Freigabe-Ablaufdatum:", diff --git a/apps/files_sharing/l10n/de_DE.json b/apps/files_sharing/l10n/de_DE.json index 0a61a725d3e..97c1ac18a7c 100644 --- a/apps/files_sharing/l10n/de_DE.json +++ b/apps/files_sharing/l10n/de_DE.json @@ -180,7 +180,7 @@ "Choose a default folder for accepted shares" : "Wählen Sie einen Standardordner für akzeptierte Freigaben", "Invalid path selected" : "Ungültiger Pfad ausgewählt", "Unknown error" : "Unbekannter Fehler", - "Set default folder for accepted shares" : "Standardordner für akzeptierte Freigaben wählen", + "Set default folder for accepted shares" : "Standardordner für angenommene Freigaben", "Reset" : "Zurücksetzen", "Reset folder to system default" : "Ordner auf Systemstandard zurücksetzen", "Share expiration: " : "Freigabe-Ablaufdatum:", diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js index 3f64ecb6e64..9c7ff96e94d 100644 --- a/apps/files_sharing/l10n/fr.js +++ b/apps/files_sharing/l10n/fr.js @@ -185,6 +185,8 @@ OC.L10N.register( "Set default folder for accepted shares" : "Définir le dossier par défaut pour les partages acceptés", "Reset" : "Réinitialiser", "Reset folder to system default" : "Réinitialiser le dossier par défaut du système", + "Share expiration: " : "Expiration du partage :", + "Share Expiration" : "Expiration du partage", "group" : "groupe", "conversation" : "conversation", "remote" : "distant", @@ -311,7 +313,9 @@ OC.L10N.register( "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." : "Utilisez cette méthode pour partager des fichiers avec des personnes ou des équipes au sein de votre organisation. Si le destinataire a déjà accès au partage, mais ne parvient pas à le localiser, vous pouvez lui envoyer le lien interne pour faciliter l'accès.", "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." : "Cette méthode permet de partager des fichiers avec des personnes ou des organisations extérieures à votre organisation. Les fichiers et les dossiers peuvent être partagés via des liens de partage publics et des adresses e-mail. Vous pouvez également partager avec d'autres comptes Nextcloud hébergés sur différentes instances en utilisant leur ID de cloud fédéré.", "Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Partages qui ne font pas partie des partages internes ou externes. Il peut s'agir de partages provenant d'applications ou d'autres sources.", + "Share with accounts, teams, federated cloud IDs" : "Partager avec des comptes, des équipes et des IDs cloud fédérés", "Share with accounts and teams" : "Partager avec des comptes et des équipes", + "Email, federated cloud ID" : "E-mail, ID cloud fédéré", "Unable to load the shares list" : "Impossible de charger la liste des partages", "Expires {relativetime}" : "Expire {relativetime}", "this share just expired." : "ce partage vient d'expirer", @@ -420,6 +424,7 @@ OC.L10N.register( "You are not allowed to edit link shares that you don't own" : "Vous n'êtes pas autorisé à modifier les liens de partage dont vous n'êtes pas propriétaire", "_1 email address already added_::_{count} email addresses already added_" : ["1 adresse mail déjà ajoutée"," {count}adresses email déjà ajoutées","{count} adresses e-mail déjà ajoutées"], "_1 email address added_::_{count} email addresses added_" : [" 1 adresse mail ajoutée","{count} adresses mail ajoutées","{count} adresses mail ajoutées"], + "Share with accounts, teams, federated cloud id" : "Partager avec des comptes, des équipes, un identifiant de cloud fédéré", "Email, federated cloud id" : "E-mail, ID de cloud fédéré" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json index 412370041ff..b08514d8c1f 100644 --- a/apps/files_sharing/l10n/fr.json +++ b/apps/files_sharing/l10n/fr.json @@ -183,6 +183,8 @@ "Set default folder for accepted shares" : "Définir le dossier par défaut pour les partages acceptés", "Reset" : "Réinitialiser", "Reset folder to system default" : "Réinitialiser le dossier par défaut du système", + "Share expiration: " : "Expiration du partage :", + "Share Expiration" : "Expiration du partage", "group" : "groupe", "conversation" : "conversation", "remote" : "distant", @@ -309,7 +311,9 @@ "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." : "Utilisez cette méthode pour partager des fichiers avec des personnes ou des équipes au sein de votre organisation. Si le destinataire a déjà accès au partage, mais ne parvient pas à le localiser, vous pouvez lui envoyer le lien interne pour faciliter l'accès.", "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." : "Cette méthode permet de partager des fichiers avec des personnes ou des organisations extérieures à votre organisation. Les fichiers et les dossiers peuvent être partagés via des liens de partage publics et des adresses e-mail. Vous pouvez également partager avec d'autres comptes Nextcloud hébergés sur différentes instances en utilisant leur ID de cloud fédéré.", "Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Partages qui ne font pas partie des partages internes ou externes. Il peut s'agir de partages provenant d'applications ou d'autres sources.", + "Share with accounts, teams, federated cloud IDs" : "Partager avec des comptes, des équipes et des IDs cloud fédérés", "Share with accounts and teams" : "Partager avec des comptes et des équipes", + "Email, federated cloud ID" : "E-mail, ID cloud fédéré", "Unable to load the shares list" : "Impossible de charger la liste des partages", "Expires {relativetime}" : "Expire {relativetime}", "this share just expired." : "ce partage vient d'expirer", @@ -418,6 +422,7 @@ "You are not allowed to edit link shares that you don't own" : "Vous n'êtes pas autorisé à modifier les liens de partage dont vous n'êtes pas propriétaire", "_1 email address already added_::_{count} email addresses already added_" : ["1 adresse mail déjà ajoutée"," {count}adresses email déjà ajoutées","{count} adresses e-mail déjà ajoutées"], "_1 email address added_::_{count} email addresses added_" : [" 1 adresse mail ajoutée","{count} adresses mail ajoutées","{count} adresses mail ajoutées"], + "Share with accounts, teams, federated cloud id" : "Partager avec des comptes, des équipes, un identifiant de cloud fédéré", "Email, federated cloud id" : "E-mail, ID de cloud fédéré" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js index 062614d2fe3..dfbb41c95cc 100644 --- a/apps/files_sharing/l10n/ja.js +++ b/apps/files_sharing/l10n/ja.js @@ -313,7 +313,9 @@ OC.L10N.register( "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." : "組織外の個人や組織とファイルを共有するには、この方法を使用します。ファイルやフォルダは、パブリック共有リンクやメールアドレスで共有できます。また、連携クラウドIDを使用して、異なるインスタンスにホストされている他のNextcloudアカウントと共有することもできます。", "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" : "アカウントとチームで共有", + "Email, federated cloud ID" : "電子メール、連携クラウドID", "Unable to load the shares list" : "共有リストを読み込めません", "Expires {relativetime}" : "有効期限 {relativetime}", "this share just expired." : "この共有は期限切れになりました。", @@ -422,6 +424,7 @@ OC.L10N.register( "You are not allowed to edit link shares that you don't own" : "あなたが所有していない共有リンクを編集することは許可されていません", "_1 email address already added_::_{count} email addresses already added_" : ["{count} メールアドレスはすでに追加されています"], "_1 email address added_::_{count} email addresses added_" : ["{count} メールアドレスが追加されました"], + "Share with accounts, teams, federated cloud id" : "アカウント、チーム、連携クラウドIDで共有", "Email, federated cloud id" : "電子メール、連携クラウドID" }, "nplurals=1; plural=0;"); diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json index c2657abce02..67b977bbe3b 100644 --- a/apps/files_sharing/l10n/ja.json +++ b/apps/files_sharing/l10n/ja.json @@ -311,7 +311,9 @@ "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." : "組織外の個人や組織とファイルを共有するには、この方法を使用します。ファイルやフォルダは、パブリック共有リンクやメールアドレスで共有できます。また、連携クラウドIDを使用して、異なるインスタンスにホストされている他のNextcloudアカウントと共有することもできます。", "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" : "アカウントとチームで共有", + "Email, federated cloud ID" : "電子メール、連携クラウドID", "Unable to load the shares list" : "共有リストを読み込めません", "Expires {relativetime}" : "有効期限 {relativetime}", "this share just expired." : "この共有は期限切れになりました。", @@ -420,6 +422,7 @@ "You are not allowed to edit link shares that you don't own" : "あなたが所有していない共有リンクを編集することは許可されていません", "_1 email address already added_::_{count} email addresses already added_" : ["{count} メールアドレスはすでに追加されています"], "_1 email address added_::_{count} email addresses added_" : ["{count} メールアドレスが追加されました"], + "Share with accounts, teams, federated cloud id" : "アカウント、チーム、連携クラウドIDで共有", "Email, federated cloud id" : "電子メール、連携クラウドID" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/fr.js b/apps/files_trashbin/l10n/fr.js index dd615fab5fb..db2e6d58272 100644 --- a/apps/files_trashbin/l10n/fr.js +++ b/apps/files_trashbin/l10n/fr.js @@ -5,7 +5,7 @@ OC.L10N.register( "Deleted files" : "Fichiers supprimés", "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Dossiers et fichiers supprimés dans la corbeille (peuvent expirer pendant l'export s'il reste peu d'espace disque)", "This application enables people to restore files that were deleted from the system." : "Cette application permet aux personnes de restaurer des fichiers qui ont été supprimés du système.", - "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Cette application permet aux personnes de restaurer les fichiers qui ont été supprimés du système. Il affiche une liste de fichiers supprimés dans l'interface Web et dispose d'options pour restaurer ces fichiers supprimés dans les dossiers de fichiers des personnes ou les supprimer définitivement du système. La restauration d'un fichier restaure également les versions de fichiers associées, si l'application de versions est activée. Lorsqu'un fichier est supprimé d'un partage, il peut être restauré de la même manière, bien qu'il ne soit plus partagé. Par défaut, ces fichiers restent dans la corbeille pendant 30 jours.\n\nPour empêcher un compte de manquer d'espace disque, l'application Fichiers supprimés n'utilisera pas plus de 50 % du quota gratuit actuellement disponible pour les fichiers supprimés. Si les fichiers supprimés dépassent cette limite, l'application supprime les fichiers les plus anciens jusqu'à ce qu'elle soit inférieure à cette limite. Plus d'informations sont disponibles dans la documentation Fichiers supprimés.", + "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Cette application permet aux personnes de restaurer les fichiers qui ont été supprimés du système. Il affiche une liste de fichiers supprimés dans l'interface Web et dispose d'options pour restaurer ces fichiers supprimés dans les dossiers de fichiers des personnes ou les supprimer définitivement du système. La restauration d'un fichier restaure également les versions de fichiers associées, si l'application de versions est activée. Lorsqu'un fichier est supprimé d'un partage, il peut être restauré de la même manière, bien qu'il ne soit plus partagé. Par défaut, ces fichiers restent dans la corbeille pendant 30 jours.\n\nPour empêcher un compte de manquer d'espace disque, l'application \"Fichiers supprimés\" n'utilisera pas plus de 50 % du quota actuellement disponible pour les fichiers supprimés. Si les fichiers supprimés dépassent cette limite, l'application supprime les fichiers les plus anciens jusqu'à ce qu'elle soit inférieure à cette limite. Plus d'informations sont disponibles dans la documentation Fichiers supprimés.", "Restore" : "Restaurer", "Empty deleted files" : "Vider les fichiers supprimés", "Confirm permanent deletion" : "Confirmer la suppression définitive", diff --git a/apps/files_trashbin/l10n/fr.json b/apps/files_trashbin/l10n/fr.json index e3f17f80b64..2c27f497191 100644 --- a/apps/files_trashbin/l10n/fr.json +++ b/apps/files_trashbin/l10n/fr.json @@ -3,7 +3,7 @@ "Deleted files" : "Fichiers supprimés", "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Dossiers et fichiers supprimés dans la corbeille (peuvent expirer pendant l'export s'il reste peu d'espace disque)", "This application enables people to restore files that were deleted from the system." : "Cette application permet aux personnes de restaurer des fichiers qui ont été supprimés du système.", - "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Cette application permet aux personnes de restaurer les fichiers qui ont été supprimés du système. Il affiche une liste de fichiers supprimés dans l'interface Web et dispose d'options pour restaurer ces fichiers supprimés dans les dossiers de fichiers des personnes ou les supprimer définitivement du système. La restauration d'un fichier restaure également les versions de fichiers associées, si l'application de versions est activée. Lorsqu'un fichier est supprimé d'un partage, il peut être restauré de la même manière, bien qu'il ne soit plus partagé. Par défaut, ces fichiers restent dans la corbeille pendant 30 jours.\n\nPour empêcher un compte de manquer d'espace disque, l'application Fichiers supprimés n'utilisera pas plus de 50 % du quota gratuit actuellement disponible pour les fichiers supprimés. Si les fichiers supprimés dépassent cette limite, l'application supprime les fichiers les plus anciens jusqu'à ce qu'elle soit inférieure à cette limite. Plus d'informations sont disponibles dans la documentation Fichiers supprimés.", + "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Cette application permet aux personnes de restaurer les fichiers qui ont été supprimés du système. Il affiche une liste de fichiers supprimés dans l'interface Web et dispose d'options pour restaurer ces fichiers supprimés dans les dossiers de fichiers des personnes ou les supprimer définitivement du système. La restauration d'un fichier restaure également les versions de fichiers associées, si l'application de versions est activée. Lorsqu'un fichier est supprimé d'un partage, il peut être restauré de la même manière, bien qu'il ne soit plus partagé. Par défaut, ces fichiers restent dans la corbeille pendant 30 jours.\n\nPour empêcher un compte de manquer d'espace disque, l'application \"Fichiers supprimés\" n'utilisera pas plus de 50 % du quota actuellement disponible pour les fichiers supprimés. Si les fichiers supprimés dépassent cette limite, l'application supprime les fichiers les plus anciens jusqu'à ce qu'elle soit inférieure à cette limite. Plus d'informations sont disponibles dans la documentation Fichiers supprimés.", "Restore" : "Restaurer", "Empty deleted files" : "Vider les fichiers supprimés", "Confirm permanent deletion" : "Confirmer la suppression définitive", diff --git a/apps/files_versions/l10n/fr.js b/apps/files_versions/l10n/fr.js index 34d2e110a98..88e5299734e 100644 --- a/apps/files_versions/l10n/fr.js +++ b/apps/files_versions/l10n/fr.js @@ -23,6 +23,7 @@ OC.L10N.register( "Version restored" : "Version restaurée", "Could not restore version" : "Impossible de restaurer la version", "Could not set version label" : "Impossible de définir l'étiquette de version", - "Could not delete version" : "Impossible de supprimer la version" + "Could not delete version" : "Impossible de supprimer la version", + "File versions" : "Versions des fichiers" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files_versions/l10n/fr.json b/apps/files_versions/l10n/fr.json index 3e5343e93dc..e59d1f3e59c 100644 --- a/apps/files_versions/l10n/fr.json +++ b/apps/files_versions/l10n/fr.json @@ -21,6 +21,7 @@ "Version restored" : "Version restaurée", "Could not restore version" : "Impossible de restaurer la version", "Could not set version label" : "Impossible de définir l'étiquette de version", - "Could not delete version" : "Impossible de supprimer la version" + "Could not delete version" : "Impossible de supprimer la version", + "File versions" : "Versions des fichiers" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files_versions/lib/Storage.php b/apps/files_versions/lib/Storage.php index 19e7dd598ae..4b58d721583 100644 --- a/apps/files_versions/lib/Storage.php +++ b/apps/files_versions/lib/Storage.php @@ -23,6 +23,7 @@ use OCA\Files_Versions\Versions\IVersionManager; use OCP\AppFramework\Db\DoesNotExistException; use OCP\Command\IBus; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files; use OCP\Files\FileInfo; use OCP\Files\Folder; use OCP\Files\IMimeTypeDetector; @@ -32,6 +33,7 @@ use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; use OCP\Files\Search\ISearchBinaryOperator; use OCP\Files\Search\ISearchComparison; +use OCP\Files\Storage\IWriteStreamStorage; use OCP\Files\StorageInvalidException; use OCP\Files\StorageNotAvailableException; use OCP\IURLGenerator; @@ -416,12 +418,25 @@ class Storage { try { // TODO add a proper way of overwriting a file while maintaining file ids - if ($storage1->instanceOfStorage('\OC\Files\ObjectStore\ObjectStoreStorage') || $storage2->instanceOfStorage('\OC\Files\ObjectStore\ObjectStoreStorage')) { + if ($storage1->instanceOfStorage(\OC\Files\ObjectStore\ObjectStoreStorage::class) + || $storage2->instanceOfStorage(\OC\Files\ObjectStore\ObjectStoreStorage::class) + ) { $source = $storage1->fopen($internalPath1, 'r'); - $target = $storage2->fopen($internalPath2, 'w'); - [, $result] = \OC_Helper::streamCopy($source, $target); - fclose($source); - fclose($target); + $result = $source !== false; + if ($result) { + if ($storage2->instanceOfStorage(IWriteStreamStorage::class)) { + /** @var IWriteStreamStorage $storage2 */ + $storage2->writeStream($internalPath2, $source); + } else { + $target = $storage2->fopen($internalPath2, 'w'); + $result = $target !== false; + if ($target !== false) { + [, $result] = Files::streamCopy($source, $target, true); + fclose($target); + } + } + fclose($source); + } if ($result !== false) { $storage1->unlink($internalPath1); diff --git a/apps/provisioning_api/tests/CapabilitiesTest.php b/apps/provisioning_api/tests/CapabilitiesTest.php index e3c14f37ed7..67a0335829c 100644 --- a/apps/provisioning_api/tests/CapabilitiesTest.php +++ b/apps/provisioning_api/tests/CapabilitiesTest.php @@ -1,9 +1,11 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Provisioning_API\Tests\unit; +namespace OCA\Provisioning_API\Tests; use OCA\FederatedFileSharing\FederatedShareProvider; use OCA\Provisioning_API\Capabilities; @@ -21,11 +23,8 @@ use Test\TestCase; */ class CapabilitiesTest extends TestCase { - /** @var Capabilities */ - protected $capabilities; - - /** @var IAppManager|MockObject */ - protected $appManager; + protected IAppManager&MockObject $appManager; + protected Capabilities $capabilities; public function setUp(): void { parent::setUp(); @@ -38,7 +37,7 @@ class CapabilitiesTest extends TestCase { ->willReturn('1.12'); } - public function getCapabilitiesProvider() { + public static function getCapabilitiesProvider(): array { return [ [true, false, false, true, false], [true, true, false, true, false], @@ -52,7 +51,7 @@ class CapabilitiesTest extends TestCase { /** * @dataProvider getCapabilitiesProvider */ - public function testGetCapabilities($federationAppEnabled, $federatedFileSharingAppEnabled, $lookupServerEnabled, $expectedFederatedScopeEnabled, $expectedPublishedScopeEnabled): void { + public function testGetCapabilities(bool $federationAppEnabled, bool $federatedFileSharingAppEnabled, bool $lookupServerEnabled, bool $expectedFederatedScopeEnabled, bool $expectedPublishedScopeEnabled): void { $this->appManager->expects($this->any()) ->method('isEnabledForUser') ->will($this->returnValueMap([ diff --git a/apps/provisioning_api/tests/Controller/AppConfigControllerTest.php b/apps/provisioning_api/tests/Controller/AppConfigControllerTest.php index 41739b6283f..3d2c1645d25 100644 --- a/apps/provisioning_api/tests/Controller/AppConfigControllerTest.php +++ b/apps/provisioning_api/tests/Controller/AppConfigControllerTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later @@ -30,7 +32,6 @@ use function json_encode; * @package OCA\Provisioning_API\Tests */ class AppConfigControllerTest extends TestCase { - private IAppConfig&MockObject $appConfig; private IUserSession&MockObject $userSession; private IL10N&MockObject $l10n; @@ -51,7 +52,7 @@ class AppConfigControllerTest extends TestCase { /** * @param string[] $methods - * @return AppConfigController|\PHPUnit\Framework\MockObject\MockObject + * @return AppConfigController|MockObject */ protected function getInstance(array $methods = []) { $request = $this->createMock(IRequest::class); @@ -79,7 +80,7 @@ class AppConfigControllerTest extends TestCase { $this->settingManager, $this->appManager, ]) - ->setMethods($methods) + ->onlyMethods($methods) ->getMock(); } } @@ -95,7 +96,7 @@ class AppConfigControllerTest extends TestCase { $this->assertEquals(['data' => ['apps']], $result->getData()); } - public function dataGetKeys() { + public static function dataGetKeys(): array { return [ ['app1 ', null, new \InvalidArgumentException('error'), Http::STATUS_FORBIDDEN], ['app2', ['keys'], null, Http::STATUS_OK], @@ -104,12 +105,8 @@ class AppConfigControllerTest extends TestCase { /** * @dataProvider dataGetKeys - * @param string $app - * @param array|null $keys - * @param \Exception|null $throws - * @param int $status */ - public function testGetKeys($app, $keys, $throws, $status): void { + public function testGetKeys(string $app, ?array $keys, ?\Throwable $throws, int $status): void { $api = $this->getInstance(['verifyAppId']); if ($throws instanceof \Exception) { $api->expects($this->once()) @@ -140,7 +137,7 @@ class AppConfigControllerTest extends TestCase { } } - public function dataGetValue() { + public static function dataGetValue(): array { return [ ['app1', 'key', 'default', null, new \InvalidArgumentException('error'), Http::STATUS_FORBIDDEN], ['app2', 'key', 'default', 'return', null, Http::STATUS_OK], @@ -149,14 +146,8 @@ class AppConfigControllerTest extends TestCase { /** * @dataProvider dataGetValue - * @param string $app - * @param string|null $key - * @param string|null $default - * @param string|null $return - * @param \Exception|null $throws - * @param int $status */ - public function testGetValue($app, $key, $default, $return, $throws, $status): void { + public function testGetValue(string $app, string $key, string $default, ?string $return, ?\Throwable $throws, int $status): void { $api = $this->getInstance(['verifyAppId']); if ($throws instanceof \Exception) { $api->expects($this->once()) @@ -184,7 +175,7 @@ class AppConfigControllerTest extends TestCase { } } - public function dataSetValue() { + public static function dataSetValue(): array { return [ ['app1', 'key', 'default', new \InvalidArgumentException('error1'), null, Http::STATUS_FORBIDDEN], ['app2', 'key', 'default', null, new \InvalidArgumentException('error2'), Http::STATUS_FORBIDDEN], @@ -201,14 +192,8 @@ class AppConfigControllerTest extends TestCase { /** * @dataProvider dataSetValue - * @param string $app - * @param string|null $key - * @param string|null $value - * @param \Exception|null $appThrows - * @param \Exception|null $keyThrows - * @param int|\Throwable $status */ - public function testSetValue($app, $key, $value, $appThrows, $keyThrows, $status, int|\Throwable $type = IAppConfig::VALUE_MIXED): void { + public function testSetValue(string $app, string $key, string $value, ?\Throwable $appThrows, ?\Throwable $keyThrows, int $status, int|\Throwable $type = IAppConfig::VALUE_MIXED): void { $adminUser = $this->createMock(IUser::class); $adminUser->expects($this->once()) ->method('getUid') @@ -297,7 +282,7 @@ class AppConfigControllerTest extends TestCase { } } - public function dataDeleteValue() { + public static function dataDeleteValue(): array { return [ ['app1', 'key', new \InvalidArgumentException('error1'), null, Http::STATUS_FORBIDDEN], ['app2', 'key', null, new \InvalidArgumentException('error2'), Http::STATUS_FORBIDDEN], @@ -307,13 +292,8 @@ class AppConfigControllerTest extends TestCase { /** * @dataProvider dataDeleteValue - * @param string $app - * @param string|null $key - * @param \Exception|null $appThrows - * @param \Exception|null $keyThrows - * @param int $status */ - public function testDeleteValue($app, $key, $appThrows, $keyThrows, $status): void { + public function testDeleteValue(string $app, string $key, ?\Throwable $appThrows, ?\Throwable $keyThrows, int $status): void { $api = $this->getInstance(['verifyAppId', 'verifyConfigKey']); if ($appThrows instanceof \Exception) { $api->expects($this->once()) @@ -367,7 +347,7 @@ class AppConfigControllerTest extends TestCase { $this->addToAssertionCount(1); } - public function dataVerifyAppIdThrows() { + public static function dataVerifyAppIdThrows(): array { return [ ['activity..'], ['activity/'], @@ -378,16 +358,15 @@ class AppConfigControllerTest extends TestCase { /** * @dataProvider dataVerifyAppIdThrows - * @param string $app */ - public function testVerifyAppIdThrows($app): void { + public function testVerifyAppIdThrows(string $app): void { $this->expectException(\InvalidArgumentException::class); $api = $this->getInstance(); $this->invokePrivate($api, 'verifyAppId', [$app]); } - public function dataVerifyConfigKey() { + public static function dataVerifyConfigKey(): array { return [ ['activity', 'abc', ''], ['dav', 'public_route', ''], @@ -398,17 +377,14 @@ class AppConfigControllerTest extends TestCase { /** * @dataProvider dataVerifyConfigKey - * @param string $app - * @param string $key - * @param string $value */ - public function testVerifyConfigKey($app, $key, $value): void { + public function testVerifyConfigKey(string $app, string $key, string $value): void { $api = $this->getInstance(); $this->invokePrivate($api, 'verifyConfigKey', [$app, $key, $value]); $this->addToAssertionCount(1); } - public function dataVerifyConfigKeyThrows() { + public static function dataVerifyConfigKeyThrows(): array { return [ ['activity', 'installed_version', ''], ['calendar', 'enabled', ''], @@ -424,11 +400,8 @@ class AppConfigControllerTest extends TestCase { /** * @dataProvider dataVerifyConfigKeyThrows - * @param string $app - * @param string $key - * @param string $value */ - public function testVerifyConfigKeyThrows($app, $key, $value): void { + public function testVerifyConfigKeyThrows(string $app, string $key, string $value): void { $this->expectException(\InvalidArgumentException::class); $api = $this->getInstance(); diff --git a/apps/provisioning_api/tests/Controller/AppsControllerTest.php b/apps/provisioning_api/tests/Controller/AppsControllerTest.php index bbcabfddd8b..f56be7c4c36 100644 --- a/apps/provisioning_api/tests/Controller/AppsControllerTest.php +++ b/apps/provisioning_api/tests/Controller/AppsControllerTest.php @@ -24,12 +24,9 @@ use OCP\Server; * @package OCA\Provisioning_API\Tests */ class AppsControllerTest extends TestCase { - /** @var IAppManager */ - private $appManager; - /** @var AppsController */ - private $api; - /** @var IUserSession */ - private $userSession; + private IAppManager $appManager; + private AppsController $api; + private IUserSession $userSession; protected function setUp(): void { parent::setUp(); @@ -38,9 +35,7 @@ class AppsControllerTest extends TestCase { $this->groupManager = Server::get(IGroupManager::class); $this->userSession = Server::get(IUserSession::class); - $request = $this->getMockBuilder(IRequest::class) - ->disableOriginalConstructor() - ->getMock(); + $request = $this->createMock(IRequest::class); $this->api = new AppsController( 'provisioning_api', @@ -96,7 +91,7 @@ class AppsControllerTest extends TestCase { $this->assertEquals(count($disabled), count($data['apps'])); } - + public function testGetAppsInvalidFilter(): void { $this->expectException(OCSException::class); $this->expectExceptionCode(101); diff --git a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php index 29b098429e8..e4f8b3af183 100644 --- a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php +++ b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php @@ -22,30 +22,20 @@ use OCP\IUserManager; use OCP\IUserSession; use OCP\L10N\IFactory; use OCP\UserInterface; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; class GroupsControllerTest extends \Test\TestCase { - /** @var IRequest|\PHPUnit\Framework\MockObject\MockObject */ - protected $request; - /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $userManager; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - protected $config; - /** @var Manager|\PHPUnit\Framework\MockObject\MockObject */ - protected $groupManager; - /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */ - protected $userSession; - /** @var IAccountManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $accountManager; - /** @var ISubAdmin|\PHPUnit\Framework\MockObject\MockObject */ - protected $subAdminManager; - /** @var IFactory|\PHPUnit\Framework\MockObject\MockObject */ - protected $l10nFactory; - /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */ - protected $logger; - - /** @var GroupsController|\PHPUnit\Framework\MockObject\MockObject */ - protected $api; + protected IRequest&MockObject $request; + protected IUserManager&MockObject $userManager; + protected IConfig&MockObject $config; + protected Manager&MockObject $groupManager; + protected IUserSession&MockObject $userSession; + protected IAccountManager&MockObject $accountManager; + protected ISubAdmin&MockObject $subAdminManager; + protected IFactory&MockObject $l10nFactory; + protected LoggerInterface&MockObject $logger; + protected GroupsController&MockObject $api; private IRootFolder $rootFolder; @@ -82,16 +72,12 @@ class GroupsControllerTest extends \Test\TestCase { $this->rootFolder, $this->logger ]) - ->setMethods(['fillStorageInfo']) + ->onlyMethods(['fillStorageInfo']) ->getMock(); } - /** - * @param string $gid - * @return IGroup|\PHPUnit\Framework\MockObject\MockObject - */ - private function createGroup($gid) { - $group = $this->getMockBuilder('\OCP\IGroup')->disableOriginalConstructor()->getMock(); + private function createGroup(string $gid): IGroup&MockObject { + $group = $this->createMock(\OCP\IGroup::class); $group ->method('getGID') ->willReturn($gid); @@ -116,7 +102,7 @@ class GroupsControllerTest extends \Test\TestCase { /** * @param string $uid - * @return IUser|\PHPUnit\Framework\MockObject\MockObject + * @return IUser&MockObject */ private function createUser($uid) { $user = $this->getMockBuilder(IUser::class)->disableOriginalConstructor()->getMock(); @@ -165,7 +151,7 @@ class GroupsControllerTest extends \Test\TestCase { }); } - public function dataGetGroups() { + public static function dataGetGroups(): array { return [ [null, 0, 0], ['foo', 0, 0], @@ -177,12 +163,8 @@ class GroupsControllerTest extends \Test\TestCase { /** * @dataProvider dataGetGroups - * - * @param string|null $search - * @param int|null $limit - * @param int|null $offset */ - public function testGetGroups($search, $limit, $offset): void { + public function testGetGroups(?string $search, int $limit, int $offset): void { $groups = [$this->createGroup('group1'), $this->createGroup('group2')]; $search = $search === null ? '' : $search; @@ -509,7 +491,7 @@ class GroupsControllerTest extends \Test\TestCase { ->method('getUserGroups') ->willReturn([$group]); - /** @var \PHPUnit\Framework\MockObject\MockObject */ + /** @var MockObject */ $this->subAdminManager->expects($this->any()) ->method('isSubAdminOfGroup') ->willReturn(false); @@ -554,7 +536,7 @@ class GroupsControllerTest extends \Test\TestCase { ->method('getUserGroups') ->willReturn([$group]); - /** @var \PHPUnit\Framework\MockObject\MockObject */ + /** @var MockObject */ $this->subAdminManager->expects($this->any()) ->method('isSubAdminOfGroup') ->willReturn(false); diff --git a/apps/provisioning_api/tests/Controller/UsersControllerTest.php b/apps/provisioning_api/tests/Controller/UsersControllerTest.php index 7d4f99356b3..80d6d0f6152 100644 --- a/apps/provisioning_api/tests/Controller/UsersControllerTest.php +++ b/apps/provisioning_api/tests/Controller/UsersControllerTest.php @@ -46,41 +46,24 @@ use RuntimeException; use Test\TestCase; class UsersControllerTest extends TestCase { - /** @var IUserManager|MockObject */ - protected $userManager; - /** @var IConfig|MockObject */ - protected $config; - /** @var Manager|MockObject */ - protected $groupManager; - /** @var IUserSession|MockObject */ - protected $userSession; - /** @var LoggerInterface|MockObject */ - protected $logger; - /** @var UsersController|MockObject */ - protected $api; - /** @var IAccountManager|MockObject */ - protected $accountManager; - /** @var ISubAdmin|MockObject */ - protected $subAdminManager; - /** @var IURLGenerator|MockObject */ - protected $urlGenerator; - /** @var IRequest|MockObject */ - protected $request; - /** @var IFactory|MockObject */ - private $l10nFactory; - /** @var NewUserMailHelper|MockObject */ - private $newUserMailHelper; - /** @var ISecureRandom|MockObject */ - private $secureRandom; - /** @var RemoteWipe|MockObject */ - private $remoteWipe; - /** @var KnownUserService|MockObject */ - private $knownUserService; - /** @var IEventDispatcher|MockObject */ - private $eventDispatcher; + protected IUserManager&MockObject $userManager; + protected IConfig&MockObject $config; + protected Manager&MockObject $groupManager; + protected IUserSession&MockObject $userSession; + protected LoggerInterface&MockObject $logger; + protected UsersController&MockObject $api; + protected IAccountManager&MockObject $accountManager; + protected ISubAdmin&MockObject $subAdminManager; + protected IURLGenerator&MockObject $urlGenerator; + protected IRequest&MockObject $request; + private IFactory&MockObject $l10nFactory; + private NewUserMailHelper&MockObject $newUserMailHelper; + private ISecureRandom&MockObject $secureRandom; + private RemoteWipe&MockObject $remoteWipe; + private KnownUserService&MockObject $knownUserService; + private IEventDispatcher&MockObject $eventDispatcher; private IRootFolder $rootFolder; - /** @var IPhoneNumberUtil */ - private $phoneNumberUtil; + private IPhoneNumberUtil $phoneNumberUtil; protected function setUp(): void { parent::setUp(); @@ -449,10 +432,6 @@ class UsersControllerTest extends TestCase { $this->groupManager ->expects($this->exactly(2)) ->method('groupExists') - ->withConsecutive( - ['ExistingGroup'], - ['NonExistingGroup'] - ) ->willReturnMap([ ['ExistingGroup', true], ['NonExistingGroup', false] @@ -798,18 +777,20 @@ class UsersControllerTest extends TestCase { ->method('get') ->with('ExistingGroup') ->willReturn($group); + + $calls = [ + ['Successful addUser call with userid: NewUser', ['app' => 'ocs_api']], + ['Added userid NewUser to group ExistingGroup', ['app' => 'ocs_api']], + ]; $this->logger ->expects($this->exactly(2)) ->method('info') - ->withConsecutive( - ['Successful addUser call with userid: NewUser', ['app' => 'ocs_api']], - ['Added userid NewUser to group ExistingGroup', ['app' => 'ocs_api']] - ); + ->willReturnCallback(function () use (&$calls) { + $expected = array_shift($calls); + $this->assertEquals($expected, func_get_args()); + }); - $this->assertTrue(key_exists( - 'id', - $this->api->addUser('NewUser', 'PasswordOfTheNewUser', '', '', ['ExistingGroup'])->getData() - )); + $this->assertArrayHasKey('id', $this->api->addUser('NewUser', 'PasswordOfTheNewUser', '', '', ['ExistingGroup'])->getData()); } @@ -966,11 +947,10 @@ class UsersControllerTest extends TestCase { $this->groupManager ->expects($this->exactly(2)) ->method('groupExists') - ->withConsecutive( - ['ExistingGroup1'], - ['ExistingGroup2'] - ) - ->willReturn(true); + ->willReturnMap([ + ['ExistingGroup1', true], + ['ExistingGroup2', true] + ]); $user = $this->getMockBuilder(IUser::class) ->disableOriginalConstructor() ->getMock(); @@ -996,24 +976,23 @@ class UsersControllerTest extends TestCase { $this->groupManager ->expects($this->exactly(4)) ->method('get') - ->withConsecutive( - ['ExistingGroup1'], - ['ExistingGroup2'], - ['ExistingGroup1'], - ['ExistingGroup2'] - ) ->willReturnMap([ ['ExistingGroup1', $existingGroup1], ['ExistingGroup2', $existingGroup2] ]); + + $calls = [ + ['Successful addUser call with userid: NewUser', ['app' => 'ocs_api']], + ['Added userid NewUser to group ExistingGroup1', ['app' => 'ocs_api']], + ['Added userid NewUser to group ExistingGroup2', ['app' => 'ocs_api']], + ]; $this->logger ->expects($this->exactly(3)) ->method('info') - ->withConsecutive( - ['Successful addUser call with userid: NewUser', ['app' => 'ocs_api']], - ['Added userid NewUser to group ExistingGroup1', ['app' => 'ocs_api']], - ['Added userid NewUser to group ExistingGroup2', ['app' => 'ocs_api']] - ); + ->willReturnCallback(function () use (&$calls) { + $expected = array_shift($calls); + $this->assertEquals($expected, func_get_args()); + }); $subAdminManager = $this->getMockBuilder('OC\SubAdmin') ->disableOriginalConstructor()->getMock(); $this->groupManager @@ -1023,16 +1002,12 @@ class UsersControllerTest extends TestCase { $subAdminManager ->expects($this->exactly(2)) ->method('isSubAdminOfGroup') - ->withConsecutive( - [$loggedInUser, $existingGroup1], - [$loggedInUser, $existingGroup2] - ) - ->willReturn(true); + ->willReturnMap([ + [$loggedInUser, $existingGroup1, true], + [$loggedInUser, $existingGroup2, true], + ]); - $this->assertTrue(key_exists( - 'id', - $this->api->addUser('NewUser', 'PasswordOfTheNewUser', '', '', ['ExistingGroup1', 'ExistingGroup2'])->getData() - )); + $this->assertArrayHasKey('id', $this->api->addUser('NewUser', 'PasswordOfTheNewUser', '', '', ['ExistingGroup1', 'ExistingGroup2'])->getData()); } @@ -1541,7 +1516,7 @@ class UsersControllerTest extends TestCase { $this->assertEquals($expected, $this->invokePrivate($this->api, 'getUserData', ['UID'])); } - public function dataSearchByPhoneNumbers(): array { + public static function dataSearchByPhoneNumbers(): array { return [ 'Invalid country' => ['Not a country code', ['12345' => ['NaN']], 400, null, null, []], 'No number to search' => ['DE', ['12345' => ['NaN']], 200, null, null, []], @@ -1556,10 +1531,6 @@ class UsersControllerTest extends TestCase { /** * @dataProvider dataSearchByPhoneNumbers - * @param string $location - * @param array $search - * @param int $status - * @param array $expected */ public function testSearchByPhoneNumbers(string $location, array $search, int $status, ?array $searchUsers, ?array $userMatches, array $expected): void { $knownTo = 'knownTo'; @@ -1870,7 +1841,7 @@ class UsersControllerTest extends TestCase { $this->api->editUser('UserToEdit', 'email', 'demo.org'); } - public function selfEditChangePropertyProvider() { + public static function selfEditChangePropertyProvider(): array { return [ [IAccountManager::PROPERTY_TWITTER, '@oldtwitter', '@newtwitter'], [IAccountManager::PROPERTY_FEDIVERSE, '@oldFediverse@floss.social', '@newFediverse@floss.social'], @@ -2294,7 +2265,7 @@ class UsersControllerTest extends TestCase { $this->assertEquals([], $this->api->editUser('UserToEdit', 'language', 'de')->getData()); } - public function dataEditUserSelfEditChangeLanguageButForced() { + public static function dataEditUserSelfEditChangeLanguageButForced(): array { return [ ['de'], [true], @@ -3942,11 +3913,10 @@ class UsersControllerTest extends TestCase { $api->expects($this->exactly(2)) ->method('getUserData') - ->withConsecutive( - ['uid', false], - ['currentuser', true], - ) - ->willReturn($expected); + ->willReturnMap([ + ['uid', false, $expected], + ['currentuser', true, $expected], + ]); $this->assertSame($expected, $api->getUser('uid')->getData()); @@ -4263,7 +4233,7 @@ class UsersControllerTest extends TestCase { } - public function dataGetEditableFields() { + public static function dataGetEditableFields(): array { return [ [false, true, ISetDisplayNameBackend::class, [ IAccountManager::PROPERTY_EMAIL, @@ -4388,10 +4358,6 @@ class UsersControllerTest extends TestCase { /** * @dataProvider dataGetEditableFields - * - * @param bool $allowedToChangeDisplayName - * @param string $userBackend - * @param array $expected */ public function testGetEditableFields(bool $allowedToChangeDisplayName, bool $allowedToChangeEmail, string $userBackend, array $expected): void { $this->config->method('getSystemValue')->willReturnCallback(fn (string $key, mixed $default) => match ($key) { diff --git a/apps/provisioning_api/tests/Middleware/ProvisioningApiMiddlewareTest.php b/apps/provisioning_api/tests/Middleware/ProvisioningApiMiddlewareTest.php index d097febb04f..d40aab90d66 100644 --- a/apps/provisioning_api/tests/Middleware/ProvisioningApiMiddlewareTest.php +++ b/apps/provisioning_api/tests/Middleware/ProvisioningApiMiddlewareTest.php @@ -24,34 +24,29 @@ class ProvisioningApiMiddlewareTest extends TestCase { $this->reflector = $this->createMock(IControllerMethodReflector::class); } - public function dataAnnotation() { + public static function dataAnnotation(): array { return [ [false, false, false, false, false], - [false, false, true, false, false], - [false, true, true, false, false], - [ true, false, false, false, true], - [ true, false, true, false, false], - [ true, true, false, false, false], - [ true, true, true, false, false], + [false, false, true, false, false], + [false, true, true, false, false], + [true, false, false, false, true], + [true, false, true, false, false], + [true, true, false, false, false], + [true, true, true, false, false], [false, false, false, true, false], - [false, false, true, true, false], - [false, true, true, true, false], - [ true, false, false, true, false], - [ true, false, true, true, false], - [ true, true, false, true, false], - [ true, true, true, true, false], + [false, false, true, true, false], + [false, true, true, true, false], + [true, false, false, true, false], + [true, false, true, true, false], + [true, true, false, true, false], + [true, true, true, true, false], ]; } /** * @dataProvider dataAnnotation - * - * @param bool $subadminRequired - * @param bool $isAdmin - * @param bool $isSubAdmin - * @param bool $shouldThrowException */ - public function testBeforeController($subadminRequired, $isAdmin, $isSubAdmin, $hasSettingAuthorizationAnnotation, $shouldThrowException): void { + public function testBeforeController(bool $subadminRequired, bool $isAdmin, bool $isSubAdmin, bool $hasSettingAuthorizationAnnotation, bool $shouldThrowException): void { $middleware = new ProvisioningApiMiddleware( $this->reflector, $isAdmin, @@ -80,7 +75,7 @@ class ProvisioningApiMiddlewareTest extends TestCase { } } - public function dataAfterException() { + public static function dataAfterException(): array { return [ [new NotSubAdminException(), false], [new \Exception('test', 42), true], @@ -89,11 +84,8 @@ class ProvisioningApiMiddlewareTest extends TestCase { /** * @dataProvider dataAfterException - * - * @param \Exception $e - * @param bool $forwared */ - public function testAfterException(\Exception $exception, $forwared): void { + public function testAfterException(\Exception $exception, bool $forwared): void { $middleware = new ProvisioningApiMiddleware( $this->reflector, false, diff --git a/apps/settings/l10n/de.js b/apps/settings/l10n/de.js index 66150d7a47b..1b90e97094c 100644 --- a/apps/settings/l10n/de.js +++ b/apps/settings/l10n/de.js @@ -122,7 +122,7 @@ OC.L10N.register( "Mobile & desktop" : "Mobil & Desktop", "Email server" : "E-Mail-Server", "Mail Providers" : "E-Mail-Anbieter", - "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Der E-Mail-Provider ermöglicht das Senden von E-Mails direkt über das persönliche E-Mail-Konto des Benutzers. Derzeit ist diese Funktion auf Kalendereinladungen beschränkt. Es erfordert Nextcloud Mail 4.1 und ein E-Mail-Konto in Nextcloud Mail, das mit der E-Mail-Adresse des Benutzers in Nextcloud übereinstimmt.", + "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Der E-Mail-Anbieter ermöglicht das Senden von E-Mails direkt über das persönliche E-Mail-Konto des Benutzers. Derzeit ist diese Funktion auf Kalendereinladungen beschränkt. Es erfordert Nextcloud Mail 4.1 und ein E-Mail-Konto in Nextcloud Mail, das mit der E-Mail-Adresse des Benutzers in Nextcloud übereinstimmt.", "Send emails using" : "E-Mails senden mittels", "User's email account" : "E-Mail-Konto des Benutzers", "System email account" : "System-E-Mail-Konto", @@ -371,14 +371,14 @@ OC.L10N.register( "Allow users to set custom share link tokens" : "Benutzern erlauben, benutzerdefinierte Freigabelink-Token festzulegen", "Shares with custom tokens will continue to be accessible after this setting has been disabled" : "Freigaben mit benutzerdefinierten Token sind auch noch nach der Deaktivierung dieser Einstellung zugänglich", "Shares with guessable tokens may be accessed easily" : "Auf Freigaben mit erratbaren Token kann u. U. leicht zugegriffen werden", - "Limit sharing based on groups" : "Freigeben basierend auf Gruppen beschränken", + "Limit sharing based on groups" : "Freigaben nach Gruppen einschränken", "Allow sharing for everyone (default)" : "Teilen für alle erlauben (Standard)", - "Exclude some groups from sharing" : "Einige Gruppen vom Teilen ausschließen", - "Limit sharing to some groups" : "Teilen auf einige Gruppen beschränken", - "Groups allowed to share" : "Gruppen, die teilen dürfen", + "Exclude some groups from sharing" : "Bestimmte Gruppen vom Teilen ausschließen", + "Limit sharing to some groups" : "Teilen für bestimmte Gruppen erlauben", + "Groups allowed to share" : "Für die Linkfreigabe zugelassene Gruppen", "Groups excluded from sharing" : "Von der Linkfreigabe ausgeschlossene Gruppen", "Not allowed groups will still be able to receive shares, but not to initiate them." : "Nicht zugelassene Gruppen können zwar weiterhin Freigaben empfangen, aber nicht erstellen.", - "Set default expiration date for internal shares" : "Lege das Standardablaufdatum für interne Freigaben fest", + "Set default expiration date for internal shares" : "Standardablaufdatum für interne Freigaben festlegen", "Enforce expiration date" : "Ablaufdatum erzwingen", "Default expiration time of new shares in days" : "Standardablaufzeit neuer Freigaben in Tagen", "Expire shares after x days" : "Freigaben laufen nach x Tagen ab", @@ -393,7 +393,7 @@ OC.L10N.register( "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Wenn die Autovervollständigung \"gleiche Gruppe\" und \"Rufnummernintegration\" aktiviert ist, reicht eine Übereinstimmung in einem der beiden Bereiche aus, um den Benutzer anzuzeigen.", "Restrict account name autocompletion and system address book access to users within the same groups" : "Die automatische Vervollständigung von Kontonamen und den Zugriff auf das Systemadressbuch auf Benutzer innerhalb derselben Gruppen beschränken", "Restrict account name autocompletion to users based on phone number integration" : "Die automatische Vervollständigung des Kontonamens auf Benutzer beschränken, die auf der Integration von Telefonnummern basieren.", - "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Ermöglicht die automatische Vervollständigung, wenn der vollständigen Namen oder die E-Mail-Adresse eingeben wird (ignoriert fehlende Telefonbuchübereinstimmungen und bei gleicher Gruppenzugehörigkeit)", + "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Die automatische Vervollständigung ermöglichen, wenn der vollständige Name oder die E-Mail-Adresse eingegeben wird (ignoriert fehlende Telefonbuchübereinstimmungen und gleiche Gruppenzugehörigkeit)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Zeige Haftungsausschluss auf der öffentlichen Upload-Seite (Wird nur gezeigt, wenn die Dateiliste nicht angezeigt wird.) ", "Disclaimer text" : "Haftungsausschlusstext", "This text will be shown on the public link upload page when the file list is hidden." : "Dieser Text wird auf der öffentlichen Upload-Seite angezeigt wenn die Dateiliste nicht angezeigt wird.", @@ -549,7 +549,7 @@ OC.L10N.register( "The cron.php needs to be executed by the system account \"{user}\"." : "Die cron.php muss von dem Systemkonto \"{user}\" ausgeführt werden.", "The PHP POSIX extension is required. See {linkstart}PHP documentation{linkend} for more details." : "Die PHP-POSIX-Erweiterung ist erforderlich. Weitere Einzelheiten hierzu in der {linkstart}PHP-Dokumentation{linkend}.", "Unable to update background job mode" : "Hintergrund-Job-Modus kann nicht aktualisiert werden", - "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Damit der Server ordnungsgemäß funktioniert, ist es wichtig, Hintergrundjobs richtig zu konfigurieren. Cron ist die empfohlene Einstellung. Weitere Informationen finden sich in der Dokumentation.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Damit der Server ordnungsgemäß funktioniert, ist es wichtig, Hintergrund-Aufgaben richtig zu konfigurieren. Cron ist die empfohlene Einstellung. Weitere Informationen finden sich in der Dokumentation.", "Last job execution ran {time}. Something seems wrong." : "Der letzte Job lief {time}. Etwas scheint nicht zu stimmen.", "Last job ran {relativeTime}." : "Der letzte Job lief {relativeTime}.", "Background job did not run yet!" : "Hintergrund-Job wurde bislang nicht ausgeführt!", @@ -870,7 +870,7 @@ OC.L10N.register( "Save" : "Speichern", "Test and verify email settings" : "Testen und überprüfen der E-Mail-Einstellungen", "Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen", - "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Für die Sicherheit und Performance deiner Instanz ist es wichtig, dass alles richtig konfiguriert ist. Um dir dabei zu helfen, werden einige automatische Prüfungen durchgeführt. Weitere Informationen kannst du der verlinkten Dokumentation entnehmen.", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Für die Sicherheit und Leistung deiner Instanz ist es von großer Bedeutung, dass alles richtig konfiguriert ist. Um dich dabei zu unterstützen, werden einige automatische Prüfungen durchgeführt. Weitere Informationen findest du in der verlinkten Dokumentation.", "All checks passed." : "Alle Überprüfungen bestanden.", "There are some errors regarding your setup." : "Es gibt einige Fehler in der Systemkonfiguration.", "There are some warnings regarding your setup." : "Es gibt einige Warnungen in der Systemkonfiguration.", diff --git a/apps/settings/l10n/de.json b/apps/settings/l10n/de.json index c25dbf707bd..19b887b7028 100644 --- a/apps/settings/l10n/de.json +++ b/apps/settings/l10n/de.json @@ -120,7 +120,7 @@ "Mobile & desktop" : "Mobil & Desktop", "Email server" : "E-Mail-Server", "Mail Providers" : "E-Mail-Anbieter", - "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Der E-Mail-Provider ermöglicht das Senden von E-Mails direkt über das persönliche E-Mail-Konto des Benutzers. Derzeit ist diese Funktion auf Kalendereinladungen beschränkt. Es erfordert Nextcloud Mail 4.1 und ein E-Mail-Konto in Nextcloud Mail, das mit der E-Mail-Adresse des Benutzers in Nextcloud übereinstimmt.", + "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Der E-Mail-Anbieter ermöglicht das Senden von E-Mails direkt über das persönliche E-Mail-Konto des Benutzers. Derzeit ist diese Funktion auf Kalendereinladungen beschränkt. Es erfordert Nextcloud Mail 4.1 und ein E-Mail-Konto in Nextcloud Mail, das mit der E-Mail-Adresse des Benutzers in Nextcloud übereinstimmt.", "Send emails using" : "E-Mails senden mittels", "User's email account" : "E-Mail-Konto des Benutzers", "System email account" : "System-E-Mail-Konto", @@ -369,14 +369,14 @@ "Allow users to set custom share link tokens" : "Benutzern erlauben, benutzerdefinierte Freigabelink-Token festzulegen", "Shares with custom tokens will continue to be accessible after this setting has been disabled" : "Freigaben mit benutzerdefinierten Token sind auch noch nach der Deaktivierung dieser Einstellung zugänglich", "Shares with guessable tokens may be accessed easily" : "Auf Freigaben mit erratbaren Token kann u. U. leicht zugegriffen werden", - "Limit sharing based on groups" : "Freigeben basierend auf Gruppen beschränken", + "Limit sharing based on groups" : "Freigaben nach Gruppen einschränken", "Allow sharing for everyone (default)" : "Teilen für alle erlauben (Standard)", - "Exclude some groups from sharing" : "Einige Gruppen vom Teilen ausschließen", - "Limit sharing to some groups" : "Teilen auf einige Gruppen beschränken", - "Groups allowed to share" : "Gruppen, die teilen dürfen", + "Exclude some groups from sharing" : "Bestimmte Gruppen vom Teilen ausschließen", + "Limit sharing to some groups" : "Teilen für bestimmte Gruppen erlauben", + "Groups allowed to share" : "Für die Linkfreigabe zugelassene Gruppen", "Groups excluded from sharing" : "Von der Linkfreigabe ausgeschlossene Gruppen", "Not allowed groups will still be able to receive shares, but not to initiate them." : "Nicht zugelassene Gruppen können zwar weiterhin Freigaben empfangen, aber nicht erstellen.", - "Set default expiration date for internal shares" : "Lege das Standardablaufdatum für interne Freigaben fest", + "Set default expiration date for internal shares" : "Standardablaufdatum für interne Freigaben festlegen", "Enforce expiration date" : "Ablaufdatum erzwingen", "Default expiration time of new shares in days" : "Standardablaufzeit neuer Freigaben in Tagen", "Expire shares after x days" : "Freigaben laufen nach x Tagen ab", @@ -391,7 +391,7 @@ "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Wenn die Autovervollständigung \"gleiche Gruppe\" und \"Rufnummernintegration\" aktiviert ist, reicht eine Übereinstimmung in einem der beiden Bereiche aus, um den Benutzer anzuzeigen.", "Restrict account name autocompletion and system address book access to users within the same groups" : "Die automatische Vervollständigung von Kontonamen und den Zugriff auf das Systemadressbuch auf Benutzer innerhalb derselben Gruppen beschränken", "Restrict account name autocompletion to users based on phone number integration" : "Die automatische Vervollständigung des Kontonamens auf Benutzer beschränken, die auf der Integration von Telefonnummern basieren.", - "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Ermöglicht die automatische Vervollständigung, wenn der vollständigen Namen oder die E-Mail-Adresse eingeben wird (ignoriert fehlende Telefonbuchübereinstimmungen und bei gleicher Gruppenzugehörigkeit)", + "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Die automatische Vervollständigung ermöglichen, wenn der vollständige Name oder die E-Mail-Adresse eingegeben wird (ignoriert fehlende Telefonbuchübereinstimmungen und gleiche Gruppenzugehörigkeit)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Zeige Haftungsausschluss auf der öffentlichen Upload-Seite (Wird nur gezeigt, wenn die Dateiliste nicht angezeigt wird.) ", "Disclaimer text" : "Haftungsausschlusstext", "This text will be shown on the public link upload page when the file list is hidden." : "Dieser Text wird auf der öffentlichen Upload-Seite angezeigt wenn die Dateiliste nicht angezeigt wird.", @@ -547,7 +547,7 @@ "The cron.php needs to be executed by the system account \"{user}\"." : "Die cron.php muss von dem Systemkonto \"{user}\" ausgeführt werden.", "The PHP POSIX extension is required. See {linkstart}PHP documentation{linkend} for more details." : "Die PHP-POSIX-Erweiterung ist erforderlich. Weitere Einzelheiten hierzu in der {linkstart}PHP-Dokumentation{linkend}.", "Unable to update background job mode" : "Hintergrund-Job-Modus kann nicht aktualisiert werden", - "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Damit der Server ordnungsgemäß funktioniert, ist es wichtig, Hintergrundjobs richtig zu konfigurieren. Cron ist die empfohlene Einstellung. Weitere Informationen finden sich in der Dokumentation.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Damit der Server ordnungsgemäß funktioniert, ist es wichtig, Hintergrund-Aufgaben richtig zu konfigurieren. Cron ist die empfohlene Einstellung. Weitere Informationen finden sich in der Dokumentation.", "Last job execution ran {time}. Something seems wrong." : "Der letzte Job lief {time}. Etwas scheint nicht zu stimmen.", "Last job ran {relativeTime}." : "Der letzte Job lief {relativeTime}.", "Background job did not run yet!" : "Hintergrund-Job wurde bislang nicht ausgeführt!", @@ -868,7 +868,7 @@ "Save" : "Speichern", "Test and verify email settings" : "Testen und überprüfen der E-Mail-Einstellungen", "Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen", - "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Für die Sicherheit und Performance deiner Instanz ist es wichtig, dass alles richtig konfiguriert ist. Um dir dabei zu helfen, werden einige automatische Prüfungen durchgeführt. Weitere Informationen kannst du der verlinkten Dokumentation entnehmen.", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Für die Sicherheit und Leistung deiner Instanz ist es von großer Bedeutung, dass alles richtig konfiguriert ist. Um dich dabei zu unterstützen, werden einige automatische Prüfungen durchgeführt. Weitere Informationen findest du in der verlinkten Dokumentation.", "All checks passed." : "Alle Überprüfungen bestanden.", "There are some errors regarding your setup." : "Es gibt einige Fehler in der Systemkonfiguration.", "There are some warnings regarding your setup." : "Es gibt einige Warnungen in der Systemkonfiguration.", diff --git a/apps/settings/l10n/de_DE.js b/apps/settings/l10n/de_DE.js index 5388ff52529..002bd98e591 100644 --- a/apps/settings/l10n/de_DE.js +++ b/apps/settings/l10n/de_DE.js @@ -122,7 +122,7 @@ OC.L10N.register( "Mobile & desktop" : "Mobil & Desktop", "Email server" : "E-Mail-Server", "Mail Providers" : "E-Mail-Anbieter", - "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Der E-Mail-Provider ermöglicht das Senden von E-Mails direkt über das persönliche E-Mail-Konto des Benutzers. Derzeit ist diese Funktion auf Kalendereinladungen beschränkt. Es erfordert Nextcloud Mail 4.1 und ein E-Mail-Konto in Nextcloud Mail, das mit der E-Mail-Adresse des Benutzers in Nextcloud übereinstimmt.", + "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Der E-Mail-Anbieter ermöglicht das Senden von E-Mails direkt über das persönliche E-Mail-Konto des Benutzers. Derzeit ist diese Funktion auf Kalendereinladungen beschränkt. Es erfordert Nextcloud Mail 4.1 und ein E-Mail-Konto in Nextcloud Mail, das mit der E-Mail-Adresse des Benutzers in Nextcloud übereinstimmt.", "Send emails using" : "E-Mails senden mittels", "User's email account" : "E-Mail-Konto des Benutzers", "System email account" : "System-E-Mail-Konto", @@ -371,14 +371,14 @@ OC.L10N.register( "Allow users to set custom share link tokens" : "Benutzern erlauben, benutzerdefinierte Freigabelink-Token festzulegen", "Shares with custom tokens will continue to be accessible after this setting has been disabled" : "Freigaben mit benutzerdefinierten Token sind auch noch nach der Deaktivierung dieser Einstellung zugänglich", "Shares with guessable tokens may be accessed easily" : "Auf Freigaben mit erratbaren Token kann u. U. leicht zugegriffen werden", - "Limit sharing based on groups" : "Freigeben basierend auf Gruppen beschränken", - "Allow sharing for everyone (default)" : "Teilen für jedermann erlauben (Standard)", - "Exclude some groups from sharing" : "Einige Gruppen vom Teilen ausschließen", - "Limit sharing to some groups" : "Teilen auf einige Gruppen beschränken", - "Groups allowed to share" : "Gruppen, die teilen dürfen", + "Limit sharing based on groups" : "Freigaben nach Gruppen einschränken", + "Allow sharing for everyone (default)" : "Teilen für alle erlauben (Standard)", + "Exclude some groups from sharing" : "Bestimmte Gruppen vom Teilen ausschließen", + "Limit sharing to some groups" : "Teilen für bestimmte Gruppen erlauben", + "Groups allowed to share" : "Für die Linkfreigabe zugelassene Gruppen", "Groups excluded from sharing" : "Von der Linkfreigabe ausgeschlossene Gruppen", "Not allowed groups will still be able to receive shares, but not to initiate them." : "Nicht zugelassene Gruppen können zwar weiterhin Freigaben empfangen, aber nicht erstellen.", - "Set default expiration date for internal shares" : "Legen Sie das Standardablaufdatum für interne Freigaben fest", + "Set default expiration date for internal shares" : "Standardablaufdatum für interne Freigaben festlegen", "Enforce expiration date" : "Ablaufdatum erzwingen", "Default expiration time of new shares in days" : "Standardablaufzeit neuer Freigaben in Tagen", "Expire shares after x days" : "Freigaben laufen nach x Tagen ab", @@ -393,7 +393,7 @@ OC.L10N.register( "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Wenn die Autovervollständigung \"gleiche Gruppe\" und \"Rufnummernintegration\" aktiviert ist, reicht eine Übereinstimmung in einem der beiden Bereiche aus, um den Benutzer anzuzeigen.", "Restrict account name autocompletion and system address book access to users within the same groups" : "Die automatische Vervollständigung von Kontonamen und den Zugriff auf das Systemadressbuch auf Benutzer innerhalb derselben Gruppen beschränken", "Restrict account name autocompletion to users based on phone number integration" : "Die automatische Vervollständigung des Kontonamens auf Benutzer beschränken, die auf der Integration von Telefonnummern basieren.", - "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Ermöglicht die automatische Vervollständigung, wenn der volle Namen oder E-Mail-Adresse eingegeben wird (ignoriert fehlende Telefonbuchübereinstimmungen und gleiche Gruppenzugehörigkeit)", + "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Die automatische Vervollständigung ermöglichen, wenn der vollständige Name oder die E-Mail-Adresse eingegeben wird (ignoriert fehlende Telefonbuchübereinstimmungen und gleiche Gruppenzugehörigkeit)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Haftungsausschluss auf der öffentlichen Upload-Seite anzeigen (Wird nur gezeigt, wenn die Dateiliste nicht angezeigt wird.) ", "Disclaimer text" : "Haftungsausschlusstext", "This text will be shown on the public link upload page when the file list is hidden." : "Dieser Text wird auf der öffentlichen Upload-Seite angezeigt wenn die Dateiliste nicht angezeigt wird.", @@ -549,7 +549,7 @@ OC.L10N.register( "The cron.php needs to be executed by the system account \"{user}\"." : "Die cron.php muss von dem Systemkonto \"{user}\" ausgeführt werden.", "The PHP POSIX extension is required. See {linkstart}PHP documentation{linkend} for more details." : "Die PHP-POSIX-Erweiterung ist erforderlich. Weitere Einzelheiten finden Sie in der {linkstart}PHP-Dokumentation{linkend}.", "Unable to update background job mode" : "Hintergrund-Aufgaben-Modus kann nicht aktualisiert werden", - "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Damit der Server ordnungsgemäß funktioniert, ist es wichtig, Hintergrundjobs richtig zu konfigurieren. Cron ist die empfohlene Einstellung. Weitere Informationen finden Sie in der Dokumentation.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Damit der Server ordnungsgemäß funktioniert, ist es wichtig, Hintergrund-Aufgaben richtig zu konfigurieren. Cron ist die empfohlene Einstellung. Weitere Informationen finden Sie in der Dokumentation.", "Last job execution ran {time}. Something seems wrong." : "Die letzte Aufgaben-Ausführung lief {time}. Etwas scheint falsch zu sein.", "Last job ran {relativeTime}." : "Die letzte Aufgabe lief {relativeTime}.", "Background job did not run yet!" : "Hintergrund-Aufgabe wurde bislang nicht ausgeführt!", @@ -789,7 +789,7 @@ OC.L10N.register( "Location" : "Ort", "Profile picture" : "Profilbild", "About" : "Über", - "Date of birth" : "Geburtsdatum:", + "Date of birth" : "Geburtsdatum", "Full name" : "Vollständiger Name", "Additional email" : "Zusätzliche E-Mail-Adresse", "Fediverse (e.g. Mastodon)" : "Fediverse (wie z. B. Mastodon)", @@ -870,7 +870,7 @@ OC.L10N.register( "Save" : "Speichern", "Test and verify email settings" : "Testen und Überprüfen der E-Mail-Einstellungen", "Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen", - "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Für die Sicherheit und Geschwindigkeit Ihrer Installation ist es von großer Bedeutung, dass sie richtig konfiguriert ist. Um Ihnen hierbei zu helfen werden einige automatische Tests durchgeführt. Weitere Informationen finden Sie in der verlinkten Dokumentation.", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Für die Sicherheit und Leistung Ihrer Instanz ist es von großer Bedeutung, dass alles richtig konfiguriert ist. Um Sie dabei zu unterstützen, werden einige automatische Prüfungen durchgeführt. Weitere Informationen finden Sie in der verlinkten Dokumentation.", "All checks passed." : "Alle Überprüfungen bestanden.", "There are some errors regarding your setup." : "Es gibt einige Fehler in Ihrer Systemkonfiguration.", "There are some warnings regarding your setup." : "Es gibt einige Warnungen zu Ihrer Systemkonfiguration.", diff --git a/apps/settings/l10n/de_DE.json b/apps/settings/l10n/de_DE.json index 0f35dc26f55..4d040cf5a19 100644 --- a/apps/settings/l10n/de_DE.json +++ b/apps/settings/l10n/de_DE.json @@ -120,7 +120,7 @@ "Mobile & desktop" : "Mobil & Desktop", "Email server" : "E-Mail-Server", "Mail Providers" : "E-Mail-Anbieter", - "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Der E-Mail-Provider ermöglicht das Senden von E-Mails direkt über das persönliche E-Mail-Konto des Benutzers. Derzeit ist diese Funktion auf Kalendereinladungen beschränkt. Es erfordert Nextcloud Mail 4.1 und ein E-Mail-Konto in Nextcloud Mail, das mit der E-Mail-Adresse des Benutzers in Nextcloud übereinstimmt.", + "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Der E-Mail-Anbieter ermöglicht das Senden von E-Mails direkt über das persönliche E-Mail-Konto des Benutzers. Derzeit ist diese Funktion auf Kalendereinladungen beschränkt. Es erfordert Nextcloud Mail 4.1 und ein E-Mail-Konto in Nextcloud Mail, das mit der E-Mail-Adresse des Benutzers in Nextcloud übereinstimmt.", "Send emails using" : "E-Mails senden mittels", "User's email account" : "E-Mail-Konto des Benutzers", "System email account" : "System-E-Mail-Konto", @@ -369,14 +369,14 @@ "Allow users to set custom share link tokens" : "Benutzern erlauben, benutzerdefinierte Freigabelink-Token festzulegen", "Shares with custom tokens will continue to be accessible after this setting has been disabled" : "Freigaben mit benutzerdefinierten Token sind auch noch nach der Deaktivierung dieser Einstellung zugänglich", "Shares with guessable tokens may be accessed easily" : "Auf Freigaben mit erratbaren Token kann u. U. leicht zugegriffen werden", - "Limit sharing based on groups" : "Freigeben basierend auf Gruppen beschränken", - "Allow sharing for everyone (default)" : "Teilen für jedermann erlauben (Standard)", - "Exclude some groups from sharing" : "Einige Gruppen vom Teilen ausschließen", - "Limit sharing to some groups" : "Teilen auf einige Gruppen beschränken", - "Groups allowed to share" : "Gruppen, die teilen dürfen", + "Limit sharing based on groups" : "Freigaben nach Gruppen einschränken", + "Allow sharing for everyone (default)" : "Teilen für alle erlauben (Standard)", + "Exclude some groups from sharing" : "Bestimmte Gruppen vom Teilen ausschließen", + "Limit sharing to some groups" : "Teilen für bestimmte Gruppen erlauben", + "Groups allowed to share" : "Für die Linkfreigabe zugelassene Gruppen", "Groups excluded from sharing" : "Von der Linkfreigabe ausgeschlossene Gruppen", "Not allowed groups will still be able to receive shares, but not to initiate them." : "Nicht zugelassene Gruppen können zwar weiterhin Freigaben empfangen, aber nicht erstellen.", - "Set default expiration date for internal shares" : "Legen Sie das Standardablaufdatum für interne Freigaben fest", + "Set default expiration date for internal shares" : "Standardablaufdatum für interne Freigaben festlegen", "Enforce expiration date" : "Ablaufdatum erzwingen", "Default expiration time of new shares in days" : "Standardablaufzeit neuer Freigaben in Tagen", "Expire shares after x days" : "Freigaben laufen nach x Tagen ab", @@ -391,7 +391,7 @@ "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Wenn die Autovervollständigung \"gleiche Gruppe\" und \"Rufnummernintegration\" aktiviert ist, reicht eine Übereinstimmung in einem der beiden Bereiche aus, um den Benutzer anzuzeigen.", "Restrict account name autocompletion and system address book access to users within the same groups" : "Die automatische Vervollständigung von Kontonamen und den Zugriff auf das Systemadressbuch auf Benutzer innerhalb derselben Gruppen beschränken", "Restrict account name autocompletion to users based on phone number integration" : "Die automatische Vervollständigung des Kontonamens auf Benutzer beschränken, die auf der Integration von Telefonnummern basieren.", - "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Ermöglicht die automatische Vervollständigung, wenn der volle Namen oder E-Mail-Adresse eingegeben wird (ignoriert fehlende Telefonbuchübereinstimmungen und gleiche Gruppenzugehörigkeit)", + "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Die automatische Vervollständigung ermöglichen, wenn der vollständige Name oder die E-Mail-Adresse eingegeben wird (ignoriert fehlende Telefonbuchübereinstimmungen und gleiche Gruppenzugehörigkeit)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Haftungsausschluss auf der öffentlichen Upload-Seite anzeigen (Wird nur gezeigt, wenn die Dateiliste nicht angezeigt wird.) ", "Disclaimer text" : "Haftungsausschlusstext", "This text will be shown on the public link upload page when the file list is hidden." : "Dieser Text wird auf der öffentlichen Upload-Seite angezeigt wenn die Dateiliste nicht angezeigt wird.", @@ -547,7 +547,7 @@ "The cron.php needs to be executed by the system account \"{user}\"." : "Die cron.php muss von dem Systemkonto \"{user}\" ausgeführt werden.", "The PHP POSIX extension is required. See {linkstart}PHP documentation{linkend} for more details." : "Die PHP-POSIX-Erweiterung ist erforderlich. Weitere Einzelheiten finden Sie in der {linkstart}PHP-Dokumentation{linkend}.", "Unable to update background job mode" : "Hintergrund-Aufgaben-Modus kann nicht aktualisiert werden", - "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Damit der Server ordnungsgemäß funktioniert, ist es wichtig, Hintergrundjobs richtig zu konfigurieren. Cron ist die empfohlene Einstellung. Weitere Informationen finden Sie in der Dokumentation.", + "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Damit der Server ordnungsgemäß funktioniert, ist es wichtig, Hintergrund-Aufgaben richtig zu konfigurieren. Cron ist die empfohlene Einstellung. Weitere Informationen finden Sie in der Dokumentation.", "Last job execution ran {time}. Something seems wrong." : "Die letzte Aufgaben-Ausführung lief {time}. Etwas scheint falsch zu sein.", "Last job ran {relativeTime}." : "Die letzte Aufgabe lief {relativeTime}.", "Background job did not run yet!" : "Hintergrund-Aufgabe wurde bislang nicht ausgeführt!", @@ -787,7 +787,7 @@ "Location" : "Ort", "Profile picture" : "Profilbild", "About" : "Über", - "Date of birth" : "Geburtsdatum:", + "Date of birth" : "Geburtsdatum", "Full name" : "Vollständiger Name", "Additional email" : "Zusätzliche E-Mail-Adresse", "Fediverse (e.g. Mastodon)" : "Fediverse (wie z. B. Mastodon)", @@ -868,7 +868,7 @@ "Save" : "Speichern", "Test and verify email settings" : "Testen und Überprüfen der E-Mail-Einstellungen", "Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen", - "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Für die Sicherheit und Geschwindigkeit Ihrer Installation ist es von großer Bedeutung, dass sie richtig konfiguriert ist. Um Ihnen hierbei zu helfen werden einige automatische Tests durchgeführt. Weitere Informationen finden Sie in der verlinkten Dokumentation.", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the linked documentation for more information." : "Für die Sicherheit und Leistung Ihrer Instanz ist es von großer Bedeutung, dass alles richtig konfiguriert ist. Um Sie dabei zu unterstützen, werden einige automatische Prüfungen durchgeführt. Weitere Informationen finden Sie in der verlinkten Dokumentation.", "All checks passed." : "Alle Überprüfungen bestanden.", "There are some errors regarding your setup." : "Es gibt einige Fehler in Ihrer Systemkonfiguration.", "There are some warnings regarding your setup." : "Es gibt einige Warnungen zu Ihrer Systemkonfiguration.", diff --git a/apps/settings/l10n/et_EE.js b/apps/settings/l10n/et_EE.js index b04802d8704..177df787b13 100644 --- a/apps/settings/l10n/et_EE.js +++ b/apps/settings/l10n/et_EE.js @@ -139,12 +139,15 @@ OC.L10N.register( "Email test" : "E-kirjade saatmise test", "Mail delivery is disabled by instance config \"%s\"." : "Selles serveris piirab e-kirjade edasisaatmist seadistus „%s“.", "Email test was successfully sent" : "Test e-kirja saatmine õnnestus", + "Old server-side-encryption" : "Vana serveripoolne krüptimine", "Disabled" : "Keelatud", + "The old server-side-encryption format is enabled. We recommend disabling this." : "Vana serveripoolse krüptimise vorming on kasutusel. Mes soovitame, et lülitad selle välja.", "Logging level" : "Logitase", "The %1$s configuration option must be a valid integer value." : "Seadistusvalik „%1$s“ peab olema korrektne täisarv.", "The logging level is set to debug level. Use debug level only when you have a problem to diagnose, and then reset your log level to a less-verbose level as it outputs a lot of information, and can affect your server performance." : "Logimistase on hetkel seatud veaotsinguks. Kasuta seda vaid siis, kui tõesti tegeled veaotsinguga ning peale seda muuda logimine jälle tavaliseks. Veaotsinguks vajalik logimine on väga väljundirikas ning võib mõjutada serveri jõudlust.", "Logging level configured correctly." : "Logimistase on korrektselt seadistatud", "Supported" : "Toetatud", + "PHP getenv" : "PHP getenv", "PHP does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP ei tundu olevat süsteemsete keskkonnamuutujate pärimiseks korrektselt seadistatud. Test getenv(\"PATH\") abil tagastab tühja vastuse.", "PHP file size upload limit" : "PHP failide üleslaadimise mahupiir", "The PHP upload_max_filesize is too low. A size of at least %1$s is recommended. Current value: %2$s." : "PHP seadistuse „upload_max_filesize“ väärtus on liiga väike. Meie soovitatud väärtus: %1$s. Praegune väärtus: %2$s.", @@ -152,8 +155,10 @@ OC.L10N.register( "The PHP max_input_time is too low. A time of at least %1$s is recommended. Current value: %2$s." : "PHP seadistuse „max_input_time“ väärtus on liiga väike. Meie soovitatud väärtus: %1$s. Praegune väärtus: %2$s.", "The PHP max_execution_time is too low. A time of at least %1$s is recommended. Current value: %2$s." : "PHP seadistuse „max_execution_time“ väärtus on liiga väike. Meie soovitatud väärtus: %1$s. Praegune väärtus: %2$s.", "PHP memory limit" : "PHP mälukasutuse ülempiir", + "PHP modules" : "PHP lisamoodulid", "for Argon2 for password hashing" : "Argon2-põhise salasõna räsimise jaoks", "required for SFTP storage and recommended for WebAuthn performance" : "nõutav SFTP andmeruumi jaoks ja soovitatav WebAuthn jõudluse jaoks", + "This instance is missing some required PHP modules. It is required to install them: %s." : "Siit serverist on puudu mõned vajalikud PHP moodulid. On nõutav, et paigaldad alljärgnevad lisamoodulid: %s.", "Correctly configured" : "Korrektselt seadistatud", "PHP version" : "PHP versioon", "You are currently running PHP %1$s. PHP %2$s is deprecated since Nextcloud %3$s. Nextcloud %4$s may require at least PHP %5$s. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Sa kasutad hetkel PHP versiooni %1$s. PHP %2$s on aga alates Nexctcloudi versioonist %3$s kasutuselt eemaldatud. Nexctcloud %4$s eeldab, et PHP versioon on vähemalt %5$s. Palun uuenda oma server PHP Groupi poolt väljaantud ametliku PHP versioonini niipea, kui võimalik.", @@ -163,6 +168,8 @@ OC.L10N.register( "Free push service" : "Tasuta tõuketeenus", "This is the unsupported community build of Nextcloud. Given the size of this instance, performance, reliability and scalability cannot be guaranteed. Push notifications are limited to avoid overloading our free service. Learn more about the benefits of Nextcloud Enterprise at {link}." : "See on mittetoetatud Nextcloudi variant kogukonnale. Arvestades selle serveri parameetreid, pole jõudlus, töökindlus ja skaleeritavus garanteeritud. Meie tasuta teenuse ülekoormuse vältimiseks on tõuketeavituste arv piiratud. Nextcloud Enterprise versiooni eelistest loe siin: {link}.", "Secure" : "Turvaline", + "Configuration file access rights" : "Ligipääsuõigused seadistuste failile", + "Nextcloud configuration file is writable" : "Nextcloudi seadistusfail on on kirjutatav", "Database version" : "Andmebaasi versioon", "MariaDB version 10.3 detected, this version is end-of-life and only supported as part of Ubuntu 20.04. MariaDB >=%1$s and <=%2$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Tuvastasin MariaDB versiooni 10.3 ning tema kasutusperiood on lõppenud ja tugi on olemas vaid Ubuntu 20.04 puhul. Parima jõudluse, stabiilsuse ja funktsionaalsuse mõttes soovitame selle Nextcloudi versiooni jaoks MariaDB versioone >=%1$s and <= %2$s.", "MariaDB version \"%1$s\" detected. MariaDB >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Tuvastasin MariaDB versiooni „%1$s“. Parima jõudluse, stabiilsuse ja funktsionaalsuse mõttes soovitame selle Nextcloudi versiooni jaoks MariaDB versioone >=%2$s and <= %3$s.", @@ -178,11 +185,13 @@ OC.L10N.register( "Enable" : "Lülita sisse", "Machine translation" : "Masintõlge", "Image generation" : "Pildiloome", + "Unable to modify setting" : "Seadistuse muutmine ei õnnestu", "None" : "Pole", "Allow apps to use the Share API" : "Luba rakendustel kasutada Share API-t", "Allow resharing" : "Luba edasijagamine", "Allow sharing with groups" : "Luba gruppidega jagamine", "Restrict users to only share with users in their groups" : "Luba kasutajatel jagada kasutajatega ainult oma grupi piires", + "Allow users to share via link and emails" : "Luba kasutajatel lingiga ja e-postiga jagamist", "Allow public uploads" : "Luba avalikud üleslaadimised", "Always ask for a password" : "Alati küsi parooli", "Enforce password protection" : "Jõusta paroolikaitse", @@ -271,15 +280,20 @@ OC.L10N.register( "Limit app usage to groups" : "Piira rakenduse kasutamist gruppidega", "No results" : "Vasteid ei leitud", "Update to {version}" : "Uuenda versioonile {version}", + "Delete data on remove" : "Eemaldamisel kustuta andmed", "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Sellel rakendusel pole määratud minimaalset Nextcloudi versiooni. See põhjustab tulevikus veateateid.", "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Sellel rakendusel pole määratud maksimaalset Nextcloudi versiooni. See põhjustab tulevikus veateateid.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Seda rakendust ei saa paigaldada, sest järgmised sõltuvusel ei ole täidetud:", + "Latest updated" : "Viimati uuendatud", "Author" : "Autor", "Categories" : "Kategooriad", "Resources" : "Ressursid", "Documentation" : "Dokumentatsioon", "Report a bug" : "Teata veast", + "Request feature" : "Palu arendajatel funktsionaalsuse lisamist", "Ask questions or discuss" : "Küsi nõu või aruta", + "Rate the app" : "Hinda rakendust", + "Rate" : "Hinda", "Changelog" : "Muudatuste logi", "Google Chrome for Android" : "Google Chrome for Android", "{productName} iOS app" : "{productName}i iOS-i rakendus", @@ -318,6 +332,7 @@ OC.L10N.register( "Show QR code for mobile apps" : "Näita QR-koodi nutiseadmete rakenduste jaoks", "Last job execution ran {time}. Something seems wrong." : "Viimane käivitus kestis {time}. See pole päris õige.", "Last job ran {relativeTime}." : "Viimane käivitus kestis {relativeTime}.", + "Unable to update profile default setting" : "Profiili vaikimisi seadistuste uuendamine ei õnnestu", "Profile" : "Profiil", "Failed to save setting" : "Seadistuse salvestamine ei õnnestunud", "Unable to update server side encryption config" : "Serveripoolse krüptimise seadistusi ei õnnestu uuendada", @@ -399,6 +414,8 @@ OC.L10N.register( "Your organisation" : "Sinu organisatsioon", "Your phone number" : "Sinu telefoninumber", "Edit your Profile visibility" : "Muuda oma profiili nähtavust", + "Unable to update profile enabled state" : "Profiili kasutuseloleku uuendamine ei õnnestu", + "Unable to update visibility of {displayId}" : "„{displayId}“ nähtavust polnud võimalik uuendada", "Your role" : "Sinu roll", "Your X (formerly Twitter) handle" : "Sinu X-i (varasemalt Twitteri) kasutajanimi", "Your website" : "Sinu veebileht", @@ -418,7 +435,7 @@ OC.L10N.register( "No accounts" : "Kasutajakontosid pole", "Loading accounts …" : "Kontode laadimine ...", "List of accounts. This list is not fully rendered for performance reasons. The accounts will be rendered as you navigate through the list." : "Kasutajakontode loend. Jõudluse mõttes ei ole kogu loend esimesel hetkel tervikuna nähtav. Uued kasutajakontid lisanduvad sedamööda, kui sa loendis edasi liigud.", - "Manager" : "Haldaaja", + "Manager" : "Haldaja", "Account name will be autogenerated" : "Kasutajakonto nimi luuakse automaatselt", "Account name (required)" : "Kasutajakonto nimi (nõutav)", "Failed to search groups" : "Gruppe ei õnnestunud otsida", @@ -482,20 +499,34 @@ OC.L10N.register( "Set the language" : "Vali keel", "Done" : "Valmis", "Edit" : "Muuda", + "Account management settings" : "Kasutajakontode halduse seadistused", "Visibility" : "Nähtavus", "Show language" : "Näita keelt", + "Show account backend" : "Näita kasutajakonto taustateenust", + "Show storage path" : "Näita andmeruumi asukohta", + "Show first login" : "Näita esimest sisselogimist", "Show last login" : "Näita viimast sisselogimist", "Sorting" : "Järjestus", + "The system config enforces sorting the groups by name. This also disables showing the member count." : "Süsteem seadistus kasutab gruppide järjestamist nime alusel. Muu hulgas see ei võimalda liikmete arvu näitamist.", + "Group list sorting" : "Rühmade loendi 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.", + "By member count" : "Liikmete arvu alusel", + "By name" : "Nime alusel", "Send email" : "Saada kiri", + "Send welcome email to new accounts" : "Saada uutele kasutajatele tervituskiri", "Defaults" : "Vaikeväärtused", "Default quota" : "Vaikimisi mahupiir", + "Select default quota" : "Vali vaikimisi andmemahu piir", "Passwordless authentication requires a secure connection." : "Salasõnata autentimine eeldab turvalise võrguühenduse kasutamist.", + "Adding your device …" : "Lisan sinu seadet…", "Unnamed device" : "Nimetu seade", "Passwordless Authentication" : "Salasõnata autentimine", "Set up your account for passwordless authentication following the FIDO2 standard." : "Seadista oma kasutajakonto jaoks salasõnata autentimine, mis põhineb FIDO2 standardil.", + "No devices configured." : "Ühtegi seadet pole seadistatud.", "The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:", + "Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.", "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saate jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.", + "You need to enable the File sharing App." : "Sa pead kasutusele võtma Failijagamise rakenduse.", "Version {version}" : "Versioon {version}", "All accounts" : "Kõik kasutajakontod", "Admins" : "Haldurid", @@ -582,6 +613,7 @@ OC.L10N.register( "MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "Kasutusel on MariaDB versioon „%s“ . Nextcloud 21 või hilisem seda versiooni ei toeta ning eeldab, et kasutusel on MariaDB versioon 10.2 või hilisem.", "MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "Kasutusel on MySQLi versioon „%s“ . Nextcloud 21 või hilisem seda versiooni ei toeta ning eeldab, et kasutusel on MySQLi versioon 8.0 või MariaDB versioon 10.2 või hilisemad.", "PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "Kasutusel on PostgreSQLi versioon „%s“ . Nextcloud 21 või hilisem seda versiooni ei toeta ning eeldab, et kasutusel on PostgreSQLi versioon 9.6 või hilisem.", + "Your biography" : "Sinu elulugu", "You are using <strong>{usage}</strong>" : "Sa kasutad: <strong>{usage}</strong>", "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Sa kasutad: <strong>{usage}</strong> / <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)", "Set user manager" : "Määra kasutaja haldur", @@ -592,6 +624,7 @@ OC.L10N.register( "Set user groups" : "Määra kasutajagrupid", "Administered groups" : "Hallatud grupid", "Set user as admin for …" : "Määra kasutaja peakasutajaks grupis…", + "Set user quota" : "Määra kasutajate kvoot", "Add new user" : "Lisa uus kasutaja", "_{userCount} user …_::_{userCount} users …_" : ["{userCount} kasutaja…","{userCount} kasutajat…"], "_{userCount} user_::_{userCount} users_" : ["{userCount} kasutaja","{userCount} kasutajat"], diff --git a/apps/settings/l10n/et_EE.json b/apps/settings/l10n/et_EE.json index c820494e24b..b74a0da9dcd 100644 --- a/apps/settings/l10n/et_EE.json +++ b/apps/settings/l10n/et_EE.json @@ -137,12 +137,15 @@ "Email test" : "E-kirjade saatmise test", "Mail delivery is disabled by instance config \"%s\"." : "Selles serveris piirab e-kirjade edasisaatmist seadistus „%s“.", "Email test was successfully sent" : "Test e-kirja saatmine õnnestus", + "Old server-side-encryption" : "Vana serveripoolne krüptimine", "Disabled" : "Keelatud", + "The old server-side-encryption format is enabled. We recommend disabling this." : "Vana serveripoolse krüptimise vorming on kasutusel. Mes soovitame, et lülitad selle välja.", "Logging level" : "Logitase", "The %1$s configuration option must be a valid integer value." : "Seadistusvalik „%1$s“ peab olema korrektne täisarv.", "The logging level is set to debug level. Use debug level only when you have a problem to diagnose, and then reset your log level to a less-verbose level as it outputs a lot of information, and can affect your server performance." : "Logimistase on hetkel seatud veaotsinguks. Kasuta seda vaid siis, kui tõesti tegeled veaotsinguga ning peale seda muuda logimine jälle tavaliseks. Veaotsinguks vajalik logimine on väga väljundirikas ning võib mõjutada serveri jõudlust.", "Logging level configured correctly." : "Logimistase on korrektselt seadistatud", "Supported" : "Toetatud", + "PHP getenv" : "PHP getenv", "PHP does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP ei tundu olevat süsteemsete keskkonnamuutujate pärimiseks korrektselt seadistatud. Test getenv(\"PATH\") abil tagastab tühja vastuse.", "PHP file size upload limit" : "PHP failide üleslaadimise mahupiir", "The PHP upload_max_filesize is too low. A size of at least %1$s is recommended. Current value: %2$s." : "PHP seadistuse „upload_max_filesize“ väärtus on liiga väike. Meie soovitatud väärtus: %1$s. Praegune väärtus: %2$s.", @@ -150,8 +153,10 @@ "The PHP max_input_time is too low. A time of at least %1$s is recommended. Current value: %2$s." : "PHP seadistuse „max_input_time“ väärtus on liiga väike. Meie soovitatud väärtus: %1$s. Praegune väärtus: %2$s.", "The PHP max_execution_time is too low. A time of at least %1$s is recommended. Current value: %2$s." : "PHP seadistuse „max_execution_time“ väärtus on liiga väike. Meie soovitatud väärtus: %1$s. Praegune väärtus: %2$s.", "PHP memory limit" : "PHP mälukasutuse ülempiir", + "PHP modules" : "PHP lisamoodulid", "for Argon2 for password hashing" : "Argon2-põhise salasõna räsimise jaoks", "required for SFTP storage and recommended for WebAuthn performance" : "nõutav SFTP andmeruumi jaoks ja soovitatav WebAuthn jõudluse jaoks", + "This instance is missing some required PHP modules. It is required to install them: %s." : "Siit serverist on puudu mõned vajalikud PHP moodulid. On nõutav, et paigaldad alljärgnevad lisamoodulid: %s.", "Correctly configured" : "Korrektselt seadistatud", "PHP version" : "PHP versioon", "You are currently running PHP %1$s. PHP %2$s is deprecated since Nextcloud %3$s. Nextcloud %4$s may require at least PHP %5$s. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Sa kasutad hetkel PHP versiooni %1$s. PHP %2$s on aga alates Nexctcloudi versioonist %3$s kasutuselt eemaldatud. Nexctcloud %4$s eeldab, et PHP versioon on vähemalt %5$s. Palun uuenda oma server PHP Groupi poolt väljaantud ametliku PHP versioonini niipea, kui võimalik.", @@ -161,6 +166,8 @@ "Free push service" : "Tasuta tõuketeenus", "This is the unsupported community build of Nextcloud. Given the size of this instance, performance, reliability and scalability cannot be guaranteed. Push notifications are limited to avoid overloading our free service. Learn more about the benefits of Nextcloud Enterprise at {link}." : "See on mittetoetatud Nextcloudi variant kogukonnale. Arvestades selle serveri parameetreid, pole jõudlus, töökindlus ja skaleeritavus garanteeritud. Meie tasuta teenuse ülekoormuse vältimiseks on tõuketeavituste arv piiratud. Nextcloud Enterprise versiooni eelistest loe siin: {link}.", "Secure" : "Turvaline", + "Configuration file access rights" : "Ligipääsuõigused seadistuste failile", + "Nextcloud configuration file is writable" : "Nextcloudi seadistusfail on on kirjutatav", "Database version" : "Andmebaasi versioon", "MariaDB version 10.3 detected, this version is end-of-life and only supported as part of Ubuntu 20.04. MariaDB >=%1$s and <=%2$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Tuvastasin MariaDB versiooni 10.3 ning tema kasutusperiood on lõppenud ja tugi on olemas vaid Ubuntu 20.04 puhul. Parima jõudluse, stabiilsuse ja funktsionaalsuse mõttes soovitame selle Nextcloudi versiooni jaoks MariaDB versioone >=%1$s and <= %2$s.", "MariaDB version \"%1$s\" detected. MariaDB >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud." : "Tuvastasin MariaDB versiooni „%1$s“. Parima jõudluse, stabiilsuse ja funktsionaalsuse mõttes soovitame selle Nextcloudi versiooni jaoks MariaDB versioone >=%2$s and <= %3$s.", @@ -176,11 +183,13 @@ "Enable" : "Lülita sisse", "Machine translation" : "Masintõlge", "Image generation" : "Pildiloome", + "Unable to modify setting" : "Seadistuse muutmine ei õnnestu", "None" : "Pole", "Allow apps to use the Share API" : "Luba rakendustel kasutada Share API-t", "Allow resharing" : "Luba edasijagamine", "Allow sharing with groups" : "Luba gruppidega jagamine", "Restrict users to only share with users in their groups" : "Luba kasutajatel jagada kasutajatega ainult oma grupi piires", + "Allow users to share via link and emails" : "Luba kasutajatel lingiga ja e-postiga jagamist", "Allow public uploads" : "Luba avalikud üleslaadimised", "Always ask for a password" : "Alati küsi parooli", "Enforce password protection" : "Jõusta paroolikaitse", @@ -269,15 +278,20 @@ "Limit app usage to groups" : "Piira rakenduse kasutamist gruppidega", "No results" : "Vasteid ei leitud", "Update to {version}" : "Uuenda versioonile {version}", + "Delete data on remove" : "Eemaldamisel kustuta andmed", "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Sellel rakendusel pole määratud minimaalset Nextcloudi versiooni. See põhjustab tulevikus veateateid.", "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Sellel rakendusel pole määratud maksimaalset Nextcloudi versiooni. See põhjustab tulevikus veateateid.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Seda rakendust ei saa paigaldada, sest järgmised sõltuvusel ei ole täidetud:", + "Latest updated" : "Viimati uuendatud", "Author" : "Autor", "Categories" : "Kategooriad", "Resources" : "Ressursid", "Documentation" : "Dokumentatsioon", "Report a bug" : "Teata veast", + "Request feature" : "Palu arendajatel funktsionaalsuse lisamist", "Ask questions or discuss" : "Küsi nõu või aruta", + "Rate the app" : "Hinda rakendust", + "Rate" : "Hinda", "Changelog" : "Muudatuste logi", "Google Chrome for Android" : "Google Chrome for Android", "{productName} iOS app" : "{productName}i iOS-i rakendus", @@ -316,6 +330,7 @@ "Show QR code for mobile apps" : "Näita QR-koodi nutiseadmete rakenduste jaoks", "Last job execution ran {time}. Something seems wrong." : "Viimane käivitus kestis {time}. See pole päris õige.", "Last job ran {relativeTime}." : "Viimane käivitus kestis {relativeTime}.", + "Unable to update profile default setting" : "Profiili vaikimisi seadistuste uuendamine ei õnnestu", "Profile" : "Profiil", "Failed to save setting" : "Seadistuse salvestamine ei õnnestunud", "Unable to update server side encryption config" : "Serveripoolse krüptimise seadistusi ei õnnestu uuendada", @@ -397,6 +412,8 @@ "Your organisation" : "Sinu organisatsioon", "Your phone number" : "Sinu telefoninumber", "Edit your Profile visibility" : "Muuda oma profiili nähtavust", + "Unable to update profile enabled state" : "Profiili kasutuseloleku uuendamine ei õnnestu", + "Unable to update visibility of {displayId}" : "„{displayId}“ nähtavust polnud võimalik uuendada", "Your role" : "Sinu roll", "Your X (formerly Twitter) handle" : "Sinu X-i (varasemalt Twitteri) kasutajanimi", "Your website" : "Sinu veebileht", @@ -416,7 +433,7 @@ "No accounts" : "Kasutajakontosid pole", "Loading accounts …" : "Kontode laadimine ...", "List of accounts. This list is not fully rendered for performance reasons. The accounts will be rendered as you navigate through the list." : "Kasutajakontode loend. Jõudluse mõttes ei ole kogu loend esimesel hetkel tervikuna nähtav. Uued kasutajakontid lisanduvad sedamööda, kui sa loendis edasi liigud.", - "Manager" : "Haldaaja", + "Manager" : "Haldaja", "Account name will be autogenerated" : "Kasutajakonto nimi luuakse automaatselt", "Account name (required)" : "Kasutajakonto nimi (nõutav)", "Failed to search groups" : "Gruppe ei õnnestunud otsida", @@ -480,20 +497,34 @@ "Set the language" : "Vali keel", "Done" : "Valmis", "Edit" : "Muuda", + "Account management settings" : "Kasutajakontode halduse seadistused", "Visibility" : "Nähtavus", "Show language" : "Näita keelt", + "Show account backend" : "Näita kasutajakonto taustateenust", + "Show storage path" : "Näita andmeruumi asukohta", + "Show first login" : "Näita esimest sisselogimist", "Show last login" : "Näita viimast sisselogimist", "Sorting" : "Järjestus", + "The system config enforces sorting the groups by name. This also disables showing the member count." : "Süsteem seadistus kasutab gruppide järjestamist nime alusel. Muu hulgas see ei võimalda liikmete arvu näitamist.", + "Group list sorting" : "Rühmade loendi 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.", + "By member count" : "Liikmete arvu alusel", + "By name" : "Nime alusel", "Send email" : "Saada kiri", + "Send welcome email to new accounts" : "Saada uutele kasutajatele tervituskiri", "Defaults" : "Vaikeväärtused", "Default quota" : "Vaikimisi mahupiir", + "Select default quota" : "Vali vaikimisi andmemahu piir", "Passwordless authentication requires a secure connection." : "Salasõnata autentimine eeldab turvalise võrguühenduse kasutamist.", + "Adding your device …" : "Lisan sinu seadet…", "Unnamed device" : "Nimetu seade", "Passwordless Authentication" : "Salasõnata autentimine", "Set up your account for passwordless authentication following the FIDO2 standard." : "Seadista oma kasutajakonto jaoks salasõnata autentimine, mis põhineb FIDO2 standardil.", + "No devices configured." : "Ühtegi seadet pole seadistatud.", "The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:", + "Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.", "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saate jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.", + "You need to enable the File sharing App." : "Sa pead kasutusele võtma Failijagamise rakenduse.", "Version {version}" : "Versioon {version}", "All accounts" : "Kõik kasutajakontod", "Admins" : "Haldurid", @@ -580,6 +611,7 @@ "MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "Kasutusel on MariaDB versioon „%s“ . Nextcloud 21 või hilisem seda versiooni ei toeta ning eeldab, et kasutusel on MariaDB versioon 10.2 või hilisem.", "MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "Kasutusel on MySQLi versioon „%s“ . Nextcloud 21 või hilisem seda versiooni ei toeta ning eeldab, et kasutusel on MySQLi versioon 8.0 või MariaDB versioon 10.2 või hilisemad.", "PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "Kasutusel on PostgreSQLi versioon „%s“ . Nextcloud 21 või hilisem seda versiooni ei toeta ning eeldab, et kasutusel on PostgreSQLi versioon 9.6 või hilisem.", + "Your biography" : "Sinu elulugu", "You are using <strong>{usage}</strong>" : "Sa kasutad: <strong>{usage}</strong>", "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Sa kasutad: <strong>{usage}</strong> / <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)", "Set user manager" : "Määra kasutaja haldur", @@ -590,6 +622,7 @@ "Set user groups" : "Määra kasutajagrupid", "Administered groups" : "Hallatud grupid", "Set user as admin for …" : "Määra kasutaja peakasutajaks grupis…", + "Set user quota" : "Määra kasutajate kvoot", "Add new user" : "Lisa uus kasutaja", "_{userCount} user …_::_{userCount} users …_" : ["{userCount} kasutaja…","{userCount} kasutajat…"], "_{userCount} user_::_{userCount} users_" : ["{userCount} kasutaja","{userCount} kasutajat"], diff --git a/apps/settings/l10n/fr.js b/apps/settings/l10n/fr.js index 38ccba9634c..56e7508f399 100644 --- a/apps/settings/l10n/fr.js +++ b/apps/settings/l10n/fr.js @@ -223,7 +223,7 @@ OC.L10N.register( "MySQL row format" : "MySQL format row ", "You are not using MySQL" : "Vous n'utilisez pas MySQL", "None of your tables use ROW_FORMAT=Compressed" : "Aucune de vos tables n'utilise ROW_FORMAT=Compressed", - "Incorrect row format found in your database. ROW_FORMAT=Dynamic offers the best database performances for Nextcloud. Please update row format on the following list: %s." : "Format de ligne incorrect trouvé dans votre base de donnéées. ROW_FORMAT=Dynamic offre les meilleures performances de base de données pour Nextcloud. Veuillez modifier le format de ligne dans la liste: %s", + "Incorrect row format found in your database. ROW_FORMAT=Dynamic offers the best database performances for Nextcloud. Please update row format on the following list: %s." : "Format de ligne incorrect trouvé dans votre base de données. ROW_FORMAT=Dynamic offre les meilleures performances de base de données pour Nextcloud. Veuillez modifier le format de ligne dans la liste: %s", "MySQL Unicode support" : "Compatibilité Unicode MySQL", "MySQL is used as database and does support 4-byte characters" : "MySQL est utilisé comme base de données et n'est pas compatible avec les caractères sur 4 octets", "MySQL is used as database but does not support 4-byte characters. To be able to handle 4-byte characters (like emojis) without issues in filenames or comments for example it is recommended to enable the 4-byte support in MySQL." : "MySQL est utilisé comme base de données et n'est pas compatible avec les caractères sur 4 octets. Pour être capable de gérer les caractères sur 4 octets (comme les émojis) sans problème, par exemple, dans les noms de fichiers ou les commentaires, il est recommandé d'activer la compatibilité 4 octets dans MySQL.", diff --git a/apps/settings/l10n/fr.json b/apps/settings/l10n/fr.json index 5b5d67102f7..2b5a1e5bd65 100644 --- a/apps/settings/l10n/fr.json +++ b/apps/settings/l10n/fr.json @@ -221,7 +221,7 @@ "MySQL row format" : "MySQL format row ", "You are not using MySQL" : "Vous n'utilisez pas MySQL", "None of your tables use ROW_FORMAT=Compressed" : "Aucune de vos tables n'utilise ROW_FORMAT=Compressed", - "Incorrect row format found in your database. ROW_FORMAT=Dynamic offers the best database performances for Nextcloud. Please update row format on the following list: %s." : "Format de ligne incorrect trouvé dans votre base de donnéées. ROW_FORMAT=Dynamic offre les meilleures performances de base de données pour Nextcloud. Veuillez modifier le format de ligne dans la liste: %s", + "Incorrect row format found in your database. ROW_FORMAT=Dynamic offers the best database performances for Nextcloud. Please update row format on the following list: %s." : "Format de ligne incorrect trouvé dans votre base de données. ROW_FORMAT=Dynamic offre les meilleures performances de base de données pour Nextcloud. Veuillez modifier le format de ligne dans la liste: %s", "MySQL Unicode support" : "Compatibilité Unicode MySQL", "MySQL is used as database and does support 4-byte characters" : "MySQL est utilisé comme base de données et n'est pas compatible avec les caractères sur 4 octets", "MySQL is used as database but does not support 4-byte characters. To be able to handle 4-byte characters (like emojis) without issues in filenames or comments for example it is recommended to enable the 4-byte support in MySQL." : "MySQL est utilisé comme base de données et n'est pas compatible avec les caractères sur 4 octets. Pour être capable de gérer les caractères sur 4 octets (comme les émojis) sans problème, par exemple, dans les noms de fichiers ou les commentaires, il est recommandé d'activer la compatibilité 4 octets dans MySQL.", diff --git a/apps/settings/l10n/it.js b/apps/settings/l10n/it.js index 5fd40d06340..95f012f9599 100644 --- a/apps/settings/l10n/it.js +++ b/apps/settings/l10n/it.js @@ -256,6 +256,7 @@ OC.L10N.register( "OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache non funziona come dovrebbe, opcache_get_status() restituisce false, controlla la configurazione.", "The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be kept in the cache, it is recommended to apply \"opcache.max_accelerated_files\" to your PHP configuration with a value higher than \"%s\"." : "Il numero massimo di chiavi OPcache è stato quasi superato. Per garantire che tutti gli script possano essere mantenuti nella cache, si consiglia di applicare \"opcache.max_accelerated_files\" alla configurazione PHP con un valore superiore a \"%s\".", "The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply \"opcache.memory_consumption\" to your PHP configuration with a value higher than \"%s\"." : "Il buffer OPcache è quasi pieno. Per garantire che tutti gli script possano essere conservati nella cache, si consiglia di applicare \"opcache.memory_consumption\" alla configurazione PHP con un valore superiore a \"%s\".", + "The PHP OPcache module is not properly configured. %s." : "Il modulo PHP OPcache non è correttamente configurato. %s.", "Correctly configured" : "Configurato correttamente", "PHP version" : "Versione PHP", "You are currently running PHP %s." : "Attualmente stai usando PHP %s.", @@ -304,7 +305,16 @@ OC.L10N.register( "Enforce password protection" : "Imponi la protezione con password", "Exclude groups from password requirements" : "Escludi gruppi dai requisiti della password", "Exclude groups from creating link shares" : "Escludi gruppi dalla creazione dei collegamenti di condivisione", + "Allow users to set custom share link tokens" : "Consenti agli utenti di impostare token di collegamento personalizzati", + "Shares with custom tokens will continue to be accessible after this setting has been disabled" : "Le condivisioni con token personalizzati continueranno a essere accessibili dopo aver disabilitato questa impostazione", + "Shares with guessable tokens may be accessed easily" : "Le condivisioni con token indovinabili sono facilmente accessibili", + "Limit sharing based on groups" : "Limita la condivisione in base ai gruppi", + "Exclude some groups from sharing" : "Escludi alcuni gruppi dalla condivisione", + "Limit sharing to some groups" : "Limita la condivisione ad alcuni gruppi", + "Groups allowed to share" : "Gruppi autorizzati a condividere", "Groups excluded from sharing" : "Gruppi esclusi dalla condivisione", + "Not allowed groups will still be able to receive shares, but not to initiate them." : "I gruppi non autorizzati potranno comunque ricevere condivisioni, ma non avviarle.", + "Set default expiration date for internal shares" : "Imposta la data di scadenza predefinita per le condivisioni interne", "Enforce expiration date" : "Forza la data di scadenza", "Default expiration time of new shares in days" : "Scadenza predefinita delle nuove condivisioni in giorni", "Expire shares after x days" : "Scadenza delle condivisioni dopo x giorni", @@ -315,6 +325,7 @@ OC.L10N.register( "Set default expiration date for shares via link or mail" : "Imposta la data di scadenza predefinita per le condivisioni tramite link o posta", "Default expiration time of shares in days" : "Scadenza predefinita delle condivisioni in giorni", "Privacy settings for sharing" : "Impostazioni sulla privacy per la condivisione", + "Allow account name autocompletion in share dialog and allow access to the system address book" : "Consenti il completamento automatico del nome dell'account nella finestra di dialogo di condivisione e consenti l'accesso alla rubrica di sistema", "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Se completamento di \"stesso gruppo\" e \"integrazione numero di telefono\" sono attivi, una corrispondenza in uno dei due è sufficiente per mostrare l'utente.", "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Consenti il completamento automatico quando inserisci il nome completo o l'indirizzo email (ignorando la corrispondenza della rubrica mancante e l'appartenenza allo stesso gruppo)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Mostra il testo della liberatoria sulla pagina di caricamento del collegamento pubblico (visualizzato solo quando l'elenco dei file è nascosto)", @@ -348,6 +359,7 @@ OC.L10N.register( "No apps found for your version" : "Nessuna applicazione trovata per la tua versione", "_%n app has an update available_::_%n apps have an update available_" : ["%n applicazione ha un aggiornamento disponibile","%n applicazioni hanno un aggiornamento disponibile","%n applicazioni hanno un aggiornamento disponibile"], "_Update_::_Update all_" : ["Aggiorna","Aggiorna","Aggiorna tutto"], + "Failed to load groups" : "Impossibile caricare i gruppi", "Failed to create group" : "Creazione gruppo fallita", "Create group" : "Crea gruppo", "Group name" : "Nome del gruppo", @@ -423,6 +435,7 @@ OC.L10N.register( "Password" : "Password", "Show QR code for mobile apps" : "Mostra il codice QR per le applicazioni mobili", "Use system cron service to call the cron.php file every 5 minutes." : "Usa il servizio cron di sistema per invocare il file cron.php ogni 5 minuti.", + "The cron.php needs to be executed by the system account \"{user}\"." : "Il cron.php deve essere eseguito dall'account di sistema \"{user}\".", "The PHP POSIX extension is required. See {linkstart}PHP documentation{linkend} for more details." : "È necessaria l'estensione POSIX di PHP. Vedi la {linkstart}documentazione di PHP{linkend} per maggiori dettagli.", "Unable to update background job mode" : "Impossibile aggiornare la modalità delle operazioni in background", "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Per un buon funzionamento del server, è importante configurare le operazioni in background correttamente. \"Cron\" è l'impostazione consigliata. Vedi la documentazione per ulteriori informazioni.", @@ -523,12 +536,14 @@ OC.L10N.register( "Password change is disabled because the master key is disabled" : "La modifica della password è disabilitata poiché la chiave principale è disabilitata", "Loading accounts …" : "Caricamento account in corso...", "Manager" : "Responsabile", + "Failed to search groups" : "Impossibile cercare i gruppi", "New account" : "Nuovo account", "Display name" : "Nome visualizzato", "Either password or email is required" : "La password o l'email è necessaria", "Password (required)" : "Password (richiesta)", "Email (required)" : "Email (richiesta)", "Email" : "Posta elettronica", + "Member of the following groups" : "Membro dei seguenti gruppi", "Quota" : "Quote", "Language" : "Lingua", "Set default language" : "Imposta lingua predefinita", diff --git a/apps/settings/l10n/it.json b/apps/settings/l10n/it.json index 7bc04158924..16d6b817633 100644 --- a/apps/settings/l10n/it.json +++ b/apps/settings/l10n/it.json @@ -254,6 +254,7 @@ "OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache non funziona come dovrebbe, opcache_get_status() restituisce false, controlla la configurazione.", "The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be kept in the cache, it is recommended to apply \"opcache.max_accelerated_files\" to your PHP configuration with a value higher than \"%s\"." : "Il numero massimo di chiavi OPcache è stato quasi superato. Per garantire che tutti gli script possano essere mantenuti nella cache, si consiglia di applicare \"opcache.max_accelerated_files\" alla configurazione PHP con un valore superiore a \"%s\".", "The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply \"opcache.memory_consumption\" to your PHP configuration with a value higher than \"%s\"." : "Il buffer OPcache è quasi pieno. Per garantire che tutti gli script possano essere conservati nella cache, si consiglia di applicare \"opcache.memory_consumption\" alla configurazione PHP con un valore superiore a \"%s\".", + "The PHP OPcache module is not properly configured. %s." : "Il modulo PHP OPcache non è correttamente configurato. %s.", "Correctly configured" : "Configurato correttamente", "PHP version" : "Versione PHP", "You are currently running PHP %s." : "Attualmente stai usando PHP %s.", @@ -302,7 +303,16 @@ "Enforce password protection" : "Imponi la protezione con password", "Exclude groups from password requirements" : "Escludi gruppi dai requisiti della password", "Exclude groups from creating link shares" : "Escludi gruppi dalla creazione dei collegamenti di condivisione", + "Allow users to set custom share link tokens" : "Consenti agli utenti di impostare token di collegamento personalizzati", + "Shares with custom tokens will continue to be accessible after this setting has been disabled" : "Le condivisioni con token personalizzati continueranno a essere accessibili dopo aver disabilitato questa impostazione", + "Shares with guessable tokens may be accessed easily" : "Le condivisioni con token indovinabili sono facilmente accessibili", + "Limit sharing based on groups" : "Limita la condivisione in base ai gruppi", + "Exclude some groups from sharing" : "Escludi alcuni gruppi dalla condivisione", + "Limit sharing to some groups" : "Limita la condivisione ad alcuni gruppi", + "Groups allowed to share" : "Gruppi autorizzati a condividere", "Groups excluded from sharing" : "Gruppi esclusi dalla condivisione", + "Not allowed groups will still be able to receive shares, but not to initiate them." : "I gruppi non autorizzati potranno comunque ricevere condivisioni, ma non avviarle.", + "Set default expiration date for internal shares" : "Imposta la data di scadenza predefinita per le condivisioni interne", "Enforce expiration date" : "Forza la data di scadenza", "Default expiration time of new shares in days" : "Scadenza predefinita delle nuove condivisioni in giorni", "Expire shares after x days" : "Scadenza delle condivisioni dopo x giorni", @@ -313,6 +323,7 @@ "Set default expiration date for shares via link or mail" : "Imposta la data di scadenza predefinita per le condivisioni tramite link o posta", "Default expiration time of shares in days" : "Scadenza predefinita delle condivisioni in giorni", "Privacy settings for sharing" : "Impostazioni sulla privacy per la condivisione", + "Allow account name autocompletion in share dialog and allow access to the system address book" : "Consenti il completamento automatico del nome dell'account nella finestra di dialogo di condivisione e consenti l'accesso alla rubrica di sistema", "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Se completamento di \"stesso gruppo\" e \"integrazione numero di telefono\" sono attivi, una corrispondenza in uno dei due è sufficiente per mostrare l'utente.", "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Consenti il completamento automatico quando inserisci il nome completo o l'indirizzo email (ignorando la corrispondenza della rubrica mancante e l'appartenenza allo stesso gruppo)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Mostra il testo della liberatoria sulla pagina di caricamento del collegamento pubblico (visualizzato solo quando l'elenco dei file è nascosto)", @@ -346,6 +357,7 @@ "No apps found for your version" : "Nessuna applicazione trovata per la tua versione", "_%n app has an update available_::_%n apps have an update available_" : ["%n applicazione ha un aggiornamento disponibile","%n applicazioni hanno un aggiornamento disponibile","%n applicazioni hanno un aggiornamento disponibile"], "_Update_::_Update all_" : ["Aggiorna","Aggiorna","Aggiorna tutto"], + "Failed to load groups" : "Impossibile caricare i gruppi", "Failed to create group" : "Creazione gruppo fallita", "Create group" : "Crea gruppo", "Group name" : "Nome del gruppo", @@ -421,6 +433,7 @@ "Password" : "Password", "Show QR code for mobile apps" : "Mostra il codice QR per le applicazioni mobili", "Use system cron service to call the cron.php file every 5 minutes." : "Usa il servizio cron di sistema per invocare il file cron.php ogni 5 minuti.", + "The cron.php needs to be executed by the system account \"{user}\"." : "Il cron.php deve essere eseguito dall'account di sistema \"{user}\".", "The PHP POSIX extension is required. See {linkstart}PHP documentation{linkend} for more details." : "È necessaria l'estensione POSIX di PHP. Vedi la {linkstart}documentazione di PHP{linkend} per maggiori dettagli.", "Unable to update background job mode" : "Impossibile aggiornare la modalità delle operazioni in background", "For the server to work properly, it's important to configure background jobs correctly. Cron is the recommended setting. Please see the documentation for more information." : "Per un buon funzionamento del server, è importante configurare le operazioni in background correttamente. \"Cron\" è l'impostazione consigliata. Vedi la documentazione per ulteriori informazioni.", @@ -521,12 +534,14 @@ "Password change is disabled because the master key is disabled" : "La modifica della password è disabilitata poiché la chiave principale è disabilitata", "Loading accounts …" : "Caricamento account in corso...", "Manager" : "Responsabile", + "Failed to search groups" : "Impossibile cercare i gruppi", "New account" : "Nuovo account", "Display name" : "Nome visualizzato", "Either password or email is required" : "La password o l'email è necessaria", "Password (required)" : "Password (richiesta)", "Email (required)" : "Email (richiesta)", "Email" : "Posta elettronica", + "Member of the following groups" : "Membro dei seguenti gruppi", "Quota" : "Quote", "Language" : "Lingua", "Set default language" : "Imposta lingua predefinita", diff --git a/apps/settings/tests/Activity/SecurityFilterTest.php b/apps/settings/tests/Activity/SecurityFilterTest.php index f3f94df3d21..22ef03816d3 100644 --- a/apps/settings/tests/Activity/SecurityFilterTest.php +++ b/apps/settings/tests/Activity/SecurityFilterTest.php @@ -12,15 +12,9 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class SecurityFilterTest extends TestCase { - - /** @var IURLGenerator|MockObject */ - private $urlGenerator; - - /** @var IL10N|MockObject */ - private $l10n; - - /** @var SecurityFilter */ - private $filter; + private IURLGenerator&MockObject $urlGenerator; + private IL10N&MockObject $l10n; + private SecurityFilter $filter; protected function setUp(): void { parent::setUp(); diff --git a/apps/settings/tests/Activity/SecurityProviderTest.php b/apps/settings/tests/Activity/SecurityProviderTest.php index 35526995a67..1687f116871 100644 --- a/apps/settings/tests/Activity/SecurityProviderTest.php +++ b/apps/settings/tests/Activity/SecurityProviderTest.php @@ -16,27 +16,19 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class SecurityProviderTest extends TestCase { - - /** @var IFactory|MockObject */ - private $l10n; - - /** @var IURLGenerator|MockObject */ - private $urlGenerator; - - /** @var IManager|MockObject */ - private $activityManager; - - /** @var SecurityProvider */ - private $provider; + private IFactory&MockObject $l10nFactory; + private IURLGenerator&MockObject $urlGenerator; + private IManager&MockObject $activityManager; + private SecurityProvider $provider; protected function setUp(): void { parent::setUp(); - $this->l10n = $this->createMock(IFactory::class); + $this->l10nFactory = $this->createMock(IFactory::class); $this->urlGenerator = $this->createMock(IURLGenerator::class); $this->activityManager = $this->createMock(IManager::class); - $this->provider = new SecurityProvider($this->l10n, $this->urlGenerator, $this->activityManager); + $this->provider = new SecurityProvider($this->l10nFactory, $this->urlGenerator, $this->activityManager); } public function testParseUnrelated(): void { @@ -50,7 +42,7 @@ class SecurityProviderTest extends TestCase { $this->provider->parse($lang, $event); } - public function subjectData() { + public static function subjectData(): array { return [ ['twofactor_success'], ['twofactor_failed'], @@ -60,7 +52,7 @@ class SecurityProviderTest extends TestCase { /** * @dataProvider subjectData */ - public function testParse($subject): void { + public function testParse(string $subject): void { $lang = 'ru'; $event = $this->createMock(IEvent::class); $l = $this->createMock(IL10N::class); @@ -68,7 +60,7 @@ class SecurityProviderTest extends TestCase { $event->expects($this->once()) ->method('getType') ->willReturn('security'); - $this->l10n->expects($this->once()) + $this->l10nFactory->expects($this->once()) ->method('get') ->with('settings', $lang) ->willReturn($l); @@ -104,7 +96,7 @@ class SecurityProviderTest extends TestCase { $event->expects($this->once()) ->method('getType') ->willReturn('security'); - $this->l10n->expects($this->once()) + $this->l10nFactory->expects($this->once()) ->method('get') ->with('settings', $lang) ->willReturn($l); diff --git a/apps/settings/tests/Activity/SecuritySettingTest.php b/apps/settings/tests/Activity/SecuritySettingTest.php index 1b2b0e3361c..c109a9f7fdf 100644 --- a/apps/settings/tests/Activity/SecuritySettingTest.php +++ b/apps/settings/tests/Activity/SecuritySettingTest.php @@ -12,8 +12,8 @@ use Test\TestCase; class SecuritySettingTest extends TestCase { private $l10n; - /** @var SecuritySetting */ - private $setting; + /** @var */ + private SecuritySetting $setting; protected function setUp(): void { parent::setUp(); diff --git a/apps/settings/tests/AppInfo/ApplicationTest.php b/apps/settings/tests/AppInfo/ApplicationTest.php index 677efdc64bf..85be8c56178 100644 --- a/apps/settings/tests/AppInfo/ApplicationTest.php +++ b/apps/settings/tests/AppInfo/ApplicationTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later @@ -26,11 +28,8 @@ use Test\TestCase; * @group DB */ class ApplicationTest extends TestCase { - /** @var Application */ - protected $app; - - /** @var IAppContainer */ - protected $container; + protected Application $app; + protected IAppContainer $container; protected function setUp(): void { parent::setUp(); @@ -43,7 +42,7 @@ class ApplicationTest extends TestCase { $this->assertEquals('settings', $this->container->getAppName()); } - public function dataContainerQuery() { + public static function dataContainerQuery(): array { return [ [AdminSettingsController::class, Controller::class], [AppSettingsController::class, Controller::class], @@ -59,10 +58,8 @@ class ApplicationTest extends TestCase { /** * @dataProvider dataContainerQuery - * @param string $service - * @param string $expected */ - public function testContainerQuery($service, $expected): void { + public function testContainerQuery(string $service, string $expected): void { $this->assertTrue($this->container->query($service) instanceof $expected); } } diff --git a/apps/settings/tests/Controller/AppSettingsControllerTest.php b/apps/settings/tests/Controller/AppSettingsControllerTest.php index f72bd45a3d2..5194ca2cc33 100644 --- a/apps/settings/tests/Controller/AppSettingsControllerTest.php +++ b/apps/settings/tests/Controller/AppSettingsControllerTest.php @@ -37,39 +37,23 @@ use Test\TestCase; * @group DB */ class AppSettingsControllerTest extends TestCase { - /** @var AppSettingsController */ - private $appSettingsController; - /** @var IRequest|MockObject */ - private $request; - /** @var IL10N|MockObject */ - private $l10n; - /** @var IConfig|MockObject */ - private $config; - /** @var INavigationManager|MockObject */ - private $navigationManager; + private IRequest&MockObject $request; + private IL10N&MockObject $l10n; + private IConfig&MockObject $config; + private INavigationManager&MockObject $navigationManager; private AppManager&MockObject $appManager; - /** @var CategoryFetcher|MockObject */ - private $categoryFetcher; - /** @var AppFetcher|MockObject */ - private $appFetcher; - /** @var IFactory|MockObject */ - private $l10nFactory; - /** @var BundleFetcher|MockObject */ - private $bundleFetcher; - /** @var Installer|MockObject */ - private $installer; - /** @var IURLGenerator|MockObject */ - private $urlGenerator; - /** @var LoggerInterface|MockObject */ - private $logger; - /** @var IInitialState|MockObject */ - private $initialState; - /** @var IAppDataFactory|MockObject */ - private $appDataFactory; - /** @var AppDiscoverFetcher|MockObject */ - private $discoverFetcher; - /** @var IClientService|MockObject */ - private $clientService; + private CategoryFetcher&MockObject $categoryFetcher; + private AppFetcher&MockObject $appFetcher; + private IFactory&MockObject $l10nFactory; + private BundleFetcher&MockObject $bundleFetcher; + private Installer&MockObject $installer; + private IURLGenerator&MockObject $urlGenerator; + private LoggerInterface&MockObject $logger; + private IInitialState&MockObject $initialState; + private IAppDataFactory&MockObject $appDataFactory; + private AppDiscoverFetcher&MockObject $discoverFetcher; + private IClientService&MockObject $clientService; + private AppSettingsController $appSettingsController; protected function setUp(): void { parent::setUp(); diff --git a/apps/settings/tests/Controller/AuthSettingsControllerTest.php b/apps/settings/tests/Controller/AuthSettingsControllerTest.php index 13213992d94..bb6068ffe94 100644 --- a/apps/settings/tests/Controller/AuthSettingsControllerTest.php +++ b/apps/settings/tests/Controller/AuthSettingsControllerTest.php @@ -28,24 +28,15 @@ use Psr\Log\LoggerInterface; use Test\TestCase; class AuthSettingsControllerTest extends TestCase { - - /** @var AuthSettingsController */ - private $controller; - /** @var IRequest|MockObject */ - private $request; - /** @var IProvider|MockObject */ - private $tokenProvider; - /** @var ISession|MockObject */ - private $session; - /** @var IUserSession|MockObject */ - private $userSession; - /** @var ISecureRandom|MockObject */ - private $secureRandom; - /** @var IManager|MockObject */ - private $activityManager; - /** @var RemoteWipe|MockObject */ - private $remoteWipe; - private $uid = 'jane'; + private IRequest&MockObject $request; + private IProvider&MockObject $tokenProvider; + private ISession&MockObject $session; + private IUserSession&MockObject $userSession; + private ISecureRandom&MockObject $secureRandom; + private IManager&MockObject $activityManager; + private RemoteWipe&MockObject $remoteWipe; + private string $uid = 'jane'; + private AuthSettingsController $controller; protected function setUp(): void { parent::setUp(); @@ -57,7 +48,7 @@ class AuthSettingsControllerTest extends TestCase { $this->secureRandom = $this->createMock(ISecureRandom::class); $this->activityManager = $this->createMock(IManager::class); $this->remoteWipe = $this->createMock(RemoteWipe::class); - /** @var LoggerInterface|MockObject $logger */ + /** @var LoggerInterface&MockObject $logger */ $logger = $this->createMock(LoggerInterface::class); $this->controller = new AuthSettingsController( @@ -214,7 +205,7 @@ class AuthSettingsControllerTest extends TestCase { $this->assertSame(\OCP\AppFramework\Http::STATUS_NOT_FOUND, $response->getStatus()); } - public function dataRenameToken(): array { + public static function dataRenameToken(): array { return [ 'App password => Other token name' => ['App password', 'Other token name'], 'Other token name => App password' => ['Other token name', 'App password'], @@ -223,9 +214,6 @@ class AuthSettingsControllerTest extends TestCase { /** * @dataProvider dataRenameToken - * - * @param string $name - * @param string $newName */ public function testUpdateRename(string $name, string $newName): void { $tokenId = 42; @@ -257,7 +245,7 @@ class AuthSettingsControllerTest extends TestCase { $this->assertSame([], $this->controller->update($tokenId, [IToken::SCOPE_FILESYSTEM => true], $newName)); } - public function dataUpdateFilesystemScope(): array { + public static function dataUpdateFilesystemScope(): array { return [ 'Grant filesystem access' => [false, true], 'Revoke filesystem access' => [true, false], @@ -266,9 +254,6 @@ class AuthSettingsControllerTest extends TestCase { /** * @dataProvider dataUpdateFilesystemScope - * - * @param bool $filesystem - * @param bool $newFilesystem */ public function testUpdateFilesystemScope(bool $filesystem, bool $newFilesystem): void { $tokenId = 42; diff --git a/apps/settings/tests/Controller/CheckSetupControllerTest.php b/apps/settings/tests/Controller/CheckSetupControllerTest.php index 27f7aa1b696..a8e89260573 100644 --- a/apps/settings/tests/Controller/CheckSetupControllerTest.php +++ b/apps/settings/tests/Controller/CheckSetupControllerTest.php @@ -29,59 +29,40 @@ use Test\TestCase; * @package Tests\Settings\Controller */ class CheckSetupControllerTest extends TestCase { - /** @var CheckSetupController | \PHPUnit\Framework\MockObject\MockObject */ - private $checkSetupController; - /** @var IRequest | \PHPUnit\Framework\MockObject\MockObject */ - private $request; - /** @var IConfig | \PHPUnit\Framework\MockObject\MockObject */ - private $config; - /** @var IURLGenerator | \PHPUnit\Framework\MockObject\MockObject */ - private $urlGenerator; - /** @var IL10N | \PHPUnit\Framework\MockObject\MockObject */ - private $l10n; - /** @var LoggerInterface */ - private $logger; - /** @var Checker|\PHPUnit\Framework\MockObject\MockObject */ - private $checker; - /** @var ISetupCheckManager|MockObject */ - private $setupCheckManager; + private IRequest&MockObject $request; + private IConfig&MockObject $config; + private IURLGenerator&MockObject $urlGenerator; + private IL10N&MockObject $l10n; + private LoggerInterface&MockObject $logger; + private Checker&MockObject $checker; + private ISetupCheckManager&MockObject $setupCheckManager; + private CheckSetupController $checkSetupController; protected function setUp(): void { parent::setUp(); - $this->request = $this->getMockBuilder(IRequest::class) - ->disableOriginalConstructor()->getMock(); - $this->config = $this->getMockBuilder(IConfig::class) - ->disableOriginalConstructor()->getMock(); - $this->urlGenerator = $this->getMockBuilder(IURLGenerator::class) - ->disableOriginalConstructor()->getMock(); - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + $this->request = $this->createMock(IRequest::class); + $this->config = $this->createMock(IConfig::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { return vsprintf($message, $replace); }); - $this->checker = $this->getMockBuilder('\OC\IntegrityCheck\Checker') - ->disableOriginalConstructor()->getMock(); - $this->logger = $this->getMockBuilder(LoggerInterface::class)->getMock(); + $this->checker = $this->createMock(Checker::class); + $this->logger = $this->createMock(LoggerInterface::class); $this->setupCheckManager = $this->createMock(ISetupCheckManager::class); - $this->checkSetupController = $this->getMockBuilder(CheckSetupController::class) - ->setConstructorArgs([ - 'settings', - $this->request, - $this->config, - $this->urlGenerator, - $this->l10n, - $this->checker, - $this->logger, - $this->setupCheckManager, - ]) - ->setMethods([ - 'getCurlVersion', - 'isPhpOutdated', - 'isPHPMailerUsed', - ])->getMock(); + $this->checkSetupController = new CheckSetupController( + 'settings', + $this->request, + $this->config, + $this->urlGenerator, + $this->l10n, + $this->checker, + $this->logger, + $this->setupCheckManager, + ); } public function testCheck(): void { diff --git a/apps/settings/tests/Controller/DelegationControllerTest.php b/apps/settings/tests/Controller/DelegationControllerTest.php index 5994ddf298d..c4cbe67466b 100644 --- a/apps/settings/tests/Controller/DelegationControllerTest.php +++ b/apps/settings/tests/Controller/DelegationControllerTest.php @@ -10,23 +10,18 @@ use OC\Settings\AuthorizedGroup; use OCA\Settings\Controller\AuthorizedGroupController; use OCA\Settings\Service\AuthorizedGroupService; use OCP\IRequest; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class DelegationControllerTest extends TestCase { - - /** @var AuthorizedGroupService */ - private $service; - - /** @var IRequest */ - private $request; - - /** @var AuthorizedGroupController */ - private $controller; + private AuthorizedGroupService&MockObject $service; + private IRequest&MockObject $request; + private AuthorizedGroupController $controller; protected function setUp(): void { parent::setUp(); - $this->request = $this->getMockBuilder(IRequest::class)->getMock(); - $this->service = $this->getMockBuilder(AuthorizedGroupService::class)->disableOriginalConstructor()->getMock(); + $this->request = $this->createMock(IRequest::class); + $this->service = $this->createMock(AuthorizedGroupService::class); $this->controller = new AuthorizedGroupController( 'settings', $this->request, $this->service ); @@ -41,7 +36,7 @@ class DelegationControllerTest extends TestCase { $this->service->expects($this->once()) ->method('findExistingGroupsForClass') ->with('MySecretSetting') - ->will($this->returnValue($oldGroups)); + ->willReturn($oldGroups); $this->service->expects($this->once()) ->method('delete') @@ -50,7 +45,7 @@ class DelegationControllerTest extends TestCase { $this->service->expects($this->once()) ->method('create') ->with('world', 'MySecretSetting') - ->will($this->returnValue(AuthorizedGroup::fromParams(['groupId' => 'world', 'class' => $setting]))); + ->willReturn(AuthorizedGroup::fromParams(['groupId' => 'world', 'class' => $setting])); $result = $this->controller->saveSettings([['gid' => 'hello'], ['gid' => 'world']], 'MySecretSetting'); diff --git a/apps/settings/tests/Controller/MailSettingsControllerTest.php b/apps/settings/tests/Controller/MailSettingsControllerTest.php index 2a0028738dd..dcb1e3efef4 100644 --- a/apps/settings/tests/Controller/MailSettingsControllerTest.php +++ b/apps/settings/tests/Controller/MailSettingsControllerTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later @@ -16,25 +18,18 @@ use OCP\IURLGenerator; use OCP\IUserSession; use OCP\Mail\IEMailTemplate; use OCP\Mail\IMailer; +use PHPUnit\Framework\MockObject\MockObject; /** * @package Tests\Settings\Controller */ class MailSettingsControllerTest extends \Test\TestCase { - - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $config; - /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */ - private $userSession; - /** @var IMailer|\PHPUnit\Framework\MockObject\MockObject */ - private $mailer; - /** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */ - private $l; - /** @var IURLGenerator */ - private $urlGenerator; - - /** @var MailSettingsController */ - private $mailController; + private IConfig&MockObject $config; + private IUserSession&MockObject $userSession; + private IMailer&MockObject $mailer; + private IL10N&MockObject $l; + private IURLGenerator&MockObject $urlGenerator; + private MailSettingsController $mailController; protected function setUp(): void { parent::setUp(); @@ -44,7 +39,7 @@ class MailSettingsControllerTest extends \Test\TestCase { $this->userSession = $this->createMock(IUserSession::class); $this->mailer = $this->createMock(IMailer::class); $this->urlGenerator = $this->createMock(IURLGenerator::class); - /** @var IRequest|\PHPUnit\Framework\MockObject\MockObject $request */ + /** @var IRequest&MockObject $request */ $request = $this->createMock(IRequest::class); $this->mailController = new MailSettingsController( 'settings', @@ -54,37 +49,40 @@ class MailSettingsControllerTest extends \Test\TestCase { $this->userSession, $this->urlGenerator, $this->mailer, - 'no-reply@nextcloud.com' ); } public function testSetMailSettings(): void { + $calls = [ + [[ + 'mail_domain' => 'nextcloud.com', + 'mail_from_address' => 'demo@nextcloud.com', + 'mail_smtpmode' => 'smtp', + 'mail_smtpsecure' => 'ssl', + 'mail_smtphost' => 'mx.nextcloud.org', + 'mail_smtpauth' => 1, + 'mail_smtpport' => '25', + 'mail_sendmailmode' => 'smtp', + ]], + [[ + 'mail_domain' => 'nextcloud.com', + 'mail_from_address' => 'demo@nextcloud.com', + 'mail_smtpmode' => 'smtp', + 'mail_smtpsecure' => 'ssl', + 'mail_smtphost' => 'mx.nextcloud.org', + 'mail_smtpauth' => null, + 'mail_smtpport' => '25', + 'mail_smtpname' => null, + 'mail_smtppassword' => null, + 'mail_sendmailmode' => 'smtp', + ]], + ]; $this->config->expects($this->exactly(2)) ->method('setSystemValues') - ->withConsecutive( - [[ - 'mail_domain' => 'nextcloud.com', - 'mail_from_address' => 'demo@nextcloud.com', - 'mail_smtpmode' => 'smtp', - 'mail_smtpsecure' => 'ssl', - 'mail_smtphost' => 'mx.nextcloud.org', - 'mail_smtpauth' => 1, - 'mail_smtpport' => '25', - 'mail_sendmailmode' => 'smtp', - ]], - [[ - 'mail_domain' => 'nextcloud.com', - 'mail_from_address' => 'demo@nextcloud.com', - 'mail_smtpmode' => 'smtp', - 'mail_smtpsecure' => 'ssl', - 'mail_smtphost' => 'mx.nextcloud.org', - 'mail_smtpauth' => null, - 'mail_smtpport' => '25', - 'mail_smtpname' => null, - 'mail_smtppassword' => null, - 'mail_sendmailmode' => 'smtp', - ]] - ); + ->willReturnCallback(function () use (&$calls) { + $expected = array_shift($calls); + $this->assertEquals($expected, func_get_args()); + }); // With authentication $response = $this->mailController->setMailSettings( @@ -93,7 +91,7 @@ class MailSettingsControllerTest extends \Test\TestCase { 'smtp', 'ssl', 'mx.nextcloud.org', - 1, + '1', '25', 'smtp' ); @@ -106,7 +104,7 @@ class MailSettingsControllerTest extends \Test\TestCase { 'smtp', 'ssl', 'mx.nextcloud.org', - 0, + '0', '25', 'smtp' ); diff --git a/apps/settings/tests/Controller/TwoFactorSettingsControllerTest.php b/apps/settings/tests/Controller/TwoFactorSettingsControllerTest.php index c34b2907dfd..9f8d53d4f9f 100644 --- a/apps/settings/tests/Controller/TwoFactorSettingsControllerTest.php +++ b/apps/settings/tests/Controller/TwoFactorSettingsControllerTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later @@ -14,15 +16,9 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class TwoFactorSettingsControllerTest extends TestCase { - - /** @var IRequest|MockObject */ - private $request; - - /** @var MandatoryTwoFactor|MockObject */ - private $mandatoryTwoFactor; - - /** @var TwoFactorSettingsController */ - private $controller; + private IRequest&MockObject $request; + private MandatoryTwoFactor&MockObject $mandatoryTwoFactor; + private TwoFactorSettingsController $controller; protected function setUp(): void { parent::setUp(); diff --git a/apps/settings/tests/Controller/UsersControllerTest.php b/apps/settings/tests/Controller/UsersControllerTest.php index 96823e5ceed..d5fe38ad458 100644 --- a/apps/settings/tests/Controller/UsersControllerTest.php +++ b/apps/settings/tests/Controller/UsersControllerTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2014-2015 ownCloud, Inc. @@ -40,38 +42,22 @@ use PHPUnit\Framework\MockObject\MockObject; * @package Tests\Settings\Controller */ class UsersControllerTest extends \Test\TestCase { - /** @var IGroupManager|\PHPUnit\Framework\MockObject\MockObject */ - private $groupManager; - /** @var UserManager|\PHPUnit\Framework\MockObject\MockObject */ - private $userManager; - /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */ - private $userSession; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $config; - /** @var IMailer|\PHPUnit\Framework\MockObject\MockObject */ - private $mailer; - /** @var IFactory|\PHPUnit\Framework\MockObject\MockObject */ - private $l10nFactory; - /** @var IAppManager|\PHPUnit\Framework\MockObject\MockObject */ - private $appManager; - /** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */ - private $l; - /** @var AccountManager|\PHPUnit\Framework\MockObject\MockObject */ - private $accountManager; - /** @var IJobList | \PHPUnit\Framework\MockObject\MockObject */ - private $jobList; - /** @var \OC\Security\IdentityProof\Manager|\PHPUnit\Framework\MockObject\MockObject */ - private $securityManager; - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - private $encryptionManager; - /** @var KnownUserService|\PHPUnit\Framework\MockObject\MockObject */ - private $knownUserService; - /** @var IEncryptionModule|\PHPUnit\Framework\MockObject\MockObject */ - private $encryptionModule; - /** @var IEventDispatcher|\PHPUnit\Framework\MockObject\MockObject */ - private $dispatcher; - /** @var IInitialState|\PHPUnit\Framework\MockObject\MockObject */ - private $initialState; + private IGroupManager&MockObject $groupManager; + private UserManager&MockObject $userManager; + private IUserSession&MockObject $userSession; + private IConfig&MockObject $config; + private IMailer&MockObject $mailer; + private IFactory&MockObject $l10nFactory; + private IAppManager&MockObject $appManager; + private IL10N&MockObject $l; + private AccountManager&MockObject $accountManager; + private IJobList&MockObject $jobList; + private \OC\Security\IdentityProof\Manager&MockObject $securityManager; + private IManager&MockObject $encryptionManager; + private KnownUserService&MockObject $knownUserService; + private IEncryptionModule&MockObject $encryptionModule; + private IEventDispatcher&MockObject $dispatcher; + private IInitialState&MockObject $initialState; protected function setUp(): void { parent::setUp(); @@ -85,7 +71,7 @@ class UsersControllerTest extends \Test\TestCase { $this->l10nFactory = $this->createMock(IFactory::class); $this->appManager = $this->createMock(IAppManager::class); $this->accountManager = $this->createMock(AccountManager::class); - $this->securityManager = $this->getMockBuilder(\OC\Security\IdentityProof\Manager::class)->disableOriginalConstructor()->getMock(); + $this->securityManager = $this->createMock(\OC\Security\IdentityProof\Manager::class); $this->jobList = $this->createMock(IJobList::class); $this->encryptionManager = $this->createMock(IManager::class); $this->knownUserService = $this->createMock(KnownUserService::class); @@ -106,9 +92,9 @@ class UsersControllerTest extends \Test\TestCase { /** * @param bool $isAdmin - * @return UsersController | \PHPUnit\Framework\MockObject\MockObject + * @return UsersController|MockObject */ - protected function getController($isAdmin = false, $mockedMethods = []) { + protected function getController(bool $isAdmin = false, array $mockedMethods = []) { $this->groupManager->expects($this->any()) ->method('isAdmin') ->willReturn($isAdmin); @@ -155,7 +141,9 @@ class UsersControllerTest extends \Test\TestCase { $this->dispatcher, $this->initialState, ] - )->onlyMethods($mockedMethods)->getMock(); + ) + ->onlyMethods($mockedMethods) + ->getMock(); } } @@ -177,7 +165,7 @@ class UsersControllerTest extends \Test\TestCase { return $property; } - protected function getDefaultAccountMock(bool $useDefaultValues = true): MockObject { + protected function getDefaultAccountMock(): MockObject { $propertyMocks = [ IAccountManager::PROPERTY_DISPLAYNAME => $this->buildPropertyMock( IAccountManager::PROPERTY_DISPLAYNAME, @@ -249,12 +237,8 @@ class UsersControllerTest extends \Test\TestCase { /** * @dataProvider dataTestSetUserSettings - * - * @param string $email - * @param bool $validEmail - * @param $expectedStatus */ - public function testSetUserSettings($email, $validEmail, $expectedStatus): void { + public function testSetUserSettings(string $email, bool $validEmail, int $expectedStatus): void { $controller = $this->getController(false, ['saveUserSettings']); $user = $this->createMock(IUser::class); $user->method('getUID')->willReturn('johndoe'); @@ -305,7 +289,7 @@ class UsersControllerTest extends \Test\TestCase { $this->assertSame($expectedStatus, $result->getStatus()); } - public function dataTestSetUserSettings() { + public static function dataTestSetUserSettings(): array { return [ ['', true, Http::STATUS_OK], ['', false, Http::STATUS_OK], @@ -515,18 +499,15 @@ class UsersControllerTest extends \Test\TestCase { /** * @dataProvider dataTestSetUserSettingsSubset - * - * @param string $property - * @param string $propertyValue */ - public function testSetUserSettingsSubset($property, $propertyValue): void { + public function testSetUserSettingsSubset(string $property, string $propertyValue): void { $controller = $this->getController(false, ['saveUserSettings']); $user = $this->createMock(IUser::class); $user->method('getUID')->willReturn('johndoe'); $this->userSession->method('getUser')->willReturn($user); - /** @var IAccount|MockObject $userAccount */ + /** @var IAccount&MockObject $userAccount */ $userAccount = $this->getDefaultAccountMock(); $this->accountManager->expects($this->once()) @@ -554,9 +535,9 @@ class UsersControllerTest extends \Test\TestCase { $pronouns = ($property === 'pronouns') ? $propertyValue : null; $pronounsScope = ($property === 'pronounsScope') ? $propertyValue : null; - /** @var IAccountProperty[]|MockObject[] $expectedProperties */ + /** @var IAccountProperty[]&MockObject[] $expectedProperties */ $expectedProperties = $userAccount->getProperties(); - $isScope = strrpos($property, 'Scope') === strlen($property) - strlen(5); + $isScope = strrpos($property, 'Scope') === strlen($property) - strlen('5'); switch ($property) { case 'avatarScope': $propertyId = IAccountManager::PROPERTY_AVATAR; @@ -636,7 +617,7 @@ class UsersControllerTest extends \Test\TestCase { ); } - public function dataTestSetUserSettingsSubset() { + public static function dataTestSetUserSettingsSubset(): array { return [ ['avatarScope', IAccountManager::SCOPE_PUBLISHED], ['displayName', 'Display name'], @@ -662,15 +643,8 @@ class UsersControllerTest extends \Test\TestCase { /** * @dataProvider dataTestSaveUserSettings - * - * @param array $data - * @param ?string $oldEmailAddress - * @param ?string $oldDisplayName */ - public function testSaveUserSettings($data, - $oldEmailAddress, - $oldDisplayName, - ): void { + public function testSaveUserSettings(array $data, ?string $oldEmailAddress, ?string $oldDisplayName): void { $controller = $this->getController(); $user = $this->createMock(IUser::class); @@ -722,7 +696,7 @@ class UsersControllerTest extends \Test\TestCase { $this->invokePrivate($controller, 'saveUserSettings', [$account]); } - public function dataTestSaveUserSettings() { + public static function dataTestSaveUserSettings(): array { return [ [ [ @@ -833,7 +807,7 @@ class UsersControllerTest extends \Test\TestCase { } - public function dataTestSaveUserSettingsException() { + public static function dataTestSaveUserSettingsException(): array { return [ [ [ @@ -870,14 +844,9 @@ class UsersControllerTest extends \Test\TestCase { } /** - * @param string $account - * @param string $type - * @param array $dataBefore - * @param array $expectedData - * * @dataProvider dataTestGetVerificationCode */ - public function testGetVerificationCode($account, $type, $dataBefore, $expectedData, $onlyVerificationCode): void { + public function testGetVerificationCode(string $account, string $type, array $dataBefore, array $expectedData, bool $onlyVerificationCode): void { $message = 'Use my Federated Cloud ID to share with me: user@nextcloud.com'; $signature = 'theSignature'; @@ -936,7 +905,7 @@ class UsersControllerTest extends \Test\TestCase { $this->assertSame($code, $data['code']); } - public function dataTestGetVerificationCode() { + public static function dataTestGetVerificationCode(): array { $accountDataBefore = [ IAccountManager::PROPERTY_WEBSITE => ['value' => 'https://nextcloud.com', 'verified' => IAccountManager::NOT_VERIFIED], IAccountManager::PROPERTY_TWITTER => ['value' => '@nextclouders', 'verified' => IAccountManager::NOT_VERIFIED, 'signature' => 'theSignature'], @@ -973,16 +942,13 @@ class UsersControllerTest extends \Test\TestCase { /** * @dataProvider dataTestCanAdminChangeUserPasswords - * - * @param bool $encryptionEnabled - * @param bool $encryptionModuleLoaded - * @param bool $masterKeyEnabled - * @param bool $expected */ - public function testCanAdminChangeUserPasswords($encryptionEnabled, - $encryptionModuleLoaded, - $masterKeyEnabled, - $expected): void { + public function testCanAdminChangeUserPasswords( + bool $encryptionEnabled, + bool $encryptionModuleLoaded, + bool $masterKeyEnabled, + bool $expected, + ): void { $controller = $this->getController(); $this->encryptionManager->expects($this->any()) @@ -1005,7 +971,7 @@ class UsersControllerTest extends \Test\TestCase { $this->assertSame($expected, $result); } - public function dataTestCanAdminChangeUserPasswords() { + public static function dataTestCanAdminChangeUserPasswords(): array { return [ // encryptionEnabled, encryptionModuleLoaded, masterKeyEnabled, expectedResult [true, true, true, true], diff --git a/apps/settings/tests/Mailer/NewUserMailHelperTest.php b/apps/settings/tests/Mailer/NewUserMailHelperTest.php index 1a1fc20354b..26a2bf5a6b6 100644 --- a/apps/settings/tests/Mailer/NewUserMailHelperTest.php +++ b/apps/settings/tests/Mailer/NewUserMailHelperTest.php @@ -20,29 +20,20 @@ use OCP\Mail\IEMailTemplate; use OCP\Mail\IMailer; use OCP\Security\ICrypto; use OCP\Security\ISecureRandom; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class NewUserMailHelperTest extends TestCase { - /** @var Defaults|\PHPUnit\Framework\MockObject\MockObject */ - private $defaults; - /** @var IURLGenerator|\PHPUnit\Framework\MockObject\MockObject */ - private $urlGenerator; - /** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */ - private $l10n; - /** @var IFactory|\PHPUnit\Framework\MockObject\MockObject */ - private $l10nFactory; - /** @var IMailer|\PHPUnit\Framework\MockObject\MockObject */ - private $mailer; - /** @var ISecureRandom|\PHPUnit\Framework\MockObject\MockObject */ - private $secureRandom; - /** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */ - private $timeFactory; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $config; - /** @var ICrypto|\PHPUnit\Framework\MockObject\MockObject */ - private $crypto; - /** @var NewUserMailHelper */ - private $newUserMailHelper; + private Defaults&MockObject $defaults; + private IURLGenerator&MockObject $urlGenerator; + private IL10N&MockObject $l10n; + private IFactory&MockObject $l10nFactory; + private IMailer&MockObject $mailer; + private ISecureRandom&MockObject $secureRandom; + private ITimeFactory&MockObject $timeFactory; + private IConfig&MockObject $config; + private ICrypto&MockObject $crypto; + private NewUserMailHelper $newUserMailHelper; protected function setUp(): void { parent::setUp(); @@ -113,7 +104,7 @@ class NewUserMailHelperTest extends TestCase { ->expects($this->once()) ->method('getTime') ->willReturn(12345); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + /** @var IUser&MockObject $user */ $user = $this->createMock(IUser::class); $user ->expects($this->any()) @@ -371,7 +362,7 @@ EOF; ['myLogo',''], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + /** @var IUser&MockObject $user */ $user = $this->createMock(IUser::class); $user ->expects($this->any()) @@ -611,7 +602,7 @@ EOF; ['myLogo', ''], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + /** @var IUser&MockObject $user */ $user = $this->createMock(IUser::class); $user ->expects($this->any()) @@ -830,7 +821,7 @@ EOF; } public function testSendMail(): void { - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + /** @var IUser&MockObject $user */ $user = $this->createMock(IUser::class); $user ->expects($this->once()) @@ -840,7 +831,7 @@ EOF; ->expects($this->once()) ->method('getDisplayName') ->willReturn('John Doe'); - /** @var IEMailTemplate|\PHPUnit\Framework\MockObject\MockObject $emailTemplate */ + /** @var IEMailTemplate&MockObject $emailTemplate */ $emailTemplate = $this->createMock(IEMailTemplate::class); $message = $this->createMock(Message::class); $message diff --git a/apps/settings/tests/Middleware/SubadminMiddlewareTest.php b/apps/settings/tests/Middleware/SubadminMiddlewareTest.php index 2992810af6c..37cfb5ccc59 100644 --- a/apps/settings/tests/Middleware/SubadminMiddlewareTest.php +++ b/apps/settings/tests/Middleware/SubadminMiddlewareTest.php @@ -29,7 +29,6 @@ use PHPUnit\Framework\MockObject\MockObject; */ class SubadminMiddlewareTest extends \Test\TestCase { private SubadminMiddleware $subadminMiddleware; - private IUserSession&MockObject $userSession; private ISubAdmin&MockObject $subAdminManager; private ControllerMethodReflector&MockObject $reflector; @@ -38,8 +37,7 @@ class SubadminMiddlewareTest extends \Test\TestCase { protected function setUp(): void { parent::setUp(); - $this->reflector = $this->getMockBuilder(ControllerMethodReflector::class) - ->disableOriginalConstructor()->getMock(); + $this->reflector = $this->createMock(ControllerMethodReflector::class); $this->userSession = $this->createMock(IUserSession::class); $this->subAdminManager = $this->createMock(ISubAdmin::class); $this->l10n = $this->createMock(IL10N::class); @@ -51,8 +49,7 @@ class SubadminMiddlewareTest extends \Test\TestCase { $this->l10n, ); - $this->controller = $this->getMockBuilder(Controller::class) - ->disableOriginalConstructor()->getMock(); + $this->controller = $this->createMock(Controller::class); $this->userSession ->expects(self::any()) @@ -67,10 +64,10 @@ class SubadminMiddlewareTest extends \Test\TestCase { $this->reflector ->expects($this->exactly(2)) ->method('hasAnnotation') - ->withConsecutive( - ['NoSubAdminRequired'], - ['AuthorizedAdminSetting'], - )->willReturn(false); + ->willReturnMap([ + ['NoSubAdminRequired', false], + ['AuthorizedAdminSetting', false], + ]); $this->subAdminManager ->expects(self::once()) @@ -99,10 +96,10 @@ class SubadminMiddlewareTest extends \Test\TestCase { $this->reflector ->expects($this->exactly(2)) ->method('hasAnnotation') - ->withConsecutive( - ['NoSubAdminRequired'], - ['AuthorizedAdminSetting'], - )->willReturn(false); + ->willReturnMap([ + ['NoSubAdminRequired', false], + ['AuthorizedAdminSetting', false], + ]); $this->subAdminManager ->expects(self::once()) diff --git a/apps/settings/tests/Settings/Admin/MailTest.php b/apps/settings/tests/Settings/Admin/MailTest.php index 560e4f8e997..37d7cb7d56d 100644 --- a/apps/settings/tests/Settings/Admin/MailTest.php +++ b/apps/settings/tests/Settings/Admin/MailTest.php @@ -21,8 +21,8 @@ class MailTest extends TestCase { protected function setUp(): void { parent::setUp(); - $this->config = $this->getMockBuilder(IConfig::class)->getMock(); - $this->l10n = $this->getMockBuilder(IL10N::class)->getMock(); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); $this->admin = new Mail( $this->config, diff --git a/apps/settings/tests/Settings/Admin/SecurityTest.php b/apps/settings/tests/Settings/Admin/SecurityTest.php index 95b5e988397..63b52dd8616 100644 --- a/apps/settings/tests/Settings/Admin/SecurityTest.php +++ b/apps/settings/tests/Settings/Admin/SecurityTest.php @@ -16,21 +16,16 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class SecurityTest extends TestCase { - /** @var Security */ - private $admin; - /** @var Manager */ - private $manager; - /** @var IUserManager */ - private $userManager; - /** @var MandatoryTwoFactor|MockObject */ - private $mandatoryTwoFactor; - /** @var IInitialState|MockObject */ - private $initialState; + private Manager $manager; + private IUserManager $userManager; + private MandatoryTwoFactor&MockObject $mandatoryTwoFactor; + private IInitialState&MockObject $initialState; + private Security $admin; protected function setUp(): void { parent::setUp(); - $this->manager = $this->getMockBuilder(Manager::class)->disableOriginalConstructor()->getMock(); - $this->userManager = $this->getMockBuilder(IUserManager::class)->getMock(); + $this->manager = $this->createMock(Manager::class); + $this->userManager = $this->createMock(IUserManager::class); $this->mandatoryTwoFactor = $this->createMock(MandatoryTwoFactor::class); $this->initialState = $this->createMock(IInitialState::class); @@ -43,10 +38,7 @@ class SecurityTest extends TestCase { ); } - /** - * @return array - */ - public function encryptionSettingsProvider() { + public static function encryptionSettingsProvider(): array { return [ [true], [false], @@ -55,9 +47,8 @@ class SecurityTest extends TestCase { /** * @dataProvider encryptionSettingsProvider - * @param bool $enabled */ - public function testGetFormWithOnlyOneBackend($enabled): void { + public function testGetFormWithOnlyOneBackend(bool $enabled): void { $this->manager ->expects($this->once()) ->method('isEnabled') diff --git a/apps/settings/tests/Settings/Admin/ServerTest.php b/apps/settings/tests/Settings/Admin/ServerTest.php index 35a8a3ce7f7..e2ca4cff3c6 100644 --- a/apps/settings/tests/Settings/Admin/ServerTest.php +++ b/apps/settings/tests/Settings/Admin/ServerTest.php @@ -25,24 +25,15 @@ use Test\TestCase; * @group DB */ class ServerTest extends TestCase { - /** @var IDBConnection */ - private $connection; - /** @var Server&MockObject */ - private $admin; - /** @var IInitialState&MockObject */ - private $initialStateService; - /** @var ProfileManager&MockObject */ - private $profileManager; - /** @var ITimeFactory&MockObject */ - private $timeFactory; - /** @var IConfig&MockObject */ - private $config; - /** @var IAppConfig&MockObject */ - private $appConfig; - /** @var IL10N&MockObject */ - private $l10n; - /** @var IUrlGenerator&MockObject */ - private $urlGenerator; + private IDBConnection $connection; + private Server&MockObject $admin; + private IInitialState&MockObject $initialStateService; + private ProfileManager&MockObject $profileManager; + private ITimeFactory&MockObject $timeFactory; + private IConfig&MockObject $config; + private IAppConfig&MockObject $appConfig; + private IL10N&MockObject $l10n; + private IUrlGenerator&MockObject $urlGenerator; protected function setUp(): void { parent::setUp(); diff --git a/apps/settings/tests/Settings/Admin/SharingTest.php b/apps/settings/tests/Settings/Admin/SharingTest.php index 048634be1e0..bd1a7a1045b 100644 --- a/apps/settings/tests/Settings/Admin/SharingTest.php +++ b/apps/settings/tests/Settings/Admin/SharingTest.php @@ -18,34 +18,22 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class SharingTest extends TestCase { - /** @var Sharing */ - private $admin; - /** @var IConfig&MockObject */ - private $config; - /** @var IL10N&MockObject */ - private $l10n; - /** @var IManager|MockObject */ - private $shareManager; - /** @var IAppManager|MockObject */ - private $appManager; - /** @var IURLGenerator|MockObject */ - private $urlGenerator; - /** @var IInitialState|MockObject */ - private $initialState; + private IConfig&MockObject $config; + private IL10N&MockObject $l10n; + private IManager&MockObject $shareManager; + private IAppManager&MockObject $appManager; + private IURLGenerator&MockObject $urlGenerator; + private IInitialState&MockObject $initialState; + private Sharing $admin; protected function setUp(): void { parent::setUp(); - $this->config = $this->getMockBuilder(IConfig::class)->getMock(); - $this->l10n = $this->getMockBuilder(IL10N::class)->getMock(); - - /** @var IManager|MockObject */ - $this->shareManager = $this->getMockBuilder(IManager::class)->getMock(); - /** @var IAppManager|MockObject */ - $this->appManager = $this->getMockBuilder(IAppManager::class)->getMock(); - /** @var IURLGenerator|MockObject */ - $this->urlGenerator = $this->getMockBuilder(IURLGenerator::class)->getMock(); - /** @var IInitialState|MockObject */ - $this->initialState = $this->getMockBuilder(IInitialState::class)->getMock(); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + $this->shareManager = $this->createMock(IManager::class); + $this->appManager = $this->createMock(IAppManager::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->initialState = $this->createMock(IInitialState::class); $this->admin = new Sharing( $this->config, @@ -104,7 +92,7 @@ class SharingTest extends TestCase { ->willReturnCallback(function (string $key) use (&$initialStateCalls): void { $initialStateCalls[$key] = func_get_args(); }); - + $expectedInitialStateCalls = [ 'sharingAppEnabled' => false, 'sharingDocumentation' => '', diff --git a/apps/settings/tests/Settings/Personal/Security/AuthtokensTest.php b/apps/settings/tests/Settings/Personal/Security/AuthtokensTest.php index 44641ee98b3..f6f82ab311a 100644 --- a/apps/settings/tests/Settings/Personal/Security/AuthtokensTest.php +++ b/apps/settings/tests/Settings/Personal/Security/AuthtokensTest.php @@ -20,24 +20,12 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class AuthtokensTest extends TestCase { - - /** @var IAuthTokenProvider|MockObject */ - private $authTokenProvider; - - /** @var ISession|MockObject */ - private $session; - - /** @var IUserSession|MockObject */ - private $userSession; - - /** @var IInitialState|MockObject */ - private $initialState; - - /** @var string */ - private $uid; - - /** @var Authtokens */ - private $section; + private IAuthTokenProvider&MockObject $authTokenProvider; + private ISession&MockObject $session; + private IUserSession&MockObject $userSession; + private IInitialState&MockObject $initialState; + private string $uid; + private Authtokens $section; protected function setUp(): void { parent::setUp(); @@ -80,34 +68,39 @@ class AuthtokensTest extends TestCase { ->method('getToken') ->with('session123') ->willReturn($sessionToken); + + $calls = [ + [ + 'app_tokens', [ + [ + 'id' => 100, + 'name' => null, + 'lastActivity' => 0, + 'type' => 0, + 'canDelete' => false, + 'current' => true, + 'scope' => [IToken::SCOPE_FILESYSTEM => true], + 'canRename' => false, + ], + [ + 'id' => 200, + 'name' => null, + 'lastActivity' => 0, + 'type' => 0, + 'canDelete' => true, + 'scope' => [IToken::SCOPE_FILESYSTEM => true], + 'canRename' => true, + ], + ] + ], + ['can_create_app_token', true], + ]; $this->initialState->expects($this->exactly(2)) ->method('provideInitialState') - ->withConsecutive( - [ - 'app_tokens', [ - [ - 'id' => 100, - 'name' => null, - 'lastActivity' => 0, - 'type' => 0, - 'canDelete' => false, - 'current' => true, - 'scope' => [IToken::SCOPE_FILESYSTEM => true], - 'canRename' => false, - ], - [ - 'id' => 200, - 'name' => null, - 'lastActivity' => 0, - 'type' => 0, - 'canDelete' => true, - 'scope' => [IToken::SCOPE_FILESYSTEM => true], - 'canRename' => true, - ], - ] - ], - ['can_create_app_token', true], - ); + ->willReturnCallback(function () use (&$calls) { + $expected = array_shift($calls); + $this->assertEquals($expected, func_get_args()); + }); $form = $this->section->getForm(); diff --git a/apps/settings/tests/Settings/Personal/Security/PasswordTest.php b/apps/settings/tests/Settings/Personal/Security/PasswordTest.php index 62f2c998943..34a4b8e296f 100644 --- a/apps/settings/tests/Settings/Personal/Security/PasswordTest.php +++ b/apps/settings/tests/Settings/Personal/Security/PasswordTest.php @@ -16,15 +16,9 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class PasswordTest extends TestCase { - - /** @var IUserManager|MockObject */ - private $userManager; - - /** @var string */ - private $uid; - - /** @var Password */ - private $section; + private IUserManager&MockObject $userManager; + private string $uid; + private Password $section; protected function setUp(): void { parent::setUp(); diff --git a/apps/settings/tests/SetupChecks/AppDirsWithDifferentOwnerTest.php b/apps/settings/tests/SetupChecks/AppDirsWithDifferentOwnerTest.php index db3141e3a26..423f932dcf5 100644 --- a/apps/settings/tests/SetupChecks/AppDirsWithDifferentOwnerTest.php +++ b/apps/settings/tests/SetupChecks/AppDirsWithDifferentOwnerTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\AppDirsWithDifferentOwner; use OCP\IL10N; @@ -26,8 +26,7 @@ class AppDirsWithDifferentOwnerTest extends TestCase { protected function setUp(): void { parent::setUp(); - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { diff --git a/apps/settings/tests/SetupChecks/CodeIntegrityTest.php b/apps/settings/tests/SetupChecks/CodeIntegrityTest.php index 52101aed901..4dd54a644f5 100644 --- a/apps/settings/tests/SetupChecks/CodeIntegrityTest.php +++ b/apps/settings/tests/SetupChecks/CodeIntegrityTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OC\IntegrityCheck\Checker; use OCA\Settings\SetupChecks\CodeIntegrity; @@ -17,7 +17,7 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class CodeIntegrityTest extends TestCase { - + private IL10N&MockObject $l10n; private IURLGenerator&MockObject $urlGenerator; private Checker&MockObject $checker; @@ -25,8 +25,7 @@ class CodeIntegrityTest extends TestCase { protected function setUp(): void { parent::setUp(); - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { diff --git a/apps/settings/tests/SetupChecks/DataDirectoryProtectedTest.php b/apps/settings/tests/SetupChecks/DataDirectoryProtectedTest.php index 51dffe58787..a48c6296aff 100644 --- a/apps/settings/tests/SetupChecks/DataDirectoryProtectedTest.php +++ b/apps/settings/tests/SetupChecks/DataDirectoryProtectedTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\DataDirectoryProtected; use OCP\Http\Client\IClientService; @@ -30,9 +30,7 @@ class DataDirectoryProtectedTest extends TestCase { protected function setUp(): void { parent::setUp(); - /** @var IL10N&MockObject */ - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { diff --git a/apps/settings/tests/SetupChecks/ForwardedForHeadersTest.php b/apps/settings/tests/SetupChecks/ForwardedForHeadersTest.php index b8b25e74c63..b57eb852d80 100644 --- a/apps/settings/tests/SetupChecks/ForwardedForHeadersTest.php +++ b/apps/settings/tests/SetupChecks/ForwardedForHeadersTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\ForwardedForHeaders; use OCP\IConfig; @@ -26,8 +26,7 @@ class ForwardedForHeadersTest extends TestCase { protected function setUp(): void { parent::setUp(); - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { @@ -68,7 +67,7 @@ class ForwardedForHeadersTest extends TestCase { ); } - public function dataForwardedForHeadersWorking(): array { + public static function dataForwardedForHeadersWorking(): array { return [ // description => trusted proxies, getHeader('REMOTE_ADDR'), getRemoteAddr, expected result 'no trusted proxies' => [[], '2.2.2.2', '2.2.2.2', SetupResult::SUCCESS], diff --git a/apps/settings/tests/SetupChecks/LoggingLevelTest.php b/apps/settings/tests/SetupChecks/LoggingLevelTest.php index d87f66bb484..9d588a4e486 100644 --- a/apps/settings/tests/SetupChecks/LoggingLevelTest.php +++ b/apps/settings/tests/SetupChecks/LoggingLevelTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\LoggingLevel; use OCP\IConfig; @@ -60,7 +60,7 @@ class LoggingLevelTest extends TestCase { } /** @dataProvider dataRun */ - public function testRun(mixed $value, string $expected): void { + public function testRun(string|int $value, string $expected): void { $this->urlGenerator->method('linkToDocs')->willReturn('admin-logging'); $this->config->expects(self::once()) diff --git a/apps/settings/tests/SetupChecks/OcxProvicersTest.php b/apps/settings/tests/SetupChecks/OcxProvicersTest.php index 4c2b36a8325..8e5a2c1b88b 100644 --- a/apps/settings/tests/SetupChecks/OcxProvicersTest.php +++ b/apps/settings/tests/SetupChecks/OcxProvicersTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\OcxProviders; use OCP\Http\Client\IClientService; @@ -30,9 +30,7 @@ class OcxProvicersTest extends TestCase { protected function setUp(): void { parent::setUp(); - /** @var IL10N|MockObject */ - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { diff --git a/apps/settings/tests/SetupChecks/PhpDefaultCharsetTest.php b/apps/settings/tests/SetupChecks/PhpDefaultCharsetTest.php index 4fba60cf72f..3722346219a 100644 --- a/apps/settings/tests/SetupChecks/PhpDefaultCharsetTest.php +++ b/apps/settings/tests/SetupChecks/PhpDefaultCharsetTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\PhpDefaultCharset; use OCP\IL10N; @@ -21,8 +21,7 @@ class PhpDefaultCharsetTest extends TestCase { protected function setUp(): void { parent::setUp(); - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { diff --git a/apps/settings/tests/SetupChecks/PhpOutputBufferingTest.php b/apps/settings/tests/SetupChecks/PhpOutputBufferingTest.php index 69194df81c5..de509347044 100644 --- a/apps/settings/tests/SetupChecks/PhpOutputBufferingTest.php +++ b/apps/settings/tests/SetupChecks/PhpOutputBufferingTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\PhpOutputBuffering; use OCP\IL10N; @@ -21,8 +21,7 @@ class PhpOutputBufferingTest extends TestCase { protected function setUp(): void { parent::setUp(); - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { diff --git a/apps/settings/tests/SetupChecks/SecurityHeadersTest.php b/apps/settings/tests/SetupChecks/SecurityHeadersTest.php index d8bb51d47c6..e7d87775485 100644 --- a/apps/settings/tests/SetupChecks/SecurityHeadersTest.php +++ b/apps/settings/tests/SetupChecks/SecurityHeadersTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\SecurityHeaders; use OCP\Http\Client\IClientService; @@ -20,19 +20,17 @@ use Psr\Log\LoggerInterface; use Test\TestCase; class SecurityHeadersTest extends TestCase { - private IL10N|MockObject $l10n; - private IConfig|MockObject $config; - private IURLGenerator|MockObject $urlGenerator; - private IClientService|MockObject $clientService; - private LoggerInterface|MockObject $logger; - private SecurityHeaders|MockObject $setupcheck; + private IL10N&MockObject $l10n; + private IConfig&MockObject $config; + private IURLGenerator&MockObject $urlGenerator; + private IClientService&MockObject $clientService; + private LoggerInterface&MockObject $logger; + private SecurityHeaders&MockObject $setupcheck; protected function setUp(): void { parent::setUp(); - /** @var IL10N|MockObject */ - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { @@ -92,7 +90,7 @@ class SecurityHeadersTest extends TestCase { $this->assertEquals(SetupResult::WARNING, $result->getSeverity()); } - public function dataSuccess(): array { + public static function dataSuccess(): array { return [ // description => modifiedHeaders 'basic' => [[]], @@ -112,7 +110,7 @@ class SecurityHeadersTest extends TestCase { /** * @dataProvider dataSuccess */ - public function testSuccess($headers): void { + public function testSuccess(array $headers): void { $headers = array_merge( [ 'X-XSS-Protection' => '1; mode=block', @@ -138,7 +136,7 @@ class SecurityHeadersTest extends TestCase { $this->assertEquals(SetupResult::SUCCESS, $result->getSeverity()); } - public function dataFailure(): array { + public static function dataFailure(): array { return [ // description => modifiedHeaders 'x-robots-none' => [['X-Robots-Tag' => 'none'], "- The `X-Robots-Tag` HTTP header is not set to `noindex,nofollow`. This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.\n"], diff --git a/apps/settings/tests/SetupChecks/SupportedDatabaseTest.php b/apps/settings/tests/SetupChecks/SupportedDatabaseTest.php index 4bf529da6bb..6c75df47aa0 100644 --- a/apps/settings/tests/SetupChecks/SupportedDatabaseTest.php +++ b/apps/settings/tests/SetupChecks/SupportedDatabaseTest.php @@ -6,12 +6,12 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\SupportedDatabase; use OCP\IDBConnection; use OCP\IL10N; -use OCP\IUrlGenerator; +use OCP\IURLGenerator; use OCP\Server; use OCP\SetupCheck\SetupResult; use Test\TestCase; @@ -29,8 +29,8 @@ class SupportedDatabaseTest extends TestCase { protected function setUp(): void { parent::setUp(); - $this->l10n = $this->getMockBuilder(IL10N::class)->getMock(); - $this->urlGenerator = $this->getMockBuilder(IUrlGenerator::class)->getMock(); + $this->l10n = $this->createMock(IL10N::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); $this->connection = Server::get(IDBConnection::class); $this->check = new SupportedDatabase( diff --git a/apps/settings/tests/SetupChecks/WellKnownUrlsTest.php b/apps/settings/tests/SetupChecks/WellKnownUrlsTest.php index 983f2c427ad..14473a540ba 100644 --- a/apps/settings/tests/SetupChecks/WellKnownUrlsTest.php +++ b/apps/settings/tests/SetupChecks/WellKnownUrlsTest.php @@ -6,7 +6,7 @@ declare(strict_types=1); * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Settings\Tests; +namespace OCA\Settings\Tests\SetupChecks; use OCA\Settings\SetupChecks\WellKnownUrls; use OCP\Http\Client\IClientService; @@ -20,19 +20,18 @@ use Psr\Log\LoggerInterface; use Test\TestCase; class WellKnownUrlsTest extends TestCase { - private IL10N|MockObject $l10n; - private IConfig|MockObject $config; - private IURLGenerator|MockObject $urlGenerator; - private IClientService|MockObject $clientService; - private LoggerInterface|MockObject $logger; - private WellKnownUrls|MockObject $setupcheck; + private IL10N&MockObject $l10n; + private IConfig&MockObject $config; + private IURLGenerator&MockObject $urlGenerator; + private IClientService&MockObject $clientService; + private LoggerInterface&MockObject $logger; + private WellKnownUrls&MockObject $setupcheck; protected function setUp(): void { parent::setUp(); - /** @var IL10N|MockObject */ - $this->l10n = $this->getMockBuilder(IL10N::class) - ->disableOriginalConstructor()->getMock(); + /** @var IL10N&MockObject */ + $this->l10n = $this->createMock(IL10N::class); $this->l10n->expects($this->any()) ->method('t') ->willReturnCallback(function ($message, array $replace) { @@ -116,7 +115,7 @@ class WellKnownUrlsTest extends TestCase { } public function dataTestResponses(): array { - $createResponse = function (int $statuscode, array $header = []): IResponse|MockObject { + $createResponse = function (int $statuscode, array $header = []): IResponse&MockObject { $response = $this->createMock(IResponse::class); $response->expects($this->any()) ->method('getStatusCode') diff --git a/apps/settings/tests/UserMigration/AccountMigratorTest.php b/apps/settings/tests/UserMigration/AccountMigratorTest.php index cd3fd2f7aeb..ded905d226c 100644 --- a/apps/settings/tests/UserMigration/AccountMigratorTest.php +++ b/apps/settings/tests/UserMigration/AccountMigratorTest.php @@ -27,21 +27,12 @@ use Test\TestCase; * @group DB */ class AccountMigratorTest extends TestCase { - private IUserManager $userManager; - private IAvatarManager $avatarManager; - private AccountMigrator $migrator; - - /** @var IImportSource|MockObject */ - private $importSource; - - /** @var IExportDestination|MockObject */ - private $exportDestination; - - /** @var OutputInterface|MockObject */ - private $output; + private IImportSource&MockObject $importSource; + private IExportDestination&MockObject $exportDestination; + private OutputInterface&MockObject $output; private const ASSETS_DIR = __DIR__ . '/assets/'; @@ -72,9 +63,9 @@ class AccountMigratorTest extends TestCase { parent::tearDown(); } - public function dataImportExportAccount(): array { + public static function dataImportExportAccount(): array { return array_map( - function (string $filename) { + static function (string $filename): array { $dataPath = static::ASSETS_DIR . $filename; // For each account json file there is an avatar image and a config json file with the same basename $basename = pathinfo($filename, PATHINFO_FILENAME); @@ -111,17 +102,18 @@ class AccountMigratorTest extends TestCase { ->with($this->migrator->getId()) ->willReturn(1); + $calls = [ + [static::REGEX_ACCOUNT_FILE, json_encode($importData)], + [static::REGEX_CONFIG_FILE, json_encode($importConfig)], + ]; $this->importSource ->expects($this->exactly(2)) ->method('getFileContents') - ->withConsecutive( - [$this->matchesRegularExpression(static::REGEX_ACCOUNT_FILE)], - [$this->matchesRegularExpression(static::REGEX_CONFIG_FILE)], - ) - ->willReturnOnConsecutiveCalls( - json_encode($importData), - json_encode($importConfig), - ); + ->willReturnCallback(function ($path) use (&$calls) { + $expected = array_shift($calls); + $this->assertMatchesRegularExpression($expected[0], $path); + return $expected[1]; + }); $this->importSource ->expects($this->once()) @@ -152,13 +144,18 @@ class AccountMigratorTest extends TestCase { ); } + $calls = [ + [static::REGEX_ACCOUNT_FILE, new JsonMatches(json_encode($importData))], + [static::REGEX_CONFIG_FILE,new JsonMatches(json_encode($importConfig))], + ]; $this->exportDestination ->expects($this->exactly(2)) ->method('addFileContents') - ->withConsecutive( - [$this->matchesRegularExpression(static::REGEX_ACCOUNT_FILE), new JsonMatches(json_encode($exportData))], - [$this->matchesRegularExpression(static::REGEX_CONFIG_FILE), new JsonMatches(json_encode($exportConfig))], - ); + ->willReturnCallback(function ($path) use (&$calls) { + $expected = array_shift($calls); + $this->assertMatchesRegularExpression($expected[0], $path); + return $expected[1]; + }); $this->exportDestination ->expects($this->once()) diff --git a/apps/sharebymail/l10n/de.js b/apps/sharebymail/l10n/de.js index bbbe6d400f2..e66e9d82c37 100644 --- a/apps/sharebymail/l10n/de.js +++ b/apps/sharebymail/l10n/de.js @@ -13,7 +13,7 @@ OC.L10N.register( "{actor} unshared {file} from {email} by mail" : "{actor} teilt {file} nicht mehr mit {email} via E-Mail", "Password to access {file} was sent to {email}" : "Passwort für den Zugriff auf {file} wurde an {email} versandt ", "Password to access {file} was sent to you" : "Passwort für den Zugriff auf {file} wurde an dich gesendet", - "Share by mail" : "Geteilt über eine E-Mail", + "Share by mail" : "Teilen per E-Mail", "Sharing %1$s failed, because this item is already shared with the account %2$s" : "Freigeben von %1$s ist fehlgeschlagen, da dieses Element schon mit dem Konto %2$s geteilt wurde", "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automatisch erzeugtes Passwort kann nicht versandt werden. Bitte gib in deinen persönlichen Einstellungen eine gültige E-Mail-Adresse ein und versuche es erneut.", "Failed to send share by email. Got an invalid email address" : "Die Freigabe per E-Mail konnte nicht gesendet werden. Habe eine ungültige E-Mail-Adresse erhalten.", diff --git a/apps/sharebymail/l10n/de.json b/apps/sharebymail/l10n/de.json index a98ad30a28d..ca952b6d67c 100644 --- a/apps/sharebymail/l10n/de.json +++ b/apps/sharebymail/l10n/de.json @@ -11,7 +11,7 @@ "{actor} unshared {file} from {email} by mail" : "{actor} teilt {file} nicht mehr mit {email} via E-Mail", "Password to access {file} was sent to {email}" : "Passwort für den Zugriff auf {file} wurde an {email} versandt ", "Password to access {file} was sent to you" : "Passwort für den Zugriff auf {file} wurde an dich gesendet", - "Share by mail" : "Geteilt über eine E-Mail", + "Share by mail" : "Teilen per E-Mail", "Sharing %1$s failed, because this item is already shared with the account %2$s" : "Freigeben von %1$s ist fehlgeschlagen, da dieses Element schon mit dem Konto %2$s geteilt wurde", "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automatisch erzeugtes Passwort kann nicht versandt werden. Bitte gib in deinen persönlichen Einstellungen eine gültige E-Mail-Adresse ein und versuche es erneut.", "Failed to send share by email. Got an invalid email address" : "Die Freigabe per E-Mail konnte nicht gesendet werden. Habe eine ungültige E-Mail-Adresse erhalten.", diff --git a/apps/sharebymail/l10n/de_DE.js b/apps/sharebymail/l10n/de_DE.js index 338d60108cd..16e66447462 100644 --- a/apps/sharebymail/l10n/de_DE.js +++ b/apps/sharebymail/l10n/de_DE.js @@ -13,7 +13,7 @@ OC.L10N.register( "{actor} unshared {file} from {email} by mail" : "{actor} teilt {file} nicht mehr mit {email} via E-Mail", "Password to access {file} was sent to {email}" : "Passwort für den Zugriff auf {file} wurde an {email} versandt ", "Password to access {file} was sent to you" : "Passwort für den Zugriff auf {file} wurde an Sie versandt ", - "Share by mail" : "Geteilt über eine E-Mail", + "Share by mail" : "Teilen per E-Mail", "Sharing %1$s failed, because this item is already shared with the account %2$s" : "Freigeben von %1$s ist fehlgeschlagen, da dieses Element schon mit dem Konto %2$s geteilt wurde", "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automatisch erzeugtes Passwort kann nicht versandt werden. Bitte geben Sie in Ihren persönlichen Einstellungen eine gültige E-Mail-Adresse ein und versuche Sie es erneut.", "Failed to send share by email. Got an invalid email address" : "Die Freigabe per E-Mail konnte nicht gesendet werden. Es wurde eine ungültige E-Mail-Adresse angegeben.", diff --git a/apps/sharebymail/l10n/de_DE.json b/apps/sharebymail/l10n/de_DE.json index 27ee126b8f0..752bc7681c5 100644 --- a/apps/sharebymail/l10n/de_DE.json +++ b/apps/sharebymail/l10n/de_DE.json @@ -11,7 +11,7 @@ "{actor} unshared {file} from {email} by mail" : "{actor} teilt {file} nicht mehr mit {email} via E-Mail", "Password to access {file} was sent to {email}" : "Passwort für den Zugriff auf {file} wurde an {email} versandt ", "Password to access {file} was sent to you" : "Passwort für den Zugriff auf {file} wurde an Sie versandt ", - "Share by mail" : "Geteilt über eine E-Mail", + "Share by mail" : "Teilen per E-Mail", "Sharing %1$s failed, because this item is already shared with the account %2$s" : "Freigeben von %1$s ist fehlgeschlagen, da dieses Element schon mit dem Konto %2$s geteilt wurde", "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automatisch erzeugtes Passwort kann nicht versandt werden. Bitte geben Sie in Ihren persönlichen Einstellungen eine gültige E-Mail-Adresse ein und versuche Sie es erneut.", "Failed to send share by email. Got an invalid email address" : "Die Freigabe per E-Mail konnte nicht gesendet werden. Es wurde eine ungültige E-Mail-Adresse angegeben.", diff --git a/apps/weather_status/l10n/ko.js b/apps/weather_status/l10n/ko.js index 6f28af490e8..9af97446624 100644 --- a/apps/weather_status/l10n/ko.js +++ b/apps/weather_status/l10n/ko.js @@ -7,11 +7,44 @@ OC.L10N.register( "Error" : "오류", "Weather status" : "날씨 현황", "Weather status in your dashboard" : "내 대시보드에 있는 날씨 현황", - "Detect location" : "위치 감지", - "Set custom address" : "주소 설정", - "Favorites" : "즐겨찾기", + "Weather status integrated in the Dashboard app.\n The geographic location can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "날씨 현황이 대시보드 앱에 통합되었습니다.\n사용자의 현재 위치를 자동 혹은 수동으로 지정할 수 있습니다. 그 후 6시간의 일기예보가 표시됩니다.\n날씨 현황은 달력 앱과 같이 다른 곳에서도 통합될 수 있습니다.", + "{temperature} {unit} clear sky later today" : "{temperature} {unit} 오늘 오후 늦게 맑음", + "{temperature} {unit} clear sky" : "{temperature} {unit} 맑음", + "{temperature} {unit} cloudy later today" : "{temperature} {unit} 오늘 오후 늦게 흐림 ", + "{temperature} {unit} cloudy" : "{temperature} {unit} 흐림 ", + "{temperature} {unit} snow and thunder later today" : "{temperature} {unit} 오늘 오후 늦게 천둥·번개를 동반한 눈", + "{temperature} {unit} snow and thunder" : "{temperature} {unit} 천둥·번개를 동반한 눈", + "{temperature} {unit} snow showers and thunder later today" : "{temperature} {unit} 오늘 오후 늦게 천둥·번개를 동반한 소나기눈", + "{temperature} {unit} snow showers and thunder" : "{temperature} {unit} 천둥·번개를 동반한 소나기눈", + "{temperature} {unit} snow showers, thunder and polar twilight later today" : "{temperature} {unit} 오늘 오후 늦게 천둥·번개와 극야를 동반한 소나기눈", + "{temperature} {unit} snow showers, thunder and polar twilight" : "{temperature} {unit} 천둥·번개와 극야를 동반한 소나기눈", + "{temperature} {unit} snow showers later today" : "{temperature} {unit} 오늘 오후 늦게 소나기눈", + "{temperature} {unit} snow showers" : "{temperature} {unit} 소나기눈", + "{temperature} {unit} snow showers and polar twilight later today" : "{temperature} {unit} 오늘 오후 늦게 극야를 동반한 소나기눈", + "{temperature} {unit} snow showers and polar twilight" : "{temperature} {unit} 극야를 동반한 소나기눈", + "{temperature} {unit} snow later today" : "{temperature} {unit} 오늘 오후 늦게 눈", + "{temperature} {unit} snow" : "{temperature} {unit} 눈", + "{temperature} {unit} fair weather later today" : "{temperature} {unit} 오늘 오후 늦게 맑음", + "{temperature} {unit} fair weather" : "{temperature} {unit} 맑음", + "{temperature} {unit} partly cloudy later today" : "{temperature} {unit} 오늘 오후 늦게 구름 조금", + "{temperature} {unit} partly cloudy" : "{temperature} {unit} 구름 조금", + "{temperature} {unit} foggy later today" : "{temperature} {unit} 오늘 오후 늦게 안개", + "{temperature} {unit} foggy" : "{temperature} {unit} 안개", + "{temperature} {unit} light rainfall later today" : "{temperature} {unit} 오늘 오후 늦게 약한 비", + "{temperature} {unit} light rainfall" : "{temperature} {unit} 약한 비", + "{temperature} {unit} rainfall later today" : "{temperature} {unit} 오늘 오후 늦게 비", + "{temperature} {unit} rainfall" : "{temperature} {unit} 비", + "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} 오늘 오후 늦게 거센 비", + "{temperature} {unit} heavy rainfall" : "{temperature} {unit} 거센 비", + "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} 오늘 오후 늦게 소나기", + "{temperature} {unit} rainfall showers" : "{temperature} {unit} 소나기", + "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} 오늘 오후 늦게 약한 소나기", + "{temperature} {unit} light rainfall showers" : "{temperature} {unit} 약한 소나기", + "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} 오늘 오후 늦게 거센 소나기", + "{temperature} {unit} heavy rainfall showers" : "{temperature} {unit} 거센 소나기", "More weather for {adr}" : "{adr} 날씨 더 보기", "Loading weather" : "날씨 불러오는 중", + "Set location for weather" : "날씨 위치 설정", "Remove from favorites" : "즐겨찾기에서 제거", "Add as favorite" : "즐겨찾기로 추가", "You are not logged in." : "당신은 로그인하지 않았습니다.", @@ -22,7 +55,9 @@ OC.L10N.register( "There was an error setting the location." : "주소를 설정하는 동안 오류가 발생했습니다.", "There was an error saving the mode." : "모드 저장에 오류가 있습니다.", "There was an error using personal address." : "개인 주소를 사용하는 동안 오류가 발생했습니다.", - "Set location for weather" : "날씨 위치 설정", - "Weather status integrated in the Dashboard app.\n User's position can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "날씨 현황이 대시보드 앱에 통합되었습니다.\n사용자의 현재 위치를 자동 혹은 수동으로 지정할 수 있습니다. 그 후 6시간의 일기예보가 표시됩니다.\n날씨 현황은 달력 앱과 같이 다른 곳에서도 통합될 수 있습니다." + "Unknown weather code" : "알 수 없는 날씨 코드", + "Detect location" : "위치 감지", + "Set custom address" : "주소 설정", + "Favorites" : "즐겨찾기" }, "nplurals=1; plural=0;"); diff --git a/apps/weather_status/l10n/ko.json b/apps/weather_status/l10n/ko.json index b07606e36ae..1a7bbaa4d64 100644 --- a/apps/weather_status/l10n/ko.json +++ b/apps/weather_status/l10n/ko.json @@ -5,11 +5,44 @@ "Error" : "오류", "Weather status" : "날씨 현황", "Weather status in your dashboard" : "내 대시보드에 있는 날씨 현황", - "Detect location" : "위치 감지", - "Set custom address" : "주소 설정", - "Favorites" : "즐겨찾기", + "Weather status integrated in the Dashboard app.\n The geographic location can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "날씨 현황이 대시보드 앱에 통합되었습니다.\n사용자의 현재 위치를 자동 혹은 수동으로 지정할 수 있습니다. 그 후 6시간의 일기예보가 표시됩니다.\n날씨 현황은 달력 앱과 같이 다른 곳에서도 통합될 수 있습니다.", + "{temperature} {unit} clear sky later today" : "{temperature} {unit} 오늘 오후 늦게 맑음", + "{temperature} {unit} clear sky" : "{temperature} {unit} 맑음", + "{temperature} {unit} cloudy later today" : "{temperature} {unit} 오늘 오후 늦게 흐림 ", + "{temperature} {unit} cloudy" : "{temperature} {unit} 흐림 ", + "{temperature} {unit} snow and thunder later today" : "{temperature} {unit} 오늘 오후 늦게 천둥·번개를 동반한 눈", + "{temperature} {unit} snow and thunder" : "{temperature} {unit} 천둥·번개를 동반한 눈", + "{temperature} {unit} snow showers and thunder later today" : "{temperature} {unit} 오늘 오후 늦게 천둥·번개를 동반한 소나기눈", + "{temperature} {unit} snow showers and thunder" : "{temperature} {unit} 천둥·번개를 동반한 소나기눈", + "{temperature} {unit} snow showers, thunder and polar twilight later today" : "{temperature} {unit} 오늘 오후 늦게 천둥·번개와 극야를 동반한 소나기눈", + "{temperature} {unit} snow showers, thunder and polar twilight" : "{temperature} {unit} 천둥·번개와 극야를 동반한 소나기눈", + "{temperature} {unit} snow showers later today" : "{temperature} {unit} 오늘 오후 늦게 소나기눈", + "{temperature} {unit} snow showers" : "{temperature} {unit} 소나기눈", + "{temperature} {unit} snow showers and polar twilight later today" : "{temperature} {unit} 오늘 오후 늦게 극야를 동반한 소나기눈", + "{temperature} {unit} snow showers and polar twilight" : "{temperature} {unit} 극야를 동반한 소나기눈", + "{temperature} {unit} snow later today" : "{temperature} {unit} 오늘 오후 늦게 눈", + "{temperature} {unit} snow" : "{temperature} {unit} 눈", + "{temperature} {unit} fair weather later today" : "{temperature} {unit} 오늘 오후 늦게 맑음", + "{temperature} {unit} fair weather" : "{temperature} {unit} 맑음", + "{temperature} {unit} partly cloudy later today" : "{temperature} {unit} 오늘 오후 늦게 구름 조금", + "{temperature} {unit} partly cloudy" : "{temperature} {unit} 구름 조금", + "{temperature} {unit} foggy later today" : "{temperature} {unit} 오늘 오후 늦게 안개", + "{temperature} {unit} foggy" : "{temperature} {unit} 안개", + "{temperature} {unit} light rainfall later today" : "{temperature} {unit} 오늘 오후 늦게 약한 비", + "{temperature} {unit} light rainfall" : "{temperature} {unit} 약한 비", + "{temperature} {unit} rainfall later today" : "{temperature} {unit} 오늘 오후 늦게 비", + "{temperature} {unit} rainfall" : "{temperature} {unit} 비", + "{temperature} {unit} heavy rainfall later today" : "{temperature} {unit} 오늘 오후 늦게 거센 비", + "{temperature} {unit} heavy rainfall" : "{temperature} {unit} 거센 비", + "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} 오늘 오후 늦게 소나기", + "{temperature} {unit} rainfall showers" : "{temperature} {unit} 소나기", + "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} 오늘 오후 늦게 약한 소나기", + "{temperature} {unit} light rainfall showers" : "{temperature} {unit} 약한 소나기", + "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} 오늘 오후 늦게 거센 소나기", + "{temperature} {unit} heavy rainfall showers" : "{temperature} {unit} 거센 소나기", "More weather for {adr}" : "{adr} 날씨 더 보기", "Loading weather" : "날씨 불러오는 중", + "Set location for weather" : "날씨 위치 설정", "Remove from favorites" : "즐겨찾기에서 제거", "Add as favorite" : "즐겨찾기로 추가", "You are not logged in." : "당신은 로그인하지 않았습니다.", @@ -20,7 +53,9 @@ "There was an error setting the location." : "주소를 설정하는 동안 오류가 발생했습니다.", "There was an error saving the mode." : "모드 저장에 오류가 있습니다.", "There was an error using personal address." : "개인 주소를 사용하는 동안 오류가 발생했습니다.", - "Set location for weather" : "날씨 위치 설정", - "Weather status integrated in the Dashboard app.\n User's position can be automatically determined or manually defined. A 6 hours forecast is then displayed.\n This status can also be integrated in other places like the Calendar app." : "날씨 현황이 대시보드 앱에 통합되었습니다.\n사용자의 현재 위치를 자동 혹은 수동으로 지정할 수 있습니다. 그 후 6시간의 일기예보가 표시됩니다.\n날씨 현황은 달력 앱과 같이 다른 곳에서도 통합될 수 있습니다." + "Unknown weather code" : "알 수 없는 날씨 코드", + "Detect location" : "위치 감지", + "Set custom address" : "주소 설정", + "Favorites" : "즐겨찾기" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file |