diff --git a/apps/comments/l10n/it.js b/apps/comments/l10n/it.js index e9f41e0c6385c..881c1ff1ef18f 100644 --- a/apps/comments/l10n/it.js +++ b/apps/comments/l10n/it.js @@ -19,6 +19,7 @@ OC.L10N.register( "No comments yet, start the conversation!" : "Ancora nessun commento, inizia la conversazione!", "No more messages" : "Non ci sono altri messaggi", "Retry" : "Riprova", + "Failed to mark comments as read" : "Impossibile segnare i commenti come letti", "Unable to load the comments list" : "Impossibile caricare l'elenco dei commenti", "_%n unread comment_::_%n unread comments_" : ["%n commento non letto","%n commenti non letti","%n commenti non letti"], "_1 new comment_::_{unread} new comments_" : ["1 nuovo commento","{unread} nuovi commenti","{unread} nuovi commenti"], diff --git a/apps/comments/l10n/it.json b/apps/comments/l10n/it.json index 322bb23c1ecc9..ac491c3efd5e8 100644 --- a/apps/comments/l10n/it.json +++ b/apps/comments/l10n/it.json @@ -17,6 +17,7 @@ "No comments yet, start the conversation!" : "Ancora nessun commento, inizia la conversazione!", "No more messages" : "Non ci sono altri messaggi", "Retry" : "Riprova", + "Failed to mark comments as read" : "Impossibile segnare i commenti come letti", "Unable to load the comments list" : "Impossibile caricare l'elenco dei commenti", "_%n unread comment_::_%n unread comments_" : ["%n commento non letto","%n commenti non letti","%n commenti non letti"], "_1 new comment_::_{unread} new comments_" : ["1 nuovo commento","{unread} nuovi commenti","{unread} nuovi commenti"], diff --git a/apps/comments/l10n/pt_BR.js b/apps/comments/l10n/pt_BR.js index 4bb5197c85a3a..bdf619ab3d790 100644 --- a/apps/comments/l10n/pt_BR.js +++ b/apps/comments/l10n/pt_BR.js @@ -19,6 +19,7 @@ OC.L10N.register( "No comments yet, start the conversation!" : "Nenhum comentário ainda, inicie uma conversa!", "No more messages" : "Sem mais mensagens", "Retry" : "Tentar novamente", + "Failed to mark comments as read" : "Falha ao marcar comentários como lidos", "Unable to load the comments list" : "Não foi possível carregar a lista de comentários", "_%n unread comment_::_%n unread comments_" : ["%n comentários não lidos","%n comentários não lidos","%n comentários não lidos"], "_1 new comment_::_{unread} new comments_" : ["1 novo comentário","{unread} novos comentários","{unread} novos comentários"], diff --git a/apps/comments/l10n/pt_BR.json b/apps/comments/l10n/pt_BR.json index 79d300802da89..21860366b78eb 100644 --- a/apps/comments/l10n/pt_BR.json +++ b/apps/comments/l10n/pt_BR.json @@ -17,6 +17,7 @@ "No comments yet, start the conversation!" : "Nenhum comentário ainda, inicie uma conversa!", "No more messages" : "Sem mais mensagens", "Retry" : "Tentar novamente", + "Failed to mark comments as read" : "Falha ao marcar comentários como lidos", "Unable to load the comments list" : "Não foi possível carregar a lista de comentários", "_%n unread comment_::_%n unread comments_" : ["%n comentários não lidos","%n comentários não lidos","%n comentários não lidos"], "_1 new comment_::_{unread} new comments_" : ["1 novo comentário","{unread} novos comentários","{unread} novos comentários"], diff --git a/apps/dav/l10n/pt_BR.js b/apps/dav/l10n/pt_BR.js index d216eb87a042d..df7a62227216e 100644 --- a/apps/dav/l10n/pt_BR.js +++ b/apps/dav/l10n/pt_BR.js @@ -118,6 +118,8 @@ OC.L10N.register( "{actor} updated contact {card} in address book {addressbook}" : "{actor} updated contact {card} no livro de endereço {addressbook}", "You updated contact {card} in address book {addressbook}" : "Você atualizou o contato {card} no livro de endereços {addressbook}", "A contact or address book was modified" : "O contato ou livro de endereço foi modificado", + "Accounts" : "Contas", + "System address book which holds all accounts" : "Catálogo de endereços do sistema que contém todas as contas", "File is not updatable: %1$s" : "O arquivo não é atualizável: %1$s", "Could not write to final file, canceled by hook" : "Não foi possível gravar no arquivo final, cancelado pelo gancho", "Could not write file contents" : "Não foi possível gravar o conteúdo do arquivo", diff --git a/apps/dav/l10n/pt_BR.json b/apps/dav/l10n/pt_BR.json index eb2659b286686..20c38e739d6b5 100644 --- a/apps/dav/l10n/pt_BR.json +++ b/apps/dav/l10n/pt_BR.json @@ -116,6 +116,8 @@ "{actor} updated contact {card} in address book {addressbook}" : "{actor} updated contact {card} no livro de endereço {addressbook}", "You updated contact {card} in address book {addressbook}" : "Você atualizou o contato {card} no livro de endereços {addressbook}", "A contact or address book was modified" : "O contato ou livro de endereço foi modificado", + "Accounts" : "Contas", + "System address book which holds all accounts" : "Catálogo de endereços do sistema que contém todas as contas", "File is not updatable: %1$s" : "O arquivo não é atualizável: %1$s", "Could not write to final file, canceled by hook" : "Não foi possível gravar no arquivo final, cancelado pelo gancho", "Could not write file contents" : "Não foi possível gravar o conteúdo do arquivo", diff --git a/apps/dav/l10n/zh_HK.js b/apps/dav/l10n/zh_HK.js index 1b1178ef3beb0..ddd48eb788825 100644 --- a/apps/dav/l10n/zh_HK.js +++ b/apps/dav/l10n/zh_HK.js @@ -174,7 +174,7 @@ OC.L10N.register( "Failed to save availability" : "未能保存可用時間", "Calendar server" : "日曆伺服器", "Send invitations to attendees" : "發送邀請函給參加者", - "Automatically generate a birthday calendar" : "自動建立生日日曆", + "Automatically generate a birthday calendar" : "自動生成生日日曆", "Birthday calendars will be generated by a background job." : "生日日曆將由後台作業生成。", "Hence they will not be available immediately after enabling but will show up after some time." : "因此,啟用後不會立即可用,但會在一段時間後顯示。", "Send notifications for events" : "發送活動通知", diff --git a/apps/dav/l10n/zh_HK.json b/apps/dav/l10n/zh_HK.json index 5ec0e2271e222..c7166a6b49215 100644 --- a/apps/dav/l10n/zh_HK.json +++ b/apps/dav/l10n/zh_HK.json @@ -172,7 +172,7 @@ "Failed to save availability" : "未能保存可用時間", "Calendar server" : "日曆伺服器", "Send invitations to attendees" : "發送邀請函給參加者", - "Automatically generate a birthday calendar" : "自動建立生日日曆", + "Automatically generate a birthday calendar" : "自動生成生日日曆", "Birthday calendars will be generated by a background job." : "生日日曆將由後台作業生成。", "Hence they will not be available immediately after enabling but will show up after some time." : "因此,啟用後不會立即可用,但會在一段時間後顯示。", "Send notifications for events" : "發送活動通知", diff --git a/apps/dav/lib/CardDAV/SystemAddressbook.php b/apps/dav/lib/CardDAV/SystemAddressbook.php index 48ec533353a94..1cffde634747c 100644 --- a/apps/dav/lib/CardDAV/SystemAddressbook.php +++ b/apps/dav/lib/CardDAV/SystemAddressbook.php @@ -92,7 +92,7 @@ public function getChildren() { // Should never happen because we don't allow anonymous access return []; } - if (!$shareEnumeration || (!$shareEnumerationGroup && $shareEnumerationPhone)) { + if ($user->getBackendClassName() === 'Guests' || !$shareEnumeration || (!$shareEnumerationGroup && $shareEnumerationPhone)) { $name = SyncService::getCardUri($user); try { return [parent::getChild($name)]; @@ -135,8 +135,8 @@ public function getMultipleChildren($paths): array { $shareEnumeration = $this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes') === 'yes'; $shareEnumerationGroup = $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_to_group', 'no') === 'yes'; $shareEnumerationPhone = $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_to_phone', 'no') === 'yes'; - if (!$shareEnumeration || (!$shareEnumerationGroup && $shareEnumerationPhone)) { - $user = $this->userSession->getUser(); + $user = $this->userSession->getUser(); + if (($user !== null && $user->getBackendClassName() === 'Guests') || !$shareEnumeration || (!$shareEnumerationGroup && $shareEnumerationPhone)) { // No user or cards with no access if ($user === null || !in_array(SyncService::getCardUri($user), $paths, true)) { return []; @@ -149,7 +149,6 @@ public function getMultipleChildren($paths): array { } } if ($shareEnumerationGroup) { - $user = $this->userSession->getUser(); if ($this->groupManager === null || $user === null) { // Group manager or user is not available, so we can't determine which data is safe return []; @@ -196,19 +195,18 @@ public function getMultipleChildren($paths): array { * @throws Forbidden */ public function getChild($name): Card { + $user = $this->userSession->getUser(); $shareEnumeration = $this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes') === 'yes'; $shareEnumerationGroup = $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_to_group', 'no') === 'yes'; $shareEnumerationPhone = $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_to_phone', 'no') === 'yes'; - if (!$shareEnumeration || (!$shareEnumerationGroup && $shareEnumerationPhone)) { - $currentUser = $this->userSession->getUser(); - $ownName = $currentUser !== null ? SyncService::getCardUri($currentUser) : null; + if (($user !== null && $user->getBackendClassName() === 'Guests') || !$shareEnumeration || (!$shareEnumerationGroup && $shareEnumerationPhone)) { + $ownName = $user !== null ? SyncService::getCardUri($user) : null; if ($ownName === $name) { return parent::getChild($name); } throw new Forbidden(); } if ($shareEnumerationGroup) { - $user = $this->userSession->getUser(); if ($user === null || $this->groupManager === null) { // Group manager is not available, so we can't determine which data is safe throw new Forbidden(); diff --git a/apps/dav/tests/unit/CardDAV/SystemAddressBookTest.php b/apps/dav/tests/unit/CardDAV/SystemAddressBookTest.php index 325b1120e8b27..97bb92ad9bc98 100644 --- a/apps/dav/tests/unit/CardDAV/SystemAddressBookTest.php +++ b/apps/dav/tests/unit/CardDAV/SystemAddressBookTest.php @@ -90,6 +90,46 @@ protected function setUp(): void { ); } + public function testGetChildrenAsGuest(): void { + $this->config->expects(self::exactly(3)) + ->method('getAppValue') + ->willReturnMap([ + ['core', 'shareapi_allow_share_dialog_user_enumeration', 'yes', 'yes'], + ['core', 'shareapi_restrict_user_enumeration_to_group', 'no', 'no'], + ['core', 'shareapi_restrict_user_enumeration_to_phone', 'no', 'no'], + ]); + $user = $this->createMock(IUser::class); + $user->method('getUID')->willReturn('user'); + $user->method('getBackendClassName')->willReturn('Guests'); + $this->userSession->expects(self::once()) + ->method('getUser') + ->willReturn($user); + $vcfWithScopes = << $vcfWithScopes, + ]; + $this->cardDavBackend->expects(self::once()) + ->method('getCard') + ->with(123, 'Guests:user.vcf') + ->willReturn($originalCard); + + $children = $this->addressBook->getChildren(); + + self::assertCount(1, $children); + } + public function testGetFilteredChildForFederation(): void { $this->config->expects(self::exactly(3)) ->method('getAppValue') @@ -172,6 +212,24 @@ public function testGetChildWithoutEnumeration(): void { $this->addressBook->getChild("LDAP:user.vcf"); } + public function testGetChildAsGuest(): void { + $this->config->expects(self::exactly(3)) + ->method('getAppValue') + ->willReturnMap([ + ['core', 'shareapi_allow_share_dialog_user_enumeration', 'yes', 'yes'], + ['core', 'shareapi_restrict_user_enumeration_to_group', 'no', 'no'], + ['core', 'shareapi_restrict_user_enumeration_to_phone', 'no', 'no'], + ]); + $user = $this->createMock(IUser::class); + $user->method('getBackendClassName')->willReturn('Guests'); + $this->userSession->expects(self::once()) + ->method('getUser') + ->willReturn($user); + $this->expectException(Forbidden::class); + + $this->addressBook->getChild("LDAP:user.vcf"); + } + public function testGetChildWithGroupEnumerationRestriction(): void { $this->config->expects(self::exactly(3)) ->method('getAppValue') @@ -322,6 +380,26 @@ public function testGetMultipleChildrenWithGroupEnumerationRestriction(): void { self::assertCount(2, $cards); } + public function testGetMultipleChildrenAsGuest(): void { + $this->config + ->method('getAppValue') + ->willReturnMap([ + ['core', 'shareapi_allow_share_dialog_user_enumeration', 'yes', 'yes'], + ['core', 'shareapi_restrict_user_enumeration_to_group', 'no', 'no'], + ['core', 'shareapi_restrict_user_enumeration_to_phone', 'no', 'no'], + ]); + $user = $this->createMock(IUser::class); + $user->method('getUID')->willReturn('user'); + $user->method('getBackendClassName')->willReturn('Guests'); + $this->userSession->expects(self::once()) + ->method('getUser') + ->willReturn($user); + + $cards = $this->addressBook->getMultipleChildren(['Database:user1.vcf', 'LDAP:user2.vcf']); + + self::assertEmpty($cards); + } + public function testGetMultipleChildren(): void { $this->config ->method('getAppValue') diff --git a/apps/encryption/lib/Crypto/Crypt.php b/apps/encryption/lib/Crypto/Crypt.php index 0cf6451d287bd..cd2453e8c70c7 100644 --- a/apps/encryption/lib/Crypto/Crypt.php +++ b/apps/encryption/lib/Crypto/Crypt.php @@ -70,9 +70,9 @@ class Crypt { // default cipher from old Nextcloud versions public const LEGACY_CIPHER = 'AES-128-CFB'; - public const SUPPORTED_KEY_FORMATS = ['hash', 'password']; + public const SUPPORTED_KEY_FORMATS = ['hash2', 'hash', 'password']; // one out of SUPPORTED_KEY_FORMATS - public const DEFAULT_KEY_FORMAT = 'hash'; + public const DEFAULT_KEY_FORMAT = 'hash2'; // default key format, old Nextcloud version encrypted the private key directly // with the user password public const LEGACY_KEY_FORMAT = 'password'; @@ -371,22 +371,20 @@ private function addPadding($data) { * @param string $uid only used for user keys * @return string */ - protected function generatePasswordHash($password, $cipher, $uid = '') { + protected function generatePasswordHash(string $password, string $cipher, string $uid = '', int $iterations = 600000): string { $instanceId = $this->config->getSystemValue('instanceid'); $instanceSecret = $this->config->getSystemValue('secret'); $salt = hash('sha256', $uid . $instanceId . $instanceSecret, true); $keySize = $this->getKeySize($cipher); - $hash = hash_pbkdf2( + return hash_pbkdf2( 'sha256', $password, $salt, - 100000, + $iterations, $keySize, true ); - - return $hash; } /** @@ -431,8 +429,10 @@ public function decryptPrivateKey($privateKey, $password = '', $uid = '') { $keyFormat = self::LEGACY_KEY_FORMAT; } - if ($keyFormat === self::DEFAULT_KEY_FORMAT) { - $password = $this->generatePasswordHash($password, $cipher, $uid); + if ($keyFormat === 'hash') { + $password = $this->generatePasswordHash($password, $cipher, $uid, 100000); + } elseif ($keyFormat === 'hash2') { + $password = $this->generatePasswordHash($password, $cipher, $uid, 600000); } $binaryEncoding = isset($header['encoding']) && $header['encoding'] === self::BINARY_ENCODING_FORMAT; diff --git a/apps/encryption/tests/Crypto/CryptTest.php b/apps/encryption/tests/Crypto/CryptTest.php index dd41c67e8ad99..0bb2c652d8b3b 100644 --- a/apps/encryption/tests/Crypto/CryptTest.php +++ b/apps/encryption/tests/Crypto/CryptTest.php @@ -137,7 +137,7 @@ public function testGenerateHeaderInvalid() { */ public function dataTestGenerateHeader() { return [ - [null, 'HBEGIN:cipher:AES-128-CFB:keyFormat:hash:encoding:binary:HEND'], + [null, 'HBEGIN:cipher:AES-128-CFB:keyFormat:hash2:encoding:binary:HEND'], ['password', 'HBEGIN:cipher:AES-128-CFB:keyFormat:password:encoding:binary:HEND'], ['hash', 'HBEGIN:cipher:AES-128-CFB:keyFormat:hash:encoding:binary:HEND'] ]; diff --git a/apps/files/l10n/cs.js b/apps/files/l10n/cs.js index 6ef3ed0a3f7cf..db5bd9a6e60d9 100644 --- a/apps/files/l10n/cs.js +++ b/apps/files/l10n/cs.js @@ -228,6 +228,7 @@ OC.L10N.register( "Blank" : "Prázdný", "Unable to create new file from template" : "Nedaří se vytvořit soubor ze šablony", "Delete permanently" : "Nadobro smazat", + "Open folder {displayName}" : "Otevřít složku {displayName}", "Set up templates folder" : "Vytvořit složku pro šablony", "Templates" : "Šablony", "Create new templates folder" : "Vytvořit novou složku šablon", diff --git a/apps/files/l10n/cs.json b/apps/files/l10n/cs.json index 3996b31fe059d..92001470c3723 100644 --- a/apps/files/l10n/cs.json +++ b/apps/files/l10n/cs.json @@ -226,6 +226,7 @@ "Blank" : "Prázdný", "Unable to create new file from template" : "Nedaří se vytvořit soubor ze šablony", "Delete permanently" : "Nadobro smazat", + "Open folder {displayName}" : "Otevřít složku {displayName}", "Set up templates folder" : "Vytvořit složku pro šablony", "Templates" : "Šablony", "Create new templates folder" : "Vytvořit novou složku šablon", diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index a7643f6199526..ce62ba65161aa 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -228,6 +228,7 @@ OC.L10N.register( "Blank" : "Leer", "Unable to create new file from template" : "Neue Datei kann nicht aus Vorlage erstellt werden", "Delete permanently" : "Endgültig löschen", + "Open folder {displayName}" : "Ordner {displayName} öffnen", "Set up templates folder" : "Vorlagenordner einrichten", "Templates" : "Vorlagen", "Create new templates folder" : "Neuen Vorlagenordner erstellen", diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index 4ad582a9e3969..c786963a3f7dc 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -226,6 +226,7 @@ "Blank" : "Leer", "Unable to create new file from template" : "Neue Datei kann nicht aus Vorlage erstellt werden", "Delete permanently" : "Endgültig löschen", + "Open folder {displayName}" : "Ordner {displayName} öffnen", "Set up templates folder" : "Vorlagenordner einrichten", "Templates" : "Vorlagen", "Create new templates folder" : "Neuen Vorlagenordner erstellen", diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js index 082b3bab3d9cd..2089cc108e89f 100644 --- a/apps/files/l10n/en_GB.js +++ b/apps/files/l10n/en_GB.js @@ -228,6 +228,7 @@ OC.L10N.register( "Blank" : "Blank", "Unable to create new file from template" : "Unable to create new file from template", "Delete permanently" : "Delete permanently", + "Open folder {displayName}" : "Open folder {displayName}", "Set up templates folder" : "Set up templates folder", "Templates" : "Templates", "Create new templates folder" : "Create new templates folder", diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json index bf30b1517e718..a707980c20b2a 100644 --- a/apps/files/l10n/en_GB.json +++ b/apps/files/l10n/en_GB.json @@ -226,6 +226,7 @@ "Blank" : "Blank", "Unable to create new file from template" : "Unable to create new file from template", "Delete permanently" : "Delete permanently", + "Open folder {displayName}" : "Open folder {displayName}", "Set up templates folder" : "Set up templates folder", "Templates" : "Templates", "Create new templates folder" : "Create new templates folder", diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 12e75edfbb4a0..12a5205ea67ff 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -228,6 +228,7 @@ OC.L10N.register( "Blank" : "Vacío", "Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla", "Delete permanently" : "Eliminar de forma definitiva", + "Open folder {displayName}" : "Abrir carpeta {displayName}", "Set up templates folder" : "Configura una carpeta para plantillas", "Templates" : "Plantillas", "Create new templates folder" : "Crear nueva carpeta de plantillas", diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index 2222e71370b0f..4d29df8059fc9 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -226,6 +226,7 @@ "Blank" : "Vacío", "Unable to create new file from template" : "No se ha podido crear un nuevo archivo desde la plantilla", "Delete permanently" : "Eliminar de forma definitiva", + "Open folder {displayName}" : "Abrir carpeta {displayName}", "Set up templates folder" : "Configura una carpeta para plantillas", "Templates" : "Plantillas", "Create new templates folder" : "Crear nueva carpeta de plantillas", diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js index be6c90ba3747c..9b75f0a98b8ea 100644 --- a/apps/files/l10n/fi.js +++ b/apps/files/l10n/fi.js @@ -222,6 +222,7 @@ OC.L10N.register( "Blank" : "Tyhjä", "Unable to create new file from template" : "Uutta tiedostoa mallipohjasta ei voi luoda", "Delete permanently" : "Poista pysyvästi", + "Open folder {displayName}" : "Avaa kansio {displayName}", "Set up templates folder" : "Aseta mallipohjien kansio", "Templates" : "Mallipohjat", "Create new templates folder" : "Luo uusi mallipohjien kansio", diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json index 57546cfad414b..a47876857cbec 100644 --- a/apps/files/l10n/fi.json +++ b/apps/files/l10n/fi.json @@ -220,6 +220,7 @@ "Blank" : "Tyhjä", "Unable to create new file from template" : "Uutta tiedostoa mallipohjasta ei voi luoda", "Delete permanently" : "Poista pysyvästi", + "Open folder {displayName}" : "Avaa kansio {displayName}", "Set up templates folder" : "Aseta mallipohjien kansio", "Templates" : "Mallipohjat", "Create new templates folder" : "Luo uusi mallipohjien kansio", diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index 1a59e2aad5dc8..4a021bcdd2ea4 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -228,6 +228,7 @@ OC.L10N.register( "Blank" : "Vuoto", "Unable to create new file from template" : "Impossibile creare un nuovo file dal modello", "Delete permanently" : "Elimina permanentemente", + "Open folder {displayName}" : "Apri la cartella {displayName}", "Set up templates folder" : "Configura la cartella dei modelli", "Templates" : "Modelli", "Create new templates folder" : "Crea una nuova cartella dei templates", diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index b908e1ed31290..8953d8e53e2b7 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -226,6 +226,7 @@ "Blank" : "Vuoto", "Unable to create new file from template" : "Impossibile creare un nuovo file dal modello", "Delete permanently" : "Elimina permanentemente", + "Open folder {displayName}" : "Apri la cartella {displayName}", "Set up templates folder" : "Configura la cartella dei modelli", "Templates" : "Modelli", "Create new templates folder" : "Crea una nuova cartella dei templates", diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index 3e15e02a1cec2..0a2de4fa9044c 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -228,6 +228,7 @@ OC.L10N.register( "Blank" : "Tom", "Unable to create new file from template" : "Kunde inte skapa fil från mall", "Delete permanently" : "Ta bort permanent", + "Open folder {displayName}" : "Öppna mappen {displayName}", "Set up templates folder" : "Skapa en mapp för mallar", "Templates" : "Mallar", "Create new templates folder" : "Skapa ny mallmapp", diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index a466470f1bc57..770f4b4d6d9ad 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -226,6 +226,7 @@ "Blank" : "Tom", "Unable to create new file from template" : "Kunde inte skapa fil från mall", "Delete permanently" : "Ta bort permanent", + "Open folder {displayName}" : "Öppna mappen {displayName}", "Set up templates folder" : "Skapa en mapp för mallar", "Templates" : "Mallar", "Create new templates folder" : "Skapa ny mallmapp", diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js index 3408df9f358f8..71f740f682c42 100644 --- a/apps/files/l10n/zh_HK.js +++ b/apps/files/l10n/zh_HK.js @@ -228,6 +228,7 @@ OC.L10N.register( "Blank" : "空白", "Unable to create new file from template" : "無法從模板創建新檔案", "Delete permanently" : "永久刪除", + "Open folder {displayName}" : "打開資料夾 {displayName}", "Set up templates folder" : "設定範本資料夾", "Templates" : "模板", "Create new templates folder" : "創建新範本資料夾", diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json index 6fbd9f5e94989..87960ae5fe8f2 100644 --- a/apps/files/l10n/zh_HK.json +++ b/apps/files/l10n/zh_HK.json @@ -226,6 +226,7 @@ "Blank" : "空白", "Unable to create new file from template" : "無法從模板創建新檔案", "Delete permanently" : "永久刪除", + "Open folder {displayName}" : "打開資料夾 {displayName}", "Set up templates folder" : "設定範本資料夾", "Templates" : "模板", "Create new templates folder" : "創建新範本資料夾", diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 1875a575c5f98..de9f3f44b1a47 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -228,6 +228,7 @@ OC.L10N.register( "Blank" : "空白", "Unable to create new file from template" : "無法從範本建立新檔案", "Delete permanently" : "永久刪除", + "Open folder {displayName}" : "開啟資料夾 {displayName}", "Set up templates folder" : "設定範本資料夾", "Templates" : "範本", "Create new templates folder" : "建立新的範本資料夾", diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index d7f01fa372385..75c80cfa8eca7 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -226,6 +226,7 @@ "Blank" : "空白", "Unable to create new file from template" : "無法從範本建立新檔案", "Delete permanently" : "永久刪除", + "Open folder {displayName}" : "開啟資料夾 {displayName}", "Set up templates folder" : "設定範本資料夾", "Templates" : "範本", "Create new templates folder" : "建立新的範本資料夾", diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js index 8ecb9f2792905..247f109bf8c3e 100644 --- a/apps/files_external/l10n/it.js +++ b/apps/files_external/l10n/it.js @@ -10,6 +10,7 @@ OC.L10N.register( "Error configuring OAuth2" : "Errore di configurazione OAuth2", "Generate keys" : "Genera la chiavi", "Error generating key pair" : "Errore durante la generazione della coppia di chiavi", + "Type to select user or group." : "Digita per selezionare utente o gruppo.", "(Group)" : "(Gruppo)", "Compatibility with Mac NFD encoding (slow)" : "Compatibilità con la codifica Mac NFD (lento)", "Enable encryption" : "Abilita cifratura", @@ -89,6 +90,7 @@ OC.L10N.register( "Hostname" : "Nome host", "Port" : "Porta", "Region" : "Regione", + "Storage Class" : "Classe di archiviazione", "Enable SSL" : "Abilita SSL", "Enable Path Style" : "Abilita stile percorsi", "Legacy (v2) authentication" : "Autenticazione tradizionale (v2)", diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json index 5fc7d45a92757..56ab6ca4b19e9 100644 --- a/apps/files_external/l10n/it.json +++ b/apps/files_external/l10n/it.json @@ -8,6 +8,7 @@ "Error configuring OAuth2" : "Errore di configurazione OAuth2", "Generate keys" : "Genera la chiavi", "Error generating key pair" : "Errore durante la generazione della coppia di chiavi", + "Type to select user or group." : "Digita per selezionare utente o gruppo.", "(Group)" : "(Gruppo)", "Compatibility with Mac NFD encoding (slow)" : "Compatibilità con la codifica Mac NFD (lento)", "Enable encryption" : "Abilita cifratura", @@ -87,6 +88,7 @@ "Hostname" : "Nome host", "Port" : "Porta", "Region" : "Regione", + "Storage Class" : "Classe di archiviazione", "Enable SSL" : "Abilita SSL", "Enable Path Style" : "Abilita stile percorsi", "Legacy (v2) authentication" : "Autenticazione tradizionale (v2)", diff --git a/apps/files_sharing/l10n/it.js b/apps/files_sharing/l10n/it.js index 7b5e5b1ea615e..ee24d37ebd09b 100644 --- a/apps/files_sharing/l10n/it.js +++ b/apps/files_sharing/l10n/it.js @@ -120,6 +120,7 @@ OC.L10N.register( "You cannot share to a Circle if the app is not enabled" : "Non puoi condividere con una cerchia se l'applicazione non è abilitata", "Please specify a valid circle" : "Specifica una cerchia valida", "Sharing %s failed because the back end does not support room shares" : "Condivisione di %s non riuscita poiché il motore non supporta condivisioni di stanza", + "Sharing %s failed because the back end does not support ScienceMesh shares" : "Condivisione di %s non riuscita poiché il motore non supporta condivisioni di ScienceMesh", "Unknown share type" : "Tipo di condivisione sconosciuto", "Not a directory" : "Non è una cartella", "Could not lock node" : "Impossibile bloccare il nodo", @@ -225,6 +226,7 @@ OC.L10N.register( "Circle" : "Cerchia", "Talk conversation" : "Conversazione di Talk", "Deck board" : "Lavagna di Deck", + "ScienceMesh" : "ScienceMesh", "on {server}" : "su {server}", "Others with access" : "Altri con accesso", "No other users with access found" : "Nessun altro utente con accesso trovato", @@ -274,6 +276,9 @@ OC.L10N.register( "One or more of your shares will expire tomorrow" : "Una o più delle tue condivisioni scadrà domani", "Copy to clipboard" : "Copia negli appunti", "Sorry, this link doesn’t seem to work anymore." : "Spiacenti, questo collegamento sembra non essere più attivo.", - "Toggle grid view" : "Commuta la vista a griglia" + "Toggle grid view" : "Commuta la vista a griglia", + "Sharing %s failed because the back end does not support sciencemesh shares" : "Condivisione di %s non riuscita poiché il motore non supporta condivisioni di sciencemesh", + "Science Mesh" : "Science Mesh", + "Error generating password from password_policy" : "Errore: la password non rispetta i criteri stabiliti" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json index 8423697e5cb52..0aaa94b5edcab 100644 --- a/apps/files_sharing/l10n/it.json +++ b/apps/files_sharing/l10n/it.json @@ -118,6 +118,7 @@ "You cannot share to a Circle if the app is not enabled" : "Non puoi condividere con una cerchia se l'applicazione non è abilitata", "Please specify a valid circle" : "Specifica una cerchia valida", "Sharing %s failed because the back end does not support room shares" : "Condivisione di %s non riuscita poiché il motore non supporta condivisioni di stanza", + "Sharing %s failed because the back end does not support ScienceMesh shares" : "Condivisione di %s non riuscita poiché il motore non supporta condivisioni di ScienceMesh", "Unknown share type" : "Tipo di condivisione sconosciuto", "Not a directory" : "Non è una cartella", "Could not lock node" : "Impossibile bloccare il nodo", @@ -223,6 +224,7 @@ "Circle" : "Cerchia", "Talk conversation" : "Conversazione di Talk", "Deck board" : "Lavagna di Deck", + "ScienceMesh" : "ScienceMesh", "on {server}" : "su {server}", "Others with access" : "Altri con accesso", "No other users with access found" : "Nessun altro utente con accesso trovato", @@ -272,6 +274,9 @@ "One or more of your shares will expire tomorrow" : "Una o più delle tue condivisioni scadrà domani", "Copy to clipboard" : "Copia negli appunti", "Sorry, this link doesn’t seem to work anymore." : "Spiacenti, questo collegamento sembra non essere più attivo.", - "Toggle grid view" : "Commuta la vista a griglia" + "Toggle grid view" : "Commuta la vista a griglia", + "Sharing %s failed because the back end does not support sciencemesh shares" : "Condivisione di %s non riuscita poiché il motore non supporta condivisioni di sciencemesh", + "Science Mesh" : "Science Mesh", + "Error generating password from password_policy" : "Errore: la password non rispetta i criteri stabiliti" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/apps/files_trashbin/l10n/it.js b/apps/files_trashbin/l10n/it.js index 07803b16d84af..d2dead8aa57b1 100644 --- a/apps/files_trashbin/l10n/it.js +++ b/apps/files_trashbin/l10n/it.js @@ -7,6 +7,7 @@ OC.L10N.register( "This application enables users to restore files that were deleted from the system." : "Questa applicazione permette agli utenti di ripristinare i file che sono stati eliminati dal sistema.", "This application enables users 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 users 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 a user 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." : "Questa applicazione consente agli utenti di ripristinare i file che sono stati eliminati dal sistema. Visualizza un elenco dei file eliminati nell'interfaccia web, e ha opzioni per ripristinare tali file nelle cartelle dei file degli utenti o rimuoverli definitivamente dal sistema. Il ripristino di un file ripristina anche le versioni relative, se l'applicazione delle versioni è abilitata. Se un file è eliminato da una condivisione, può essere ripristinato allo stesso modo, nonostante non sia più condiviso. In modo predefinito, questi file restano nel cestino per 30 giorni.\nPer impedire a un utente di rimanere senza spazio sul disco, l'applicazione File eliminati non utilizzerà più del 50% della quota libera attualmente disponibile. Se i file eliminati superano questo limite, l'applicazione elimina i file più datati fino a tornare sotto questo limite. Ulteriori informazioni sono disponibili nella documentazione di File eliminati.", "Restore" : "Ripristina", + "List of files that have been deleted." : "Lista di file che sono stati eliminati.", "Deleted" : "Eliminati", "No deleted files" : "Nessun file eliminato", "You will be able to recover deleted files from here" : "Potrai ripristinare i file eliminati da qui", diff --git a/apps/files_trashbin/l10n/it.json b/apps/files_trashbin/l10n/it.json index c367ed39e4a23..89f2b62818ea2 100644 --- a/apps/files_trashbin/l10n/it.json +++ b/apps/files_trashbin/l10n/it.json @@ -5,6 +5,7 @@ "This application enables users to restore files that were deleted from the system." : "Questa applicazione permette agli utenti di ripristinare i file che sono stati eliminati dal sistema.", "This application enables users 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 users 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 a user 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." : "Questa applicazione consente agli utenti di ripristinare i file che sono stati eliminati dal sistema. Visualizza un elenco dei file eliminati nell'interfaccia web, e ha opzioni per ripristinare tali file nelle cartelle dei file degli utenti o rimuoverli definitivamente dal sistema. Il ripristino di un file ripristina anche le versioni relative, se l'applicazione delle versioni è abilitata. Se un file è eliminato da una condivisione, può essere ripristinato allo stesso modo, nonostante non sia più condiviso. In modo predefinito, questi file restano nel cestino per 30 giorni.\nPer impedire a un utente di rimanere senza spazio sul disco, l'applicazione File eliminati non utilizzerà più del 50% della quota libera attualmente disponibile. Se i file eliminati superano questo limite, l'applicazione elimina i file più datati fino a tornare sotto questo limite. Ulteriori informazioni sono disponibili nella documentazione di File eliminati.", "Restore" : "Ripristina", + "List of files that have been deleted." : "Lista di file che sono stati eliminati.", "Deleted" : "Eliminati", "No deleted files" : "Nessun file eliminato", "You will be able to recover deleted files from here" : "Potrai ripristinare i file eliminati da qui", diff --git a/apps/files_versions/src/components/Version.vue b/apps/files_versions/src/components/Version.vue index a368720bb5123..def5abbcf4875 100644 --- a/apps/files_versions/src/components/Version.vue +++ b/apps/files_versions/src/components/Version.vue @@ -23,12 +23,15 @@ :force-display-actions="true" data-files-versions-version>