diff options
Diffstat (limited to 'apps')
89 files changed, 967 insertions, 340 deletions
diff --git a/apps/comments/l10n/it.js b/apps/comments/l10n/it.js index 0d5d13b5dd4..534f9b92812 100644 --- a/apps/comments/l10n/it.js +++ b/apps/comments/l10n/it.js @@ -9,6 +9,7 @@ OC.L10N.register( "%1$s commented on %2$s" : "%1$s ha commentato %2$s", "{author} commented on {file}" : "{author} ha commentato su {file}", "<strong>Comments</strong> for files" : "<strong>Commenti</strong> sui file", + "You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Sei stato menzionato su \"{file}\", in un commento di un account che è stato eliminato", "{user} mentioned you in a comment on \"{file}\"" : "{user} ti ha menzionato in un commento su \"{file}\"", "Files app plugin to add comments to files" : "Estensione dell'applicazione File per aggiungere commenti ai file", "Edit comment" : "Modifica commento", diff --git a/apps/comments/l10n/it.json b/apps/comments/l10n/it.json index c2f041c3557..a50d9b8d498 100644 --- a/apps/comments/l10n/it.json +++ b/apps/comments/l10n/it.json @@ -7,6 +7,7 @@ "%1$s commented on %2$s" : "%1$s ha commentato %2$s", "{author} commented on {file}" : "{author} ha commentato su {file}", "<strong>Comments</strong> for files" : "<strong>Commenti</strong> sui file", + "You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Sei stato menzionato su \"{file}\", in un commento di un account che è stato eliminato", "{user} mentioned you in a comment on \"{file}\"" : "{user} ti ha menzionato in un commento su \"{file}\"", "Files app plugin to add comments to files" : "Estensione dell'applicazione File per aggiungere commenti ai file", "Edit comment" : "Modifica commento", diff --git a/apps/contactsinteraction/l10n/it.js b/apps/contactsinteraction/l10n/it.js index 7454cf0ba23..93d714c2f0b 100644 --- a/apps/contactsinteraction/l10n/it.js +++ b/apps/contactsinteraction/l10n/it.js @@ -3,6 +3,8 @@ OC.L10N.register( { "Recently contacted" : "Contattati di recente", "Contacts Interaction" : "Interazione contatti", + "Manages interaction between accounts and contacts" : "Gestisce l'interazione tra account e contatti", + "Collect data about accounts and contacts interactions and provide an address book for the data" : "Raccoglie dati sulle interazioni tra gli account e i contatti e fornisce una rubrica per i dati", "Manages interaction between users and contacts" : "Gestisce l'interazione tra utenti e contatti", "Collect data about user and contacts interactions and provide an address book for the data" : "Raccoglie dati sulle interazioni tra gli utenti e i contatti e fornisce una rubrica per i dati" }, diff --git a/apps/contactsinteraction/l10n/it.json b/apps/contactsinteraction/l10n/it.json index f64b939e061..fc99a3c45f6 100644 --- a/apps/contactsinteraction/l10n/it.json +++ b/apps/contactsinteraction/l10n/it.json @@ -1,6 +1,8 @@ { "translations": { "Recently contacted" : "Contattati di recente", "Contacts Interaction" : "Interazione contatti", + "Manages interaction between accounts and contacts" : "Gestisce l'interazione tra account e contatti", + "Collect data about accounts and contacts interactions and provide an address book for the data" : "Raccoglie dati sulle interazioni tra gli account e i contatti e fornisce una rubrica per i dati", "Manages interaction between users and contacts" : "Gestisce l'interazione tra utenti e contatti", "Collect data about user and contacts interactions and provide an address book for the data" : "Raccoglie dati sulle interazioni tra gli utenti e i contatti e fornisce una rubrica per i dati" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" diff --git a/apps/dav/l10n/it.js b/apps/dav/l10n/it.js index 8268f752aba..17e5eb499fd 100644 --- a/apps/dav/l10n/it.js +++ b/apps/dav/l10n/it.js @@ -86,6 +86,7 @@ OC.L10N.register( "Organizer:" : "Organizzatore:", "Attendees:" : "Partecipanti:", "Title:" : "Titolo:", + "Date and time:" : "Data e ora:", "Location:" : "Posizione:", "Link:" : "Collegamento:", "Accept" : "Accetta", @@ -150,7 +151,9 @@ OC.L10N.register( "No outstanding DAV system address book sync." : "Nessuna sincronizzazione della rubrica del sistema DAV in sospeso.", "The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "La sincronizzazione della rubrica del sistema DAV non è ancora stata eseguita poiché la tua istanza ha più di 1000 utenti o perché si è verificato un errore. Eseguila a mano chiamando \"occ dav:sync-system-addressbook\".", "WebDAV endpoint" : "Terminatore WebDAV", + "Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Impossibile verificare se il server è configurato correttamente per consentire la sincronizzazione di file via WebDAV. Controllalo a mano.", "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Il tuo server web non è configurato correttamente per consentire la sincronizzazione dei file, poiché l'interfaccia WebDAV sembra essere danneggiata.", + "Your web server is properly set up to allow file synchronization over WebDAV." : "Il tuo server è configurato correttamente per consentire la sincronizzazione di file via WebDAV.", "Migrated calendar (%1$s)" : "Calendario migrato (%1$s)", "Calendars including events, details and attendees" : "Calendari inclusi eventi, dettagli e partecipanti", "Contacts and groups" : "Contatti e gruppi", @@ -185,6 +188,7 @@ OC.L10N.register( "Saved availability" : "Disponibilità salvata", "Failed to save availability" : "Salvataggio disponibilità non riuscito", "Availability" : "Disponibilità", + "If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se imposti il tuo orario di lavoro, le altre persone potranno vedere quando non sei in ufficio per organizzare una riunione.", "Absence" : "Assenza", "Configure your next absence period." : "Configura il tuo prossimo periodo di assenza.", "Calendar server" : "Server di calendari", diff --git a/apps/dav/l10n/it.json b/apps/dav/l10n/it.json index 3fe9cacca7e..bfdd8de8711 100644 --- a/apps/dav/l10n/it.json +++ b/apps/dav/l10n/it.json @@ -84,6 +84,7 @@ "Organizer:" : "Organizzatore:", "Attendees:" : "Partecipanti:", "Title:" : "Titolo:", + "Date and time:" : "Data e ora:", "Location:" : "Posizione:", "Link:" : "Collegamento:", "Accept" : "Accetta", @@ -148,7 +149,9 @@ "No outstanding DAV system address book sync." : "Nessuna sincronizzazione della rubrica del sistema DAV in sospeso.", "The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "La sincronizzazione della rubrica del sistema DAV non è ancora stata eseguita poiché la tua istanza ha più di 1000 utenti o perché si è verificato un errore. Eseguila a mano chiamando \"occ dav:sync-system-addressbook\".", "WebDAV endpoint" : "Terminatore WebDAV", + "Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Impossibile verificare se il server è configurato correttamente per consentire la sincronizzazione di file via WebDAV. Controllalo a mano.", "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Il tuo server web non è configurato correttamente per consentire la sincronizzazione dei file, poiché l'interfaccia WebDAV sembra essere danneggiata.", + "Your web server is properly set up to allow file synchronization over WebDAV." : "Il tuo server è configurato correttamente per consentire la sincronizzazione di file via WebDAV.", "Migrated calendar (%1$s)" : "Calendario migrato (%1$s)", "Calendars including events, details and attendees" : "Calendari inclusi eventi, dettagli e partecipanti", "Contacts and groups" : "Contatti e gruppi", @@ -183,6 +186,7 @@ "Saved availability" : "Disponibilità salvata", "Failed to save availability" : "Salvataggio disponibilità non riuscito", "Availability" : "Disponibilità", + "If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se imposti il tuo orario di lavoro, le altre persone potranno vedere quando non sei in ufficio per organizzare una riunione.", "Absence" : "Assenza", "Configure your next absence period." : "Configura il tuo prossimo periodo di assenza.", "Calendar server" : "Server di calendari", diff --git a/apps/dav/l10n/ru.js b/apps/dav/l10n/ru.js index 459cb931aa2..2c7b4d6dee6 100644 --- a/apps/dav/l10n/ru.js +++ b/apps/dav/l10n/ru.js @@ -86,6 +86,7 @@ OC.L10N.register( "Organizer:" : "Организатор:", "Attendees:" : "Участники:", "Title:" : "Название:", + "Date and time:" : "Дата и время:", "Location:" : "Местонахождение:", "Link:" : "Ссылка:", "Accept" : "Принять", @@ -170,6 +171,7 @@ OC.L10N.register( "Delete slot" : "Удалить интервал", "No working hours set" : "Рабочие часы не указаны", "Add slot" : "Добавить интервал", + "Weekdays" : "Дни недели", "Monday" : "Понедельник", "Tuesday" : "Вторник", "Wednesday" : "Среда", diff --git a/apps/dav/l10n/ru.json b/apps/dav/l10n/ru.json index 0c4a583aa7a..54c4a0af3a0 100644 --- a/apps/dav/l10n/ru.json +++ b/apps/dav/l10n/ru.json @@ -84,6 +84,7 @@ "Organizer:" : "Организатор:", "Attendees:" : "Участники:", "Title:" : "Название:", + "Date and time:" : "Дата и время:", "Location:" : "Местонахождение:", "Link:" : "Ссылка:", "Accept" : "Принять", @@ -168,6 +169,7 @@ "Delete slot" : "Удалить интервал", "No working hours set" : "Рабочие часы не указаны", "Add slot" : "Добавить интервал", + "Weekdays" : "Дни недели", "Monday" : "Понедельник", "Tuesday" : "Вторник", "Wednesday" : "Среда", diff --git a/apps/dav/l10n/tr.js b/apps/dav/l10n/tr.js index f515dfbfb5c..d7395abae3a 100644 --- a/apps/dav/l10n/tr.js +++ b/apps/dav/l10n/tr.js @@ -86,6 +86,7 @@ OC.L10N.register( "Organizer:" : "Düzenleyen:", "Attendees:" : "Katılımcılar:", "Title:" : "Başlık:", + "Date and time:" : "Tarih ve saat:", "Location:" : "Konum:", "Link:" : "Bağlantı:", "Accept" : "Kabul et", diff --git a/apps/dav/l10n/tr.json b/apps/dav/l10n/tr.json index a974b93b0b4..fe1ff2c38ed 100644 --- a/apps/dav/l10n/tr.json +++ b/apps/dav/l10n/tr.json @@ -84,6 +84,7 @@ "Organizer:" : "Düzenleyen:", "Attendees:" : "Katılımcılar:", "Title:" : "Başlık:", + "Date and time:" : "Tarih ve saat:", "Location:" : "Konum:", "Link:" : "Bağlantı:", "Accept" : "Kabul et", diff --git a/apps/dav/lib/CalDAV/Activity/Provider/Event.php b/apps/dav/lib/CalDAV/Activity/Provider/Event.php index 13f0036b0b0..a24ea791e74 100644 --- a/apps/dav/lib/CalDAV/Activity/Provider/Event.php +++ b/apps/dav/lib/CalDAV/Activity/Provider/Event.php @@ -81,7 +81,7 @@ class Event extends Base { * @param array $eventData * @return array */ - protected function generateObjectParameter(array $eventData) { + protected function generateObjectParameter(array $eventData, string $affectedUser): array { if (!isset($eventData['id']) || !isset($eventData['name'])) { throw new \InvalidArgumentException(); } @@ -97,7 +97,15 @@ class Event extends Base { // The calendar app needs to be manually loaded for the routes to be loaded OC_App::loadApp('calendar'); $linkData = $eventData['link']; - $objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . $linkData['owner'] . '/' . $linkData['calendar_uri'] . '/' . $linkData['object_uri']); + if ($affectedUser === $linkData['owner']) { + $objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . $linkData['owner'] . '/' . $linkData['calendar_uri'] . '/' . $linkData['object_uri']); + } else { + // Can't use the "real" owner and calendar names here because we create a custom + // calendar for incoming shares with the name "<calendar>_shared_by_<sharer>". + // Hack: Fix the link by generating it for the incoming shared calendar instead, + // as seen from the affected user. + $objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . $affectedUser . '/' . $linkData['calendar_uri'] . '_shared_by_' . $linkData['owner'] . '/' . $linkData['object_uri']); + } $link = [ 'view' => 'dayGridMonth', 'timeRange' => 'now', @@ -189,7 +197,7 @@ class Event extends Base { return [ 'actor' => $this->generateUserParameter($parameters['actor']), 'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l), - 'event' => $this->generateClassifiedObjectParameter($parameters['object']), + 'event' => $this->generateClassifiedObjectParameter($parameters['object'], $event->getAffectedUser()), ]; case self::SUBJECT_OBJECT_ADD . '_event_self': case self::SUBJECT_OBJECT_DELETE . '_event_self': @@ -198,7 +206,7 @@ class Event extends Base { case self::SUBJECT_OBJECT_RESTORE . '_event_self': return [ 'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l), - 'event' => $this->generateClassifiedObjectParameter($parameters['object']), + 'event' => $this->generateClassifiedObjectParameter($parameters['object'], $event->getAffectedUser()), ]; } } @@ -210,13 +218,13 @@ class Event extends Base { 'actor' => $this->generateUserParameter($parameters['actor']), 'sourceCalendar' => $this->generateCalendarParameter($parameters['sourceCalendar'], $this->l), 'targetCalendar' => $this->generateCalendarParameter($parameters['targetCalendar'], $this->l), - 'event' => $this->generateClassifiedObjectParameter($parameters['object']), + 'event' => $this->generateClassifiedObjectParameter($parameters['object'], $event->getAffectedUser()), ]; case self::SUBJECT_OBJECT_MOVE . '_event_self': return [ 'sourceCalendar' => $this->generateCalendarParameter($parameters['sourceCalendar'], $this->l), 'targetCalendar' => $this->generateCalendarParameter($parameters['targetCalendar'], $this->l), - 'event' => $this->generateClassifiedObjectParameter($parameters['object']), + 'event' => $this->generateClassifiedObjectParameter($parameters['object'], $event->getAffectedUser()), ]; } } @@ -233,22 +241,22 @@ class Event extends Base { return [ 'actor' => $this->generateUserParameter($parameters[0]), 'calendar' => $this->generateLegacyCalendarParameter($event->getObjectId(), $parameters[1]), - 'event' => $this->generateObjectParameter($parameters[2]), + 'event' => $this->generateObjectParameter($parameters[2], $event->getAffectedUser()), ]; case self::SUBJECT_OBJECT_ADD . '_event_self': case self::SUBJECT_OBJECT_DELETE . '_event_self': case self::SUBJECT_OBJECT_UPDATE . '_event_self': return [ 'calendar' => $this->generateLegacyCalendarParameter($event->getObjectId(), $parameters[1]), - 'event' => $this->generateObjectParameter($parameters[2]), + 'event' => $this->generateObjectParameter($parameters[2], $event->getAffectedUser()), ]; } throw new \InvalidArgumentException(); } - private function generateClassifiedObjectParameter(array $eventData) { - $parameter = $this->generateObjectParameter($eventData); + private function generateClassifiedObjectParameter(array $eventData, string $affectedUser): array { + $parameter = $this->generateObjectParameter($eventData, $affectedUser); if (!empty($eventData['classified'])) { $parameter['name'] = $this->l->t('Busy'); } diff --git a/apps/dav/lib/CalDAV/Activity/Provider/Todo.php b/apps/dav/lib/CalDAV/Activity/Provider/Todo.php index e2ddb99a1af..e4518ff49c2 100644 --- a/apps/dav/lib/CalDAV/Activity/Provider/Todo.php +++ b/apps/dav/lib/CalDAV/Activity/Provider/Todo.php @@ -104,7 +104,7 @@ class Todo extends Event { return [ 'actor' => $this->generateUserParameter($parameters['actor']), 'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l), - 'todo' => $this->generateObjectParameter($parameters['object']), + 'todo' => $this->generateObjectParameter($parameters['object'], $event->getAffectedUser()), ]; case self::SUBJECT_OBJECT_ADD . '_todo_self': case self::SUBJECT_OBJECT_DELETE . '_todo_self': @@ -113,7 +113,7 @@ class Todo extends Event { case self::SUBJECT_OBJECT_UPDATE . '_todo_needs_action_self': return [ 'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l), - 'todo' => $this->generateObjectParameter($parameters['object']), + 'todo' => $this->generateObjectParameter($parameters['object'], $event->getAffectedUser()), ]; } } @@ -125,13 +125,13 @@ class Todo extends Event { 'actor' => $this->generateUserParameter($parameters['actor']), 'sourceCalendar' => $this->generateCalendarParameter($parameters['sourceCalendar'], $this->l), 'targetCalendar' => $this->generateCalendarParameter($parameters['targetCalendar'], $this->l), - 'todo' => $this->generateObjectParameter($parameters['object']), + 'todo' => $this->generateObjectParameter($parameters['object'], $event->getAffectedUser()), ]; case self::SUBJECT_OBJECT_MOVE . '_todo_self': return [ 'sourceCalendar' => $this->generateCalendarParameter($parameters['sourceCalendar'], $this->l), 'targetCalendar' => $this->generateCalendarParameter($parameters['targetCalendar'], $this->l), - 'todo' => $this->generateObjectParameter($parameters['object']), + 'todo' => $this->generateObjectParameter($parameters['object'], $event->getAffectedUser()), ]; } } @@ -150,7 +150,7 @@ class Todo extends Event { return [ 'actor' => $this->generateUserParameter($parameters[0]), 'calendar' => $this->generateLegacyCalendarParameter($event->getObjectId(), $parameters[1]), - 'todo' => $this->generateObjectParameter($parameters[2]), + 'todo' => $this->generateObjectParameter($parameters[2], $event->getAffectedUser()), ]; case self::SUBJECT_OBJECT_ADD . '_todo_self': case self::SUBJECT_OBJECT_DELETE . '_todo_self': @@ -159,7 +159,7 @@ class Todo extends Event { case self::SUBJECT_OBJECT_UPDATE . '_todo_needs_action_self': return [ 'calendar' => $this->generateLegacyCalendarParameter($event->getObjectId(), $parameters[1]), - 'todo' => $this->generateObjectParameter($parameters[2]), + 'todo' => $this->generateObjectParameter($parameters[2], $event->getAffectedUser()), ]; } diff --git a/apps/dav/lib/Connector/Sabre/SharesPlugin.php b/apps/dav/lib/Connector/Sabre/SharesPlugin.php index 4cda346af01..d1cadee5f8b 100644 --- a/apps/dav/lib/Connector/Sabre/SharesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/SharesPlugin.php @@ -28,6 +28,7 @@ */ namespace OCA\DAV\Connector\Sabre; +use OC\Share20\Exception\BackendError; use OCA\DAV\Connector\Sabre\Node as DavNode; use OCP\Files\Folder; use OCP\Files\Node; @@ -54,24 +55,19 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { * @var \Sabre\DAV\Server */ private $server; - private IManager $shareManager; - private Tree $tree; private string $userId; - private Folder $userFolder; + /** @var IShare[][] */ private array $cachedShares = []; /** @var string[] */ private array $cachedFolders = []; public function __construct( - Tree $tree, - IUserSession $userSession, - Folder $userFolder, - IManager $shareManager + private Tree $tree, + private IUserSession $userSession, + private Folder $userFolder, + private IManager $shareManager, ) { - $this->tree = $tree; - $this->shareManager = $shareManager; - $this->userFolder = $userFolder; $this->userId = $userSession->getUser()->getUID(); } @@ -112,18 +108,29 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { IShare::TYPE_DECK, IShare::TYPE_SCIENCEMESH, ]; + foreach ($requestedShareTypes as $requestedShareType) { - $shares = $this->shareManager->getSharesBy( + $result = array_merge($result, $this->shareManager->getSharesBy( $this->userId, $requestedShareType, $node, false, -1 - ); - foreach ($shares as $share) { - $result[] = $share; + )); + + // Also check for shares where the user is the recipient + try { + $result = array_merge($result, $this->shareManager->getSharedWith( + $this->userId, + $requestedShareType, + $node, + -1 + )); + } catch (BackendError $e) { + // ignore } } + return $result; } @@ -145,27 +152,29 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { */ private function getShares(DavNode $sabreNode): array { if (isset($this->cachedShares[$sabreNode->getId()])) { - $shares = $this->cachedShares[$sabreNode->getId()]; - } else { - [$parentPath,] = \Sabre\Uri\split($sabreNode->getPath()); - if ($parentPath === '') { - $parentPath = '/'; - } - // if we already cached the folder this file is in we know there are no shares for this file - if (array_search($parentPath, $this->cachedFolders) === false) { - try { - $node = $sabreNode->getNode(); - } catch (NotFoundException $e) { - return []; - } - $shares = $this->getShare($node); - $this->cachedShares[$sabreNode->getId()] = $shares; - } else { + return $this->cachedShares[$sabreNode->getId()]; + } + + [$parentPath,] = \Sabre\Uri\split($sabreNode->getPath()); + if ($parentPath === '') { + $parentPath = '/'; + } + + // if we already cached the folder containing this file + // then we already know there are no shares here. + if (array_search($parentPath, $this->cachedFolders) === false) { + try { + $node = $sabreNode->getNode(); + } catch (NotFoundException $e) { return []; } + + $shares = $this->getShare($node); + $this->cachedShares[$sabreNode->getId()] = $shares; + return $shares; } - return $shares; + return []; } /** @@ -182,7 +191,9 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { return; } - // need prefetch ? + // If the node is a directory and we are requesting share types or sharees + // then we get all the shares in the folder and cache them. + // This is more performant than iterating each files afterwards. if ($sabreNode instanceof Directory && $propFind->getDepth() !== 0 && ( diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index e5309b79f03..53adeeecf46 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -294,13 +294,15 @@ class Server { $this->server->tree, \OC::$server->getTagManager() ) ); + // TODO: switch to LazyUserFolder $userFolder = \OC::$server->getUserFolder(); + $shareManager = \OCP\Server::get(\OCP\Share\IManager::class); $this->server->addPlugin(new SharesPlugin( $this->server->tree, $userSession, $userFolder, - \OC::$server->getShareManager() + $shareManager, )); $this->server->addPlugin(new CommentPropertiesPlugin( \OC::$server->getCommentsManager(), @@ -323,7 +325,7 @@ class Server { $this->server->tree, $user, \OC::$server->getRootFolder(), - \OC::$server->getShareManager(), + $shareManager, $view, \OCP\Server::get(IFilesMetadataManager::class) )); diff --git a/apps/dav/tests/unit/CalDAV/Activity/Provider/EventTest.php b/apps/dav/tests/unit/CalDAV/Activity/Provider/EventTest.php index 253e1628229..33fbc7a7432 100644 --- a/apps/dav/tests/unit/CalDAV/Activity/Provider/EventTest.php +++ b/apps/dav/tests/unit/CalDAV/Activity/Provider/EventTest.php @@ -108,7 +108,9 @@ class EventTest extends TestCase { * @param bool $calendarAppEnabled */ public function testGenerateObjectParameter(int $id, string $name, ?array $link, bool $calendarAppEnabled = true): void { + $affectedUser = 'otheruser'; if ($link) { + $affectedUser = $link['owner']; $generatedLink = [ 'view' => 'dayGridMonth', 'timeRange' => 'now', @@ -141,7 +143,40 @@ class EventTest extends TestCase { if ($link && $calendarAppEnabled) { $result['link'] = 'fullLink'; } - $this->assertEquals($result, $this->invokePrivate($this->provider, 'generateObjectParameter', [$objectParameter])); + $this->assertEquals($result, $this->invokePrivate($this->provider, 'generateObjectParameter', [$objectParameter, $affectedUser])); + } + + public function testGenerateObjectParameterWithSharedCalendar(): void { + $link = [ + 'object_uri' => 'someuuid.ics', + 'calendar_uri' => 'personal', + 'owner' => 'sharer' + ]; + $generatedLink = [ + 'view' => 'dayGridMonth', + 'timeRange' => 'now', + 'mode' => 'sidebar', + 'objectId' => base64_encode('/remote.php/dav/calendars/sharee/' . $link['calendar_uri'] . '_shared_by_sharer/' . $link['object_uri']), + 'recurrenceId' => 'next' + ]; + $this->appManager->expects($this->once()) + ->method('isEnabledForUser') + ->with('calendar') + ->willReturn(true); + $this->url->expects($this->once()) + ->method('getWebroot'); + $this->url->expects($this->once()) + ->method('linkToRouteAbsolute') + ->with('calendar.view.indexview.timerange.edit', $generatedLink) + ->willReturn('fullLink'); + $objectParameter = ['id' => 42, 'name' => 'calendar', 'link' => $link]; + $result = [ + 'type' => 'calendar-event', + 'id' => 42, + 'name' => 'calendar', + 'link' => 'fullLink', + ]; + $this->assertEquals($result, $this->invokePrivate($this->provider, 'generateObjectParameter', [$objectParameter, 'sharee'])); } public function dataGenerateObjectParameterThrows() { @@ -160,6 +195,6 @@ class EventTest extends TestCase { public function testGenerateObjectParameterThrows($eventData, string $exception = InvalidArgumentException::class): void { $this->expectException($exception); - $this->invokePrivate($this->provider, 'generateObjectParameter', [$eventData]); + $this->invokePrivate($this->provider, 'generateObjectParameter', [$eventData, 'no_user']); } } diff --git a/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php index e6e90838966..8949493b20b 100644 --- a/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php @@ -119,7 +119,7 @@ class SharesPluginTest extends \Test\TestCase { ->with( $this->equalTo('user1'), $this->anything(), - $this->anything(), + $this->equalTo($node), $this->equalTo(false), $this->equalTo(-1) ) @@ -133,6 +133,16 @@ class SharesPluginTest extends \Test\TestCase { return []; }); + $this->shareManager->expects($this->any()) + ->method('getSharedWith') + ->with( + $this->equalTo('user1'), + $this->anything(), + $this->equalTo($node), + $this->equalTo(-1) + ) + ->willReturn([]); + $propFind = new \Sabre\DAV\PropFind( '/dummyPath', [self::SHARETYPES_PROPERTYNAME], @@ -222,6 +232,16 @@ class SharesPluginTest extends \Test\TestCase { }); $this->shareManager->expects($this->any()) + ->method('getSharedWith') + ->with( + $this->equalTo('user1'), + $this->anything(), + $this->equalTo($node), + $this->equalTo(-1) + ) + ->willReturn([]); + + $this->shareManager->expects($this->any()) ->method('getSharesInFolder') ->with( $this->equalTo('user1'), diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index 0e0d944b284..f1f1b00e079 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -168,6 +168,7 @@ OC.L10N.register( "Your ownership transfer of {path} to {user} has completed." : "Il tuo trasferimento di proprietà di {path} a {user} è completato.", "The ownership transfer of {path} from {user} has completed." : "Il trasferimento di proprietà di {path} da {user} è completato.", "in %s" : "in %s", + "Transferred from %1$s on %2$s" : "Trasferito da %1$s su %2$s", "File Management" : "Gestione dei file", "Current directory path" : "Percorso della cartella corrente", "Reload current directory" : "Ricarica la cartella corrente", diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index f457870d937..4a2ec801c64 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -166,6 +166,7 @@ "Your ownership transfer of {path} to {user} has completed." : "Il tuo trasferimento di proprietà di {path} a {user} è completato.", "The ownership transfer of {path} from {user} has completed." : "Il trasferimento di proprietà di {path} da {user} è completato.", "in %s" : "in %s", + "Transferred from %1$s on %2$s" : "Trasferito da %1$s su %2$s", "File Management" : "Gestione dei file", "Current directory path" : "Percorso della cartella corrente", "Reload current directory" : "Ricarica la cartella corrente", diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js index 7d2d6f53494..f1fb0e4e9dd 100644 --- a/apps/files/l10n/tr.js +++ b/apps/files/l10n/tr.js @@ -168,6 +168,7 @@ OC.L10N.register( "Your ownership transfer of {path} to {user} has completed." : "{path} yolundaki sahipliğiniz {user} kullanıcısına aktarıldı.", "The ownership transfer of {path} from {user} has completed." : "{path} yolundaki {user} kullanıcısının sahipliği size aktarıldı.", "in %s" : "%s içinde", + "Transferred from %1$s on %2$s" : "%1$s üzerinden %2$s zamanında aktarıldı", "File Management" : "Dosya yönetimi", "Current directory path" : "Geçerli klasör yolu", "Reload current directory" : "Geçerli klasörü yeniden yükle", diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json index c1f375e5976..2176e103425 100644 --- a/apps/files/l10n/tr.json +++ b/apps/files/l10n/tr.json @@ -166,6 +166,7 @@ "Your ownership transfer of {path} to {user} has completed." : "{path} yolundaki sahipliğiniz {user} kullanıcısına aktarıldı.", "The ownership transfer of {path} from {user} has completed." : "{path} yolundaki {user} kullanıcısının sahipliği size aktarıldı.", "in %s" : "%s içinde", + "Transferred from %1$s on %2$s" : "%1$s üzerinden %2$s zamanında aktarıldı", "File Management" : "Dosya yönetimi", "Current directory path" : "Geçerli klasör yolu", "Reload current directory" : "Geçerli klasörü yeniden yükle", diff --git a/apps/files/src/actions/moveOrCopyAction.ts b/apps/files/src/actions/moveOrCopyAction.ts index 2456340a02c..d969d87efbe 100644 --- a/apps/files/src/actions/moveOrCopyAction.ts +++ b/apps/files/src/actions/moveOrCopyAction.ts @@ -200,17 +200,15 @@ const openFilePickerForAction = async (action: MoveCopyAction, dir = '/', nodes: const filePicker = getFilePickerBuilder(t('files', 'Choose destination')) .allowDirectories(true) .setFilter((n: Node) => { - // We only want to show folders that we can create nodes in - return (n.permissions & Permission.CREATE) !== 0 - // We don't want to show the current nodes in the file picker - && !fileIDs.includes(n.fileid) + // We don't want to show the current nodes in the file picker + return !fileIDs.includes(n.fileid) }) .setMimeTypeFilter([]) .setMultiSelect(false) .startAt(dir) return new Promise((resolve, reject) => { - filePicker.setButtonFactory((_selection, path: string) => { + filePicker.setButtonFactory((selection: Node[], path: string) => { const buttons: IFilePickerButton[] = [] const target = basename(path) diff --git a/apps/files/src/actions/moveOrCopyActionUtils.ts b/apps/files/src/actions/moveOrCopyActionUtils.ts index 01614b14d8a..82a12761cb9 100644 --- a/apps/files/src/actions/moveOrCopyActionUtils.ts +++ b/apps/files/src/actions/moveOrCopyActionUtils.ts @@ -70,7 +70,8 @@ export const canDownload = (nodes: Node[]) => { } export const canCopy = (nodes: Node[]) => { - // For now the only restriction is that a shared file - // cannot be copied if the download is disabled + // a shared file cannot be copied if the download is disabled + // it can be copied if the user has at least read permissions return canDownload(nodes) + && !nodes.some(node => node.permissions === Permission.NONE) } diff --git a/apps/files/src/components/BreadCrumbs.vue b/apps/files/src/components/BreadCrumbs.vue index 0727c8d3ad8..9f77b7502ba 100644 --- a/apps/files/src/components/BreadCrumbs.vue +++ b/apps/files/src/components/BreadCrumbs.vue @@ -71,6 +71,7 @@ import { useSelectionStore } from '../store/selection.ts' import { useUploaderStore } from '../store/uploader.ts' import filesListWidthMixin from '../mixins/filesListWidth.ts' import logger from '../logger' +import type { FileSource } from '../types.ts' export default defineComponent({ name: 'BreadCrumbs', @@ -123,8 +124,9 @@ export default defineComponent({ sections() { return this.dirs.map((dir: string, index: number) => { - const fileid = this.getFileIdFromPath(dir) - const to = { ...this.$route, params: { fileid }, query: { dir } } + const source = this.getFileSourceFromPath(dir) + const node: Node | undefined = source ? this.getNodeFromSource(source) : undefined + const to = { ...this.$route, params: { node: node?.fileid }, query: { dir } } return { dir, exact: true, @@ -153,19 +155,19 @@ export default defineComponent({ }, selectedFiles() { - return this.selectionStore.selected + return this.selectionStore.selected as FileSource[] }, draggingFiles() { - return this.draggingStore.dragging + return this.draggingStore.dragging as FileSource[] }, }, methods: { - getNodeFromId(id: number): Node | undefined { - return this.filesStore.getNode(id) + getNodeFromSource(source: FileSource): Node | undefined { + return this.filesStore.getNode(source) }, - getFileIdFromPath(path: string): number | undefined { + getFileSourceFromPath(path: string): FileSource | undefined { return this.pathsStore.getPath(this.currentView!.id, path) }, getDirDisplayName(path: string): string { @@ -173,8 +175,8 @@ export default defineComponent({ return this.$navigation?.active?.name || t('files', 'Home') } - const fileId: number | undefined = this.getFileIdFromPath(path) - const node: Node | undefined = (fileId) ? this.getNodeFromId(fileId) : undefined + const source: FileSource | undefined = this.getFileSourceFromPath(path) + const node: Node | undefined = source ? this.getNodeFromSource(source) : undefined return node?.attributes?.displayName || basename(path) }, @@ -244,12 +246,12 @@ export default defineComponent({ } // Else we're moving/copying files - const nodes = selection.map(fileid => this.filesStore.getNode(fileid)) as Node[] + const nodes = selection.map(source => this.filesStore.getNode(source)) as Node[] await onDropInternalFiles(nodes, folder, contents.contents, isCopy) // Reset selection after we dropped the files // if the dropped files are within the selection - if (selection.some(fileid => this.selectedFiles.includes(fileid))) { + if (selection.some(source => this.selectedFiles.includes(source))) { logger.debug('Dropped selection, resetting select store...') this.selectionStore.reset() } diff --git a/apps/files/src/components/FileEntry.vue b/apps/files/src/components/FileEntry.vue index 5d9fcf0e253..fc14b4e62e3 100644 --- a/apps/files/src/components/FileEntry.vue +++ b/apps/files/src/components/FileEntry.vue @@ -47,6 +47,7 @@ <FileEntryPreview ref="preview" :source="source" :dragover="dragover" + @auxclick.native="execDefaultAction" @click.native="execDefaultAction" /> <FileEntryName ref="name" @@ -55,7 +56,8 @@ :files-list-width="filesListWidth" :nodes="nodes" :source="source" - @click="execDefaultAction" /> + @auxclick.native="execDefaultAction" + @click.native="execDefaultAction" /> </td> <!-- Actions --> @@ -82,7 +84,7 @@ class="files-list__row-mtime" data-cy-files-list-row-mtime @click="openDetailsIfAvailable"> - <NcDateTime :timestamp="source.mtime" :ignore-seconds="true" /> + <NcDateTime v-if="source.mtime" :timestamp="source.mtime" :ignore-seconds="true" /> </td> <!-- View columns --> @@ -194,8 +196,8 @@ export default defineComponent({ }, size() { - const size = parseInt(this.source.size, 10) || 0 - if (typeof size !== 'number' || size < 0) { + const size = parseInt(this.source.size, 10) + if (typeof size !== 'number' || isNaN(size) || size < 0) { return this.t('files', 'Pending') } return formatFileSize(size, true) @@ -203,8 +205,8 @@ export default defineComponent({ sizeOpacity() { const maxOpacitySize = 10 * 1024 * 1024 - const size = parseInt(this.source.size, 10) || 0 - if (!size || size < 0) { + const size = parseInt(this.source.size, 10) + if (!size || isNaN(size) || size < 0) { return {} } diff --git a/apps/files/src/components/FileEntry/FileEntryCheckbox.vue b/apps/files/src/components/FileEntry/FileEntryCheckbox.vue index 747ff8d6cc9..26161df628a 100644 --- a/apps/files/src/components/FileEntry/FileEntryCheckbox.vue +++ b/apps/files/src/components/FileEntry/FileEntryCheckbox.vue @@ -41,6 +41,7 @@ import NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js' import { useKeyboardStore } from '../../store/keyboard.ts' import { useSelectionStore } from '../../store/selection.ts' import logger from '../../logger.js' +import type { FileSource } from '../../types.ts' export default defineComponent({ name: 'FileEntryCheckbox', @@ -83,10 +84,10 @@ export default defineComponent({ return this.selectionStore.selected }, isSelected() { - return this.selectedFiles.includes(this.fileid) + return this.selectedFiles.includes(this.source.source) }, index() { - return this.nodes.findIndex((node: Node) => node.fileid === this.fileid) + return this.nodes.findIndex((node: Node) => node.source === this.source.source) }, isFile() { return this.source.type === FileType.File @@ -105,20 +106,20 @@ export default defineComponent({ // Get the last selected and select all files in between if (this.keyboardStore?.shiftKey && lastSelectedIndex !== null) { - const isAlreadySelected = this.selectedFiles.includes(this.fileid) + const isAlreadySelected = this.selectedFiles.includes(this.source.source) const start = Math.min(newSelectedIndex, lastSelectedIndex) const end = Math.max(lastSelectedIndex, newSelectedIndex) const lastSelection = this.selectionStore.lastSelection const filesToSelect = this.nodes - .map(file => file.fileid) + .map(file => file.source) .slice(start, end + 1) - .filter(Boolean) as number[] + .filter(Boolean) as FileSource[] // If already selected, update the new selection _without_ the current file const selection = [...lastSelection, ...filesToSelect] - .filter(fileid => !isAlreadySelected || fileid !== this.fileid) + .filter(source => !isAlreadySelected || source !== this.source.source) logger.debug('Shift key pressed, selecting all files in between', { start, end, filesToSelect, isAlreadySelected }) // Keep previous lastSelectedIndex to be use for further shift selections @@ -127,8 +128,8 @@ export default defineComponent({ } const selection = selected - ? [...this.selectedFiles, this.fileid] - : this.selectedFiles.filter(fileid => fileid !== this.fileid) + ? [...this.selectedFiles, this.source.source] + : this.selectedFiles.filter(source => source !== this.source.source) logger.debug('Updating selection', { selection }) this.selectionStore.set(selection) diff --git a/apps/files/src/components/FileEntry/FileEntryName.vue b/apps/files/src/components/FileEntry/FileEntryName.vue index 87859de353a..91873f053eb 100644 --- a/apps/files/src/components/FileEntry/FileEntryName.vue +++ b/apps/files/src/components/FileEntry/FileEntryName.vue @@ -43,8 +43,7 @@ :aria-hidden="isRenaming" class="files-list__row-name-link" data-cy-files-list-row-name-link - v-bind="linkTo.params" - @click="$emit('click', $event)"> + v-bind="linkTo.params"> <!-- File name --> <span class="files-list__row-name-text"> <!-- Keep the displayName stuck to the extension to avoid whitespace rendering issues--> diff --git a/apps/files/src/components/FileEntryGrid.vue b/apps/files/src/components/FileEntryGrid.vue index 9d332491bea..c6823ee7cea 100644 --- a/apps/files/src/components/FileEntryGrid.vue +++ b/apps/files/src/components/FileEntryGrid.vue @@ -49,6 +49,7 @@ :dragover="dragover" :grid-mode="true" :source="source" + @auxclick.native="execDefaultAction" @click.native="execDefaultAction" /> <FileEntryName ref="name" @@ -58,7 +59,8 @@ :grid-mode="true" :nodes="nodes" :source="source" - @click="execDefaultAction" /> + @auxclick.native="execDefaultAction" + @click.native="execDefaultAction" /> </td> <!-- Actions --> diff --git a/apps/files/src/components/FileEntryMixin.ts b/apps/files/src/components/FileEntryMixin.ts index 2e34f757f9e..6ce90c0e28c 100644 --- a/apps/files/src/components/FileEntryMixin.ts +++ b/apps/files/src/components/FileEntryMixin.ts @@ -21,6 +21,7 @@ */ import type { ComponentPublicInstance, PropType } from 'vue' +import type { FileSource } from '../types.ts' import { showError } from '@nextcloud/dialogs' import { FileType, Permission, Folder, File as NcFile, NodeStatus, Node, View } from '@nextcloud/files' @@ -102,13 +103,13 @@ export default defineComponent({ }, draggingFiles() { - return this.draggingStore.dragging + return this.draggingStore.dragging as FileSource[] }, selectedFiles() { - return this.selectionStore.selected + return this.selectionStore.selected as FileSource[] }, isSelected() { - return this.fileid && this.selectedFiles.includes(this.fileid) + return this.selectedFiles.includes(this.source.source) }, isRenaming() { @@ -133,7 +134,7 @@ export default defineComponent({ // If we're dragging a selection, we need to check all files if (this.selectedFiles.length > 0) { - const nodes = this.selectedFiles.map(fileid => this.filesStore.getNode(fileid)) as Node[] + const nodes = this.selectedFiles.map(source => this.filesStore.getNode(source)) as Node[] return nodes.every(canDrag) } return canDrag(this.source) @@ -145,7 +146,7 @@ export default defineComponent({ } // If the current folder is also being dragged, we can't drop it on itself - if (this.fileid && this.draggingFiles.includes(this.fileid)) { + if (this.draggingFiles.includes(this.source.source)) { return false } @@ -157,15 +158,6 @@ export default defineComponent({ return this.actionsMenuStore.opened === this.uniqueId.toString() }, set(opened) { - // Only reset when opening a new menu - if (opened) { - // Reset any right click position override on close - // Wait for css animation to be done - const root = this.$el?.closest('main.app-content') as HTMLElement - root.style.removeProperty('--mouse-pos-x') - root.style.removeProperty('--mouse-pos-y') - } - this.actionsMenuStore.opened = opened ? this.uniqueId.toString() : null }, }, @@ -216,6 +208,11 @@ export default defineComponent({ // 200 = max width of the menu root.style.setProperty('--mouse-pos-x', Math.max(0, event.clientX - contentRect.left - 200) + 'px') root.style.setProperty('--mouse-pos-y', Math.max(0, event.clientY - contentRect.top) + 'px') + } else { + // Reset any right menu position potentially set + const root = this.$el?.closest('main.app-content') as HTMLElement + root.style.removeProperty('--mouse-pos-x') + root.style.removeProperty('--mouse-pos-y') } // If the clicked row is in the selection, open global menu @@ -228,7 +225,13 @@ export default defineComponent({ }, execDefaultAction(event) { - if (event.ctrlKey || event.metaKey) { + // Ignore right click. + if (event.button > 1) { + return + } + + // if ctrl+click or middle mouse button, open in new tab + if (event.ctrlKey || event.metaKey || event.button === 1) { event.preventDefault() window.open(generateUrl('/f/{fileId}', { fileId: this.fileid })) return false @@ -289,14 +292,14 @@ export default defineComponent({ // Dragging set of files, if we're dragging a file // that is already selected, we use the entire selection - if (this.selectedFiles.includes(this.fileid)) { + if (this.selectedFiles.includes(this.source.source)) { this.draggingStore.set(this.selectedFiles) } else { - this.draggingStore.set([this.fileid]) + this.draggingStore.set([this.source.source]) } const nodes = this.draggingStore.dragging - .map(fileid => this.filesStore.getNode(fileid)) as Node[] + .map(source => this.filesStore.getNode(source)) as Node[] const image = await getDragAndDropPreview(nodes) event.dataTransfer?.setDragImage(image, -10, -10) @@ -350,12 +353,12 @@ export default defineComponent({ } // Else we're moving/copying files - const nodes = selection.map(fileid => this.filesStore.getNode(fileid)) as Node[] + const nodes = selection.map(source => this.filesStore.getNode(source)) as Node[] await onDropInternalFiles(nodes, folder, contents.contents, isCopy) // Reset selection after we dropped the files // if the dropped files are within the selection - if (selection.some(fileid => this.selectedFiles.includes(fileid))) { + if (selection.some(source => this.selectedFiles.includes(source))) { logger.debug('Dropped selection, resetting select store...') this.selectionStore.reset() } diff --git a/apps/files/src/components/FilesListTableHeader.vue b/apps/files/src/components/FilesListTableHeader.vue index c45090ca37d..caa549fa9ba 100644 --- a/apps/files/src/components/FilesListTableHeader.vue +++ b/apps/files/src/components/FilesListTableHeader.vue @@ -81,6 +81,7 @@ import FilesListTableHeaderButton from './FilesListTableHeaderButton.vue' import filesSortingMixin from '../mixins/filesSorting.ts' import logger from '../logger.js' import type { Node } from '@nextcloud/files' +import type { FileSource } from '../types.ts' export default defineComponent({ name: 'FilesListTableHeader', @@ -186,7 +187,7 @@ export default defineComponent({ onToggleAll(selected) { if (selected) { - const selection = this.nodes.map(node => node.fileid).filter(Boolean) as number[] + const selection = this.nodes.map(node => node.source).filter(Boolean) as FileSource[] logger.debug('Added all nodes to selection', { selection }) this.selectionStore.setLastIndex(null) this.selectionStore.set(selection) diff --git a/apps/files/src/components/FilesListTableHeaderActions.vue b/apps/files/src/components/FilesListTableHeaderActions.vue index ff9c0ee9bc5..c10b5673130 100644 --- a/apps/files/src/components/FilesListTableHeaderActions.vue +++ b/apps/files/src/components/FilesListTableHeaderActions.vue @@ -56,7 +56,7 @@ import { useFilesStore } from '../store/files.ts' import { useSelectionStore } from '../store/selection.ts' import filesListWidthMixin from '../mixins/filesListWidth.ts' import logger from '../logger.js' -import type { FileId } from '../types' +import type { FileSource } from '../types' // The registered actions list const actions = getFileActions() @@ -81,7 +81,7 @@ export default defineComponent({ required: true, }, selectedNodes: { - type: Array as PropType<FileId[]>, + type: Array as PropType<FileSource[]>, default: () => ([]), }, }, @@ -117,7 +117,7 @@ export default defineComponent({ nodes() { return this.selectedNodes - .map(fileid => this.getNode(fileid)) + .map(source => this.getNode(source)) .filter(Boolean) as Node[] }, @@ -161,7 +161,7 @@ export default defineComponent({ async onActionClick(action) { const displayName = action.displayName(this.nodes, this.currentView) - const selectionIds = this.selectedNodes + const selectionSources = this.selectedNodes try { // Set loading markers this.loading = action.id @@ -182,9 +182,9 @@ export default defineComponent({ // Handle potential failures if (results.some(result => result === false)) { // Remove the failed ids from the selection - const failedIds = selectionIds - .filter((fileid, index) => results[index] === false) - this.selectionStore.set(failedIds) + const failedSources = selectionSources + .filter((source, index) => results[index] === false) + this.selectionStore.set(failedSources) if (results.some(result => result === null)) { // If some actions returned null, we assume that the dev diff --git a/apps/files/src/services/Files.ts b/apps/files/src/services/Files.ts index 5730eb8ce31..0710c005852 100644 --- a/apps/files/src/services/Files.ts +++ b/apps/files/src/services/Files.ts @@ -47,7 +47,7 @@ export const resultToNode = function(node: FileStat): File | Folder { const props = node.props as ResponseProps const permissions = davParsePermissions(props?.permissions) - const owner = (props['owner-id'] || userId).toString() + const owner = String(props['owner-id'] || userId) const source = generateRemoteUrl('dav' + rootPath + node.filename) const id = props?.fileid < 0 @@ -66,7 +66,9 @@ export const resultToNode = function(node: FileStat): File | Folder { attributes: { ...node, ...props, - hasPreview: props?.['has-preview'], + 'owner-id': owner, + 'owner-display-name': String(props['owner-display-name']), + hasPreview: !!props?.['has-preview'], failed: props?.fileid < 0, }, } diff --git a/apps/files/src/store/dragging.ts b/apps/files/src/store/dragging.ts index e189d552046..8ec9d6d1fdb 100644 --- a/apps/files/src/store/dragging.ts +++ b/apps/files/src/store/dragging.ts @@ -21,7 +21,7 @@ */ import { defineStore } from 'pinia' import Vue from 'vue' -import type { FileId, DragAndDropStore } from '../types' +import type { DragAndDropStore, FileSource } from '../types' export const useDragAndDropStore = defineStore('dragging', { state: () => ({ @@ -32,7 +32,7 @@ export const useDragAndDropStore = defineStore('dragging', { /** * Set the selection of fileIds */ - set(selection = [] as FileId[]) { + set(selection = [] as FileSource[]) { Vue.set(this, 'dragging', selection) }, diff --git a/apps/files/src/store/files.ts b/apps/files/src/store/files.ts index 56ae01192ef..fb7a7d162ad 100644 --- a/apps/files/src/store/files.ts +++ b/apps/files/src/store/files.ts @@ -19,14 +19,28 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ + +import type { FilesStore, RootsStore, RootOptions, Service, FilesState, FileSource } from '../types' +import type { FileStat, ResponseDataDetailed } from 'webdav' import type { Folder, Node } from '@nextcloud/files' -import type { FilesStore, RootsStore, RootOptions, Service, FilesState, FileId } from '../types' +import { davGetDefaultPropfind, davResultToNode, davRootPath } from '@nextcloud/files' import { defineStore } from 'pinia' import { subscribe } from '@nextcloud/event-bus' import logger from '../logger' import Vue from 'vue' +import { client } from '../services/WebdavClient.ts' + +const fetchNode = async (node: Node): Promise<Node> => { + const propfindPayload = davGetDefaultPropfind() + const result = await client.stat(`${davRootPath}${node.path}`, { + details: true, + data: propfindPayload, + }) as ResponseDataDetailed<FileStat> + return davResultToNode(result.data) +} + export const useFilesStore = function(...args) { const store = defineStore('files', { state: (): FilesState => ({ @@ -36,19 +50,27 @@ export const useFilesStore = function(...args) { getters: { /** - * Get a file or folder by id + * Get a file or folder by its source */ - getNode: (state) => (id: FileId): Node|undefined => state.files[id], + getNode: (state) => (source: FileSource): Node|undefined => state.files[source], /** * Get a list of files or folders by their IDs - * Does not return undefined values + * Note: does not return undefined values */ - getNodes: (state) => (ids: FileId[]): Node[] => ids - .map(id => state.files[id]) + getNodes: (state) => (sources: FileSource[]): Node[] => sources + .map(source => state.files[source]) .filter(Boolean), + /** - * Get a file or folder by id + * Get files or folders by their file ID + * Multiple nodes can have the same file ID but different sources + * (e.g. in a shared context) + */ + getNodesById: (state) => (fileId: number): Node[] => Object.values(state.files).filter(node => node.fileid === fileId), + + /** + * Get the root folder of a service */ getRoot: (state) => (service: Service): Folder|undefined => state.roots[service], }, @@ -58,10 +80,11 @@ export const useFilesStore = function(...args) { // Update the store all at once const files = nodes.reduce((acc, node) => { if (!node.fileid) { - logger.error('Trying to update/set a node without fileid', node) + logger.error('Trying to update/set a node without fileid', { node }) return acc } - acc[node.fileid] = node + + acc[node.source] = node return acc }, {} as FilesStore) @@ -70,8 +93,8 @@ export const useFilesStore = function(...args) { deleteNodes(nodes: Node[]) { nodes.forEach(node => { - if (node.fileid) { - Vue.delete(this.files, node.fileid) + if (node.source) { + Vue.delete(this.files, node.source) } }) }, @@ -88,8 +111,28 @@ export const useFilesStore = function(...args) { this.updateNodes([node]) }, - onUpdatedNode(node: Node) { - this.updateNodes([node]) + async onUpdatedNode(node: Node) { + if (!node.fileid) { + logger.error('Trying to update/set a node without fileid', { node }) + return + } + + // If we have multiple nodes with the same file ID, we need to update all of them + const nodes = this.getNodesById(node.fileid) + if (nodes.length > 1) { + await Promise.all(nodes.map(fetchNode)).then(this.updateNodes) + logger.debug(nodes.length + ' nodes updated in store', { fileid: node.fileid }) + return + } + + // If we have only one node with the file ID, we can update it directly + if (node.source === nodes[0].source) { + this.updateNodes([node]) + return + } + + // Otherwise, it means we receive an event for a node that is not in the store + fetchNode(node).then(n => this.updateNodes([n])) }, }, }) diff --git a/apps/files/src/store/paths.ts b/apps/files/src/store/paths.ts index 15d16b1760b..816014feb56 100644 --- a/apps/files/src/store/paths.ts +++ b/apps/files/src/store/paths.ts @@ -19,7 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ -import type { FileId, PathsStore, PathOptions, ServicesState } from '../types' +import type { FileSource, PathsStore, PathOptions, ServicesState } from '../types' import { defineStore } from 'pinia' import { FileType, Folder, Node, getNavigation } from '@nextcloud/files' import { subscribe } from '@nextcloud/event-bus' @@ -38,7 +38,7 @@ export const usePathsStore = function(...args) { getters: { getPath: (state) => { - return (service: string, path: string): FileId|undefined => { + return (service: string, path: string): FileSource|undefined => { if (!state.paths[service]) { return undefined } @@ -55,7 +55,7 @@ export const usePathsStore = function(...args) { } // Now we can set the provided path - Vue.set(this.paths[payload.service], payload.path, payload.fileid) + Vue.set(this.paths[payload.service], payload.path, payload.source) }, onCreatedNode(node: Node) { @@ -70,7 +70,7 @@ export const usePathsStore = function(...args) { this.addPath({ service, path: node.path, - fileid: node.fileid, + source: node.source, }) } @@ -81,26 +81,26 @@ export const usePathsStore = function(...args) { if (!root._children) { Vue.set(root, '_children', []) } - root._children.push(node.fileid) + root._children.push(node.source) return } // If the folder doesn't exists yet, it will be // fetched later and its children updated anyway. if (this.paths[service][node.dirname]) { - const parentId = this.paths[service][node.dirname] - const parentFolder = files.getNode(parentId) as Folder + const parentSource = this.paths[service][node.dirname] + const parentFolder = files.getNode(parentSource) as Folder logger.debug('Path already exists, updating children', { parentFolder, node }) if (!parentFolder) { - logger.error('Parent folder not found', { parentId }) + logger.error('Parent folder not found', { parentSource }) return } if (!parentFolder._children) { Vue.set(parentFolder, '_children', []) } - parentFolder._children.push(node.fileid) + parentFolder._children.push(node.source) return } diff --git a/apps/files/src/store/selection.ts b/apps/files/src/store/selection.ts index e304d27340e..d035f18d54b 100644 --- a/apps/files/src/store/selection.ts +++ b/apps/files/src/store/selection.ts @@ -21,7 +21,7 @@ */ import { defineStore } from 'pinia' import Vue from 'vue' -import { FileId, SelectionStore } from '../types' +import { FileSource, SelectionStore } from '../types' export const useSelectionStore = defineStore('selection', { state: () => ({ @@ -34,14 +34,14 @@ export const useSelectionStore = defineStore('selection', { /** * Set the selection of fileIds */ - set(selection = [] as FileId[]) { + set(selection = [] as FileSource[]) { Vue.set(this, 'selected', [...new Set(selection)]) }, /** * Set the last selected index */ - setLastIndex(lastSelectedIndex = null as FileId | null) { + setLastIndex(lastSelectedIndex = null as number | null) { // Update the last selection if we provided a new selection starting point Vue.set(this, 'lastSelection', lastSelectedIndex ? this.selected : []) Vue.set(this, 'lastSelectedIndex', lastSelectedIndex) diff --git a/apps/files/src/types.ts b/apps/files/src/types.ts index 0e9dd6fb531..1ee0d31a33f 100644 --- a/apps/files/src/types.ts +++ b/apps/files/src/types.ts @@ -24,12 +24,12 @@ import type { Upload } from '@nextcloud/upload' // Global definitions export type Service = string -export type FileId = number +export type FileSource = string export type ViewId = string // Files store export type FilesStore = { - [fileid: FileId]: Node + [source: FileSource]: Node } export type RootsStore = { @@ -48,7 +48,7 @@ export interface RootOptions { // Paths store export type PathConfig = { - [path: string]: number + [path: string]: FileSource } export type ServicesState = { @@ -62,7 +62,7 @@ export type PathsStore = { export interface PathOptions { service: Service path: string - fileid: FileId + source: FileSource } // User config store @@ -74,8 +74,8 @@ export interface UserConfigStore { } export interface SelectionStore { - selected: FileId[] - lastSelection: FileId[] + selected: FileSource[] + lastSelection: FileSource[] lastSelectedIndex: number | null } @@ -109,7 +109,7 @@ export interface UploaderStore { // Drag and drop store export interface DragAndDropStore { - dragging: FileId[] + dragging: FileSource[] } export interface TemplateFile { diff --git a/apps/files/src/utils/hashUtils.ts b/apps/files/src/utils/hashUtils.ts index 55cf8b9f51a..305a603b952 100644 --- a/apps/files/src/utils/hashUtils.ts +++ b/apps/files/src/utils/hashUtils.ts @@ -21,8 +21,9 @@ */ export const hashCode = function(str: string): number { - return str.split('').reduce(function(a, b) { - a = ((a << 5) - a) + b.charCodeAt(0) - return a & a - }, 0) + let hash = 0 + for (let i = 0; i < str.length; i++) { + hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0 + } + return (hash >>> 0) } diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue index 9c739476793..a9c7dacc1ae 100644 --- a/apps/files/src/views/FilesList.vue +++ b/apps/files/src/views/FilesList.vue @@ -259,8 +259,13 @@ export default defineComponent({ if (this.dir === '/') { return this.filesStore.getRoot(this.currentView.id) } - const fileId = this.pathsStore.getPath(this.currentView.id, this.dir) - return this.filesStore.getNode(fileId) + + const source = this.pathsStore.getPath(this.currentView.id, this.dir) + if (source === undefined) { + return + } + + return this.filesStore.getNode(source) as Folder }, /** @@ -507,7 +512,7 @@ export default defineComponent({ // Define current directory children // TODO: make it more official - this.$set(folder, '_children', contents.map(node => node.fileid)) + this.$set(folder, '_children', contents.map(node => node.source)) // If we're in the root dir, define the root if (dir === '/') { @@ -516,7 +521,7 @@ export default defineComponent({ // Otherwise, add the folder to the store if (folder.fileid) { this.filesStore.updateNodes([folder]) - this.pathsStore.addPath({ service: currentView.id, fileid: folder.fileid, path: dir }) + this.pathsStore.addPath({ service: currentView.id, source: folder.source, path: dir }) } else { // If we're here, the view API messed up logger.error('Invalid root folder returned', { dir, folder, currentView }) diff --git a/apps/files_reminders/l10n/ga.js b/apps/files_reminders/l10n/ga.js new file mode 100644 index 00000000000..75acc35afe1 --- /dev/null +++ b/apps/files_reminders/l10n/ga.js @@ -0,0 +1,35 @@ +OC.L10N.register( + "files_reminders", + { + "File reminders" : "Meabhrúcháin comhaid", + "Reminder for {name}" : "Meabhrúchán do {name}", + "View file" : "Féach ar chomhad", + "View folder" : "Féach ar fhillteán", + "Set file reminders" : "Socraigh meabhrúcháin comhaid", + "**📣 File reminders**\n\nSet file reminders." : "**📣 Meabhrúcháin comhaid**\n\nSocraigh meabhrúcháin comhaid.", + "We will remind you of this file" : "Cuirfimid an comhad seo i gcuimhne duit", + "Please choose a valid date & time" : "Roghnaigh dáta agus am bailí le do thoil", + "Cancel" : "Cealaigh", + "Clear reminder" : "Meabhrúchán soiléir", + "Set reminder" : "Socraigh meabhrúchán", + "Set reminder for \"{fileName}\"" : "Socraigh meabhrúchán do \"{fileName}\"", + "Set reminder at custom date & time" : "Socraigh meabhrúchán ar dháta agus am saincheaptha", + "Reminder set for \"{fileName}\"" : "Meabhrúchán socraithe do \"{fileName}\"", + "Failed to set reminder" : "Theip ar an meabhrúchán a shocrú", + "Reminder cleared for \"{fileName}\"" : "Glanadh an meabhrúchán le haghaidh \"{fileName}\"", + "Failed to clear reminder" : "Theip ar an meabhrúchán a ghlanadh", + "Reminder set" : "Meabhrúchán socraithe", + "Set custom reminder" : "Socraigh meabhrúchán saincheaptha", + "Later today" : "Níos déanaí inniu", + "Set reminder for later today" : "Socraigh meabhrúchán le haghaidh níos déanaí inniu", + "Tomorrow" : "Amárach", + "Set reminder for tomorrow" : "Socraigh meabhrúchán don lá amárach", + "This weekend" : "An deireadh seachtaine seo", + "Set reminder for this weekend" : "Socraigh meabhrúchán don deireadh seachtaine seo", + "Next week" : "An tseachtain seo chugainn", + "Set reminder for next week" : "Socraigh meabhrúchán don tseachtain seo chugainn", + "Back" : "Ar ais", + "Reminder cleared" : "Meabhrúchán glanta", + "Failed to load reminder" : "Theip ar an meabhrúchán a lódáil" +}, +"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"); diff --git a/apps/files_reminders/l10n/ga.json b/apps/files_reminders/l10n/ga.json new file mode 100644 index 00000000000..191a954191f --- /dev/null +++ b/apps/files_reminders/l10n/ga.json @@ -0,0 +1,33 @@ +{ "translations": { + "File reminders" : "Meabhrúcháin comhaid", + "Reminder for {name}" : "Meabhrúchán do {name}", + "View file" : "Féach ar chomhad", + "View folder" : "Féach ar fhillteán", + "Set file reminders" : "Socraigh meabhrúcháin comhaid", + "**📣 File reminders**\n\nSet file reminders." : "**📣 Meabhrúcháin comhaid**\n\nSocraigh meabhrúcháin comhaid.", + "We will remind you of this file" : "Cuirfimid an comhad seo i gcuimhne duit", + "Please choose a valid date & time" : "Roghnaigh dáta agus am bailí le do thoil", + "Cancel" : "Cealaigh", + "Clear reminder" : "Meabhrúchán soiléir", + "Set reminder" : "Socraigh meabhrúchán", + "Set reminder for \"{fileName}\"" : "Socraigh meabhrúchán do \"{fileName}\"", + "Set reminder at custom date & time" : "Socraigh meabhrúchán ar dháta agus am saincheaptha", + "Reminder set for \"{fileName}\"" : "Meabhrúchán socraithe do \"{fileName}\"", + "Failed to set reminder" : "Theip ar an meabhrúchán a shocrú", + "Reminder cleared for \"{fileName}\"" : "Glanadh an meabhrúchán le haghaidh \"{fileName}\"", + "Failed to clear reminder" : "Theip ar an meabhrúchán a ghlanadh", + "Reminder set" : "Meabhrúchán socraithe", + "Set custom reminder" : "Socraigh meabhrúchán saincheaptha", + "Later today" : "Níos déanaí inniu", + "Set reminder for later today" : "Socraigh meabhrúchán le haghaidh níos déanaí inniu", + "Tomorrow" : "Amárach", + "Set reminder for tomorrow" : "Socraigh meabhrúchán don lá amárach", + "This weekend" : "An deireadh seachtaine seo", + "Set reminder for this weekend" : "Socraigh meabhrúchán don deireadh seachtaine seo", + "Next week" : "An tseachtain seo chugainn", + "Set reminder for next week" : "Socraigh meabhrúchán don tseachtain seo chugainn", + "Back" : "Ar ais", + "Reminder cleared" : "Meabhrúchán glanta", + "Failed to load reminder" : "Theip ar an meabhrúchán a lódáil" +},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);" +}
\ No newline at end of file diff --git a/apps/files_sharing/l10n/it.js b/apps/files_sharing/l10n/it.js index 97a10242bc4..66111f03a80 100644 --- a/apps/files_sharing/l10n/it.js +++ b/apps/files_sharing/l10n/it.js @@ -165,6 +165,7 @@ OC.L10N.register( "Error, please enter proper password and/or expiration date" : "Errore, digita la password corretta e/o la data di scadenza", "Link share created" : "Collegamento alla condivisione creato ", "Error while creating the share" : "Errore durante la creazione della condivisione", + "Quick share options, the current selected is \"{selectedOption}\"" : "Opzioni di condivisione rapida, l'attuale selezionata è \"{selectedOption}\"", "View only" : "Sola lettura", "Can edit" : "Può modificare", "File drop" : "Elimina file", @@ -180,6 +181,7 @@ OC.L10N.register( "Guest" : "Ospite", "Group" : "Gruppo", "Email" : "Posta elettronica", + "Team" : "Team", "Talk conversation" : "Conversazione di Talk", "Deck board" : "Lavagna di Deck", "ScienceMesh" : "ScienceMesh", @@ -206,12 +208,16 @@ OC.L10N.register( "Share" : "Condividi", "Delete share" : "Elimina condivisione", "Share with {userName}" : "Condividi con {userName}", + "Share with email {email}" : "Condividi con l'email {email}", "Share with group" : "Condividi con gruppo", "Share in conversation" : "Condividi nella conversazione", + "Share with {user} on remote server {server}" : "Condividi con {user} sul server remoto {server}", + "Share with remote group" : "Condividi con gruppo remoto", "Share with guest" : "Condividi con ospite", "Update share" : "Aggiorna condivisione", "Save share" : "Salva condivisione", "Others with access" : "Altri con accesso", + "No other accounts with access found" : "Nessun altro account trovato con accesso", "Toggle list of others with access to this directory" : "Attiva l'elenco degli altri utenti con accesso a questa cartella ", "Toggle list of others with access to this file" : "Attiva l'elenco degli altri utenti con accesso a questo file ", "Unable to fetch inherited shares" : "Impossibile recuperare le condivisioni ereditate", @@ -224,6 +230,7 @@ OC.L10N.register( "_Reject share_::_Reject shares_" : ["Rifiuta condivisione","Rifiuta condivisioni","Rifiuta condivisioni"], "_Restore share_::_Restore shares_" : ["Ripristina condivisione","Ripristina condivisioni","Ripristina condivisioni"], "Shared" : "Condiviso", + "Shared multiple times with different people" : "Condiviso più volte con diverse persone", "Shared by {ownerDisplayName}" : "Condiviso da {ownerDisplayName}", "Show sharing options" : "Mostra le opzioni di condivisione", "Link to a file" : "Collega a un file", diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json index a53fd1b489a..3ade4f59fc4 100644 --- a/apps/files_sharing/l10n/it.json +++ b/apps/files_sharing/l10n/it.json @@ -163,6 +163,7 @@ "Error, please enter proper password and/or expiration date" : "Errore, digita la password corretta e/o la data di scadenza", "Link share created" : "Collegamento alla condivisione creato ", "Error while creating the share" : "Errore durante la creazione della condivisione", + "Quick share options, the current selected is \"{selectedOption}\"" : "Opzioni di condivisione rapida, l'attuale selezionata è \"{selectedOption}\"", "View only" : "Sola lettura", "Can edit" : "Può modificare", "File drop" : "Elimina file", @@ -178,6 +179,7 @@ "Guest" : "Ospite", "Group" : "Gruppo", "Email" : "Posta elettronica", + "Team" : "Team", "Talk conversation" : "Conversazione di Talk", "Deck board" : "Lavagna di Deck", "ScienceMesh" : "ScienceMesh", @@ -204,12 +206,16 @@ "Share" : "Condividi", "Delete share" : "Elimina condivisione", "Share with {userName}" : "Condividi con {userName}", + "Share with email {email}" : "Condividi con l'email {email}", "Share with group" : "Condividi con gruppo", "Share in conversation" : "Condividi nella conversazione", + "Share with {user} on remote server {server}" : "Condividi con {user} sul server remoto {server}", + "Share with remote group" : "Condividi con gruppo remoto", "Share with guest" : "Condividi con ospite", "Update share" : "Aggiorna condivisione", "Save share" : "Salva condivisione", "Others with access" : "Altri con accesso", + "No other accounts with access found" : "Nessun altro account trovato con accesso", "Toggle list of others with access to this directory" : "Attiva l'elenco degli altri utenti con accesso a questa cartella ", "Toggle list of others with access to this file" : "Attiva l'elenco degli altri utenti con accesso a questo file ", "Unable to fetch inherited shares" : "Impossibile recuperare le condivisioni ereditate", @@ -222,6 +228,7 @@ "_Reject share_::_Reject shares_" : ["Rifiuta condivisione","Rifiuta condivisioni","Rifiuta condivisioni"], "_Restore share_::_Restore shares_" : ["Ripristina condivisione","Ripristina condivisioni","Ripristina condivisioni"], "Shared" : "Condiviso", + "Shared multiple times with different people" : "Condiviso più volte con diverse persone", "Shared by {ownerDisplayName}" : "Condiviso da {ownerDisplayName}", "Show sharing options" : "Mostra le opzioni di condivisione", "Link to a file" : "Collega a un file", diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php index cdf370c82fd..cab989aeb43 100644 --- a/apps/files_sharing/lib/Controller/ShareAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareAPIController.php @@ -550,7 +550,8 @@ class ShareAPIController extends OCSController { * @param string $publicUpload If public uploading is allowed * @param string $password Password for the share * @param string|null $sendPasswordByTalk Send the password for the share over Talk - * @param string $expireDate Expiry date of the share using user timezone at 00:00. It means date in UTC timezone will be used. + * @param ?string $expireDate The expiry date of the share in the user's timezone at 00:00. + * If $expireDate is not supplied or set to `null`, the system default will be used. * @param string $note Note for the share * @param string $label Label for the share (only used in link and email) * @param string|null $attributes Additional attributes for the share @@ -571,8 +572,8 @@ class ShareAPIController extends OCSController { string $shareWith = null, string $publicUpload = 'false', string $password = '', - string $sendPasswordByTalk = null, - string $expireDate = '', + ?string $sendPasswordByTalk = null, + ?string $expireDate = null, string $note = '', string $label = '', string $attributes = null @@ -647,12 +648,18 @@ class ShareAPIController extends OCSController { } //Expire date - if ($expireDate !== '') { - try { - $expireDateTime = $this->parseDate($expireDate); - $share->setExpirationDate($expireDateTime); - } catch (\Exception $e) { - throw new OCSNotFoundException($this->l->t('Invalid date, date format must be YYYY-MM-DD')); + if ($expireDate !== null) { + if ($expireDate !== '') { + try { + $expireDateTime = $this->parseDate($expireDate); + $share->setExpirationDate($expireDateTime); + } catch (\Exception $e) { + throw new OCSNotFoundException($this->l->t('Invalid date, date format must be YYYY-MM-DD')); + } + } else { + // Client sent empty string for expire date. + // Set noExpirationDate to true so overwrite is prevented. + $share->setNoExpirationDate(true); } } @@ -769,19 +776,19 @@ class ShareAPIController extends OCSController { $share->setPermissions($permissions); } elseif ($shareType === IShare::TYPE_ROOM) { try { - $this->getRoomShareHelper()->createShare($share, $shareWith, $permissions, $expireDate); + $this->getRoomShareHelper()->createShare($share, $shareWith, $permissions, $expireDate ?? ''); } catch (QueryException $e) { throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support room shares', [$node->getPath()])); } } elseif ($shareType === IShare::TYPE_DECK) { try { - $this->getDeckShareHelper()->createShare($share, $shareWith, $permissions, $expireDate); + $this->getDeckShareHelper()->createShare($share, $shareWith, $permissions, $expireDate ?? ''); } catch (QueryException $e) { throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support room shares', [$node->getPath()])); } } elseif ($shareType === IShare::TYPE_SCIENCEMESH) { try { - $this->getSciencemeshShareHelper()->createShare($share, $shareWith, $permissions, $expireDate); + $this->getSciencemeshShareHelper()->createShare($share, $shareWith, $permissions, $expireDate ?? ''); } catch (QueryException $e) { throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support ScienceMesh shares', [$node->getPath()])); } diff --git a/apps/files_sharing/openapi.json b/apps/files_sharing/openapi.json index 9a869feb3b2..661134126d3 100644 --- a/apps/files_sharing/openapi.json +++ b/apps/files_sharing/openapi.json @@ -1755,10 +1755,10 @@ { "name": "expireDate", "in": "query", - "description": "Expiry date of the share using user timezone at 00:00. It means date in UTC timezone will be used.", + "description": "The expiry date of the share in the user's timezone at 00:00. If $expireDate is not supplied or set to `null`, the system default will be used.", "schema": { "type": "string", - "default": "" + "nullable": true } }, { diff --git a/apps/files_sharing/src/actions/sharingStatusAction.ts b/apps/files_sharing/src/actions/sharingStatusAction.ts index 98a7d3d6112..4f9648fa27f 100644 --- a/apps/files_sharing/src/actions/sharingStatusAction.ts +++ b/apps/files_sharing/src/actions/sharingStatusAction.ts @@ -34,14 +34,22 @@ import { getCurrentUser } from '@nextcloud/auth' import './sharingStatusAction.scss' -const generateAvatarSvg = (userId: string) => { - const avatarUrl = generateUrl('/avatar/{userId}/32', { userId }) +const isDarkMode = window?.matchMedia?.('(prefers-color-scheme: dark)')?.matches === true + || document.querySelector('[data-themes*=dark]') !== null + +const generateAvatarSvg = (userId: string, isGuest = false) => { + const url = isDarkMode ? '/avatar/{userId}/32/dark' : '/avatar/{userId}/32' + const avatarUrl = generateUrl(isGuest ? url : url + '?guestFallback=true', { userId }) return `<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" class="sharing-status__avatar"> <image href="${avatarUrl}" height="32" width="32" /> </svg>` } +const isExternal = (node: Node) => { + return node.attributes.remote_id !== undefined +} + export const action = new FileAction({ id: 'sharing-status', displayName(nodes: Node[]) { @@ -50,7 +58,7 @@ export const action = new FileAction({ const ownerId = node?.attributes?.['owner-id'] if (shareTypes.length > 0 - || (ownerId && ownerId !== getCurrentUser()?.uid)) { + || (ownerId !== getCurrentUser()?.uid || isExternal(node))) { return t('files_sharing', 'Shared') } @@ -63,11 +71,11 @@ export const action = new FileAction({ const ownerDisplayName = node?.attributes?.['owner-display-name'] // Mixed share types - if (Array.isArray(node.attributes?.['share-types'])) { + if (Array.isArray(node.attributes?.['share-types']) && node.attributes?.['share-types'].length > 1) { return t('files_sharing', 'Shared multiple times with different people') } - if (ownerId && ownerId !== getCurrentUser()?.uid) { + if (ownerId && (ownerId !== getCurrentUser()?.uid || isExternal(node))) { return t('files_sharing', 'Shared by {ownerDisplayName}', { ownerDisplayName }) } @@ -79,7 +87,7 @@ export const action = new FileAction({ const shareTypes = Object.values(node?.attributes?.['share-types'] || {}).flat() as number[] // Mixed share types - if (Array.isArray(node.attributes?.['share-types'])) { + if (Array.isArray(node.attributes?.['share-types']) && node.attributes?.['share-types'].length > 1) { return AccountPlusSvg } @@ -101,8 +109,8 @@ export const action = new FileAction({ } const ownerId = node?.attributes?.['owner-id'] - if (ownerId && ownerId !== getCurrentUser()?.uid) { - return generateAvatarSvg(ownerId) + if (ownerId && (ownerId !== getCurrentUser()?.uid || isExternal(node))) { + return generateAvatarSvg(ownerId, isExternal(node)) } return AccountPlusSvg @@ -124,7 +132,7 @@ export const action = new FileAction({ } // If the node is shared by someone else - if (ownerId && ownerId !== getCurrentUser()?.uid) { + if (ownerId && (ownerId !== getCurrentUser()?.uid || isExternal(node))) { return true } diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue index a1fba7663d0..680901244a2 100644 --- a/apps/files_sharing/src/components/SharingEntryLink.vue +++ b/apps/files_sharing/src/components/SharingEntryLink.vue @@ -205,6 +205,7 @@ import GeneratePassword from '../utils/GeneratePassword.js' import Share from '../models/Share.js' import SharesMixin from '../mixins/SharesMixin.js' import ShareDetails from '../mixins/ShareDetails.js' +import { getLoggerBuilder } from '@nextcloud/logger' export default { name: 'SharingEntryLink', @@ -237,6 +238,7 @@ export default { data() { return { + shareCreationComplete: false, copySuccess: true, copied: false, @@ -245,6 +247,10 @@ export default { ExternalLegacyLinkActions: OCA.Sharing.ExternalLinkActions.state, ExternalShareActions: OCA.Sharing.ExternalShareActions.state, + logger: getLoggerBuilder() + .setApp('files_sharing') + .detectUser() + .build(), } }, @@ -405,6 +411,32 @@ export default { return this.config.isDefaultExpireDateEnforced && this.share && !this.share.id }, + sharePolicyHasRequiredProperties() { + return this.config.enforcePasswordForPublicLink || this.config.isDefaultExpireDateEnforced + }, + + requiredPropertiesMissing() { + // Ensure share exist and the share policy has required properties + if (!this.sharePolicyHasRequiredProperties) { + return false + } + + if (!this.share) { + // if no share, we can't tell if properties are missing or not so we assume properties are missing + return true + } + + // If share has ID, then this is an incoming link share created from the existing link share + // Hence assume required properties + if (this.share.id) { + return true + } + // Check if either password or expiration date is missing and enforced + const isPasswordMissing = this.config.enforcePasswordForPublicLink && !this.share.password + const isExpireDateMissing = this.config.isDefaultExpireDateEnforced && !this.share.expireDate + + return isPasswordMissing || isExpireDateMissing + }, // if newPassword exists, but is empty, it means // the user deleted the original password hasUnsavedPassword() { @@ -481,6 +513,7 @@ export default { * Create a new share link and append it to the list */ async onNewLinkShare() { + this.logger.debug('onNewLinkShare called (with this.share)', this.share) // do not run again if already loading if (this.loading) { return @@ -495,28 +528,13 @@ export default { shareDefaults.expiration = this.formatDateToString(this.config.defaultExpirationDate) } + this.logger.debug('Missing required properties?', this.requiredPropertiesMissing) // do not push yet if we need a password or an expiration date: show pending menu - if (this.config.enableLinkPasswordByDefault || this.config.enforcePasswordForPublicLink || this.config.isDefaultExpireDateEnforced) { + if (this.sharePolicyHasRequiredProperties && this.requiredPropertiesMissing) { this.pending = true + this.shareCreationComplete = false - // if a share already exists, pushing it - if (this.share && !this.share.id) { - // if the share is valid, create it on the server - if (this.checkShare(this.share)) { - try { - await this.pushNewLinkShare(this.share, true) - } catch (e) { - this.pending = false - console.error(e) - return false - } - return true - } else { - this.open = true - OC.Notification.showTemporary(t('files_sharing', 'Error, please enter proper password and/or expiration date')) - return false - } - } + this.logger.info('Share policy requires mandated properties (password)...') // ELSE, show the pending popovermenu // if password default or enforced, pre-fill with random one @@ -538,8 +556,32 @@ export default { // Nothing is enforced, creating share directly } else { + + // if a share already exists, pushing it + if (this.share && !this.share.id) { + // if the share is valid, create it on the server + if (this.checkShare(this.share)) { + try { + this.logger.info('Sending existing share to server', this.share) + await this.pushNewLinkShare(this.share, true) + this.shareCreationComplete = true + this.logger.info('Share created on server', this.share) + } catch (e) { + this.pending = false + this.logger.error('Error creating share', e) + return false + } + return true + } else { + this.open = true + showError(t('files_sharing', 'Error, please enter proper password and/or expiration date')) + return false + } + } + const share = new Share(shareDefaults) await this.pushNewLinkShare(share) + this.shareCreationComplete = true } }, @@ -579,8 +621,8 @@ export default { const newShare = await this.createShare(options) this.open = false + this.shareCreationComplete = true console.debug('Link share created', newShare) - // if share already exists, copy link directly on next tick let component if (update) { @@ -622,8 +664,10 @@ export default { this.onSyncError('pending', message) } throw data + } finally { this.loading = false + this.shareCreationComplete = true } }, async copyLink() { @@ -726,7 +770,9 @@ export default { // this.share already exists at this point, // but is incomplete as not pushed to server // YET. We can safely delete the share :) - this.$emit('remove:share', this.share) + if (!this.shareCreationComplete) { + this.$emit('remove:share', this.share) + } }, }, } @@ -747,25 +793,21 @@ export default { min-width: 0; } - &__desc { - display: flex; - flex-direction: column; - line-height: 1.2em; + &__desc { + display: flex; + flex-direction: column; + line-height: 1.2em; - p { - color: var(--color-text-maxcontrast); - } + p { + color: var(--color-text-maxcontrast); + } - &__title { - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; + &__title { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } } - } - - &__copy { - - } &:not(.sharing-entry--share) &__actions { .new-share-link { diff --git a/apps/files_sharing/src/mixins/ShareDetails.js b/apps/files_sharing/src/mixins/ShareDetails.js index 3884d22dae6..60645ef89c8 100644 --- a/apps/files_sharing/src/mixins/ShareDetails.js +++ b/apps/files_sharing/src/mixins/ShareDetails.js @@ -1,4 +1,5 @@ import Share from '../models/Share.js' +import Config from '../services/ConfigService.js' export default { methods: { @@ -50,7 +51,7 @@ export default { user: shareRequestObject.shareWith, share_with_displayname: shareRequestObject.displayName, subtitle: shareRequestObject.subtitle, - permissions: shareRequestObject.permissions, + permissions: shareRequestObject.permissions ?? new Config().defaultPermissions, expiration: '', } diff --git a/apps/files_sharing/src/services/SharingService.spec.ts b/apps/files_sharing/src/services/SharingService.spec.ts index 54e2355b082..ed3a0cb6590 100644 --- a/apps/files_sharing/src/services/SharingService.spec.ts +++ b/apps/files_sharing/src/services/SharingService.spec.ts @@ -346,12 +346,27 @@ describe('SharingService share to Node mapping', () => { expect(folder.attributes.favorite).toBe(1) }) + test('Empty', async () => { + jest.spyOn(logger, 'error').mockImplementationOnce(() => {}) + jest.spyOn(axios, 'get').mockReturnValueOnce(Promise.resolve({ + data: { + ocs: { + data: [], + }, + }, + })) + + const shares = await getContents(false, true, false, false) + expect(shares.contents).toHaveLength(0) + expect(logger.error).toHaveBeenCalledTimes(0) + }) + test('Error', async () => { jest.spyOn(logger, 'error').mockImplementationOnce(() => {}) jest.spyOn(axios, 'get').mockReturnValueOnce(Promise.resolve({ data: { ocs: { - data: [{}], + data: [null], }, }, })) diff --git a/apps/files_sharing/src/services/SharingService.ts b/apps/files_sharing/src/services/SharingService.ts index 2f167dab535..a4c63bec7b0 100644 --- a/apps/files_sharing/src/services/SharingService.ts +++ b/apps/files_sharing/src/services/SharingService.ts @@ -22,7 +22,7 @@ /* eslint-disable camelcase, n/no-extraneous-import */ import type { AxiosPromise } from 'axios' -import { Folder, File, type ContentsWithRoot } from '@nextcloud/files' +import { Folder, File, type ContentsWithRoot, Permission } from '@nextcloud/files' import { generateOcsUrl, generateRemoteUrl } from '@nextcloud/router' import { getCurrentUser } from '@nextcloud/auth' import axios from '@nextcloud/axios' @@ -46,16 +46,34 @@ const headers = { 'Content-Type': 'application/json', } -const ocsEntryToNode = function(ocsEntry: any): Folder | File | null { +const ocsEntryToNode = async function(ocsEntry: any): Promise<Folder | File | null> { try { + // Federated share handling + if (ocsEntry?.remote_id !== undefined) { + const mime = (await import('mime')).default + // This won't catch files without an extension, but this is the best we can do + ocsEntry.mimetype = mime.getType(ocsEntry.name) + ocsEntry.item_type = ocsEntry.mimetype ? 'file' : 'folder' + + // Need to set permissions to NONE for federated shares + ocsEntry.item_permissions = Permission.NONE + ocsEntry.permissions = Permission.NONE + + ocsEntry.uid_owner = ocsEntry.owner + // TODO: have the real display name stored somewhere + ocsEntry.displayname_owner = ocsEntry.owner + } + const isFolder = ocsEntry?.item_type === 'folder' const hasPreview = ocsEntry?.has_preview === true const Node = isFolder ? Folder : File - const fileid = ocsEntry.file_source + // If this is an external share that is not yet accepted, + // we don't have an id. We can fallback to the row id temporarily + const fileid = ocsEntry.file_source || ocsEntry.id // Generate path and strip double slashes - const path = ocsEntry?.path || ocsEntry.file_target + const path = ocsEntry?.path || ocsEntry.file_target || ocsEntry.name const source = generateRemoteUrl(`dav/${rootPath}/${path}`.replaceAll(/\/\//gm, '/')) // Prefer share time if more recent than item mtime @@ -68,7 +86,7 @@ const ocsEntryToNode = function(ocsEntry: any): Folder | File | null { id: fileid, source, owner: ocsEntry?.uid_owner, - mime: ocsEntry?.mimetype, + mime: ocsEntry?.mimetype || 'application/octet-stream', mtime, size: ocsEntry?.item_size, permissions: ocsEntry?.item_permissions || ocsEntry?.permissions, @@ -177,7 +195,7 @@ export const getContents = async (sharedWithYou = true, sharedWithOthers = true, const responses = await Promise.all(promises) const data = responses.map((response) => response.data.ocs.data).flat() - let contents = data.map(ocsEntryToNode) + let contents = (await Promise.all(data.map(ocsEntryToNode))) .filter((node) => node !== null) as (Folder | File)[] if (filterTypes.length > 0) { diff --git a/apps/files_sharing/src/views/SharingDetailsTab.vue b/apps/files_sharing/src/views/SharingDetailsTab.vue index f3ad52eeb87..6f6a6d60002 100644 --- a/apps/files_sharing/src/views/SharingDetailsTab.vue +++ b/apps/files_sharing/src/views/SharingDetailsTab.vue @@ -305,24 +305,34 @@ export default { computed: { title() { - let title = t('files_sharing', 'Share with ') - if (this.share.type === this.SHARE_TYPES.SHARE_TYPE_USER) { - title = title + this.share.shareWithDisplayName - } else if (this.share.type === this.SHARE_TYPES.SHARE_TYPE_LINK) { - title = t('files_sharing', 'Share link') - } else if (this.share.type === this.SHARE_TYPES.SHARE_TYPE_GROUP) { - title += ` (${t('files_sharing', 'group')})` - } else if (this.share.type === this.SHARE_TYPES.SHARE_TYPE_ROOM) { - title += ` (${t('files_sharing', 'conversation')})` - } else if (this.share.type === this.SHARE_TYPES.SHARE_TYPE_REMOTE) { - title += ` (${t('files_sharing', 'remote')})` - } else if (this.share.type === this.SHARE_TYPES.SHARE_TYPE_REMOTE_GROUP) { - title += ` (${t('files_sharing', 'remote group')})` - } else if (this.share.type === this.SHARE_TYPES.SHARE_TYPE_GUEST) { - title += ` (${t('files_sharing', 'guest')})` + switch (this.share.type) { + case this.SHARE_TYPES.SHARE_TYPE_USER: + return t('files_sharing', 'Share with {userName}', { userName: this.share.shareWithDisplayName }) + case this.SHARE_TYPES.SHARE_TYPE_EMAIL: + return t('files_sharing', 'Share with email {email}', { email: this.share.shareWith }) + case this.SHARE_TYPES.SHARE_TYPE_LINK: + return t('files_sharing', 'Share link') + case this.SHARE_TYPES.SHARE_TYPE_GROUP: + return t('files_sharing', 'Share with group') + case this.SHARE_TYPES.SHARE_TYPE_ROOM: + return t('files_sharing', 'Share in conversation') + case this.SHARE_TYPES.SHARE_TYPE_REMOTE: { + const [user, server] = this.share.shareWith.split('@') + return t('files_sharing', 'Share with {user} on remote server {server}', { user, server }) + } + case this.SHARE_TYPES.SHARE_TYPE_REMOTE_GROUP: + return t('files_sharing', 'Share with remote group') + case this.SHARE_TYPES.SHARE_TYPE_GUEST: + return t('files_sharing', 'Share with guest') + default: { + if (this.share.id) { + // Share already exists + return t('files_sharing', 'Update share') + } else { + return t('files_sharing', 'Create share') + } + } } - - return title }, /** * Can the sharee edit the shared file ? @@ -834,6 +844,7 @@ export default { this.share = share this.$emit('add:share', this.share) } else { + this.$emit('update:share', this.share) this.queueUpdate(...permissionsAndAttributes) } diff --git a/apps/files_sharing/tests/CapabilitiesTest.php b/apps/files_sharing/tests/CapabilitiesTest.php index d7c3f218d9f..100c7759900 100644 --- a/apps/files_sharing/tests/CapabilitiesTest.php +++ b/apps/files_sharing/tests/CapabilitiesTest.php @@ -38,7 +38,6 @@ use OCP\Files\Mount\IMountManager; use OCP\IConfig; use OCP\IDateTimeZone; use OCP\IGroupManager; -use OCP\IL10N; use OCP\IURLGenerator; use OCP\IUserManager; use OCP\IUserSession; @@ -86,7 +85,6 @@ class CapabilitiesTest extends \Test\TestCase { $this->createMock(IHasher::class), $this->createMock(IMountManager::class), $this->createMock(IGroupManager::class), - $this->createMock(IL10N::class), $this->createMock(IFactory::class), $this->createMock(IProviderFactory::class), $this->createMock(IUserManager::class), diff --git a/apps/files_trashbin/l10n/it.js b/apps/files_trashbin/l10n/it.js index 00dc55f8972..095a4df80a7 100644 --- a/apps/files_trashbin/l10n/it.js +++ b/apps/files_trashbin/l10n/it.js @@ -4,10 +4,13 @@ OC.L10N.register( "restored" : "ripristinati", "Deleted files" : "File eliminati", "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "File e cartelle eliminati nel cestino (possono scadere durante l'esportazione se lo spazio di archiviazione è insufficiente)", + "This application enables people to restore files that were deleted from the system." : "Questa applicazione permette alle persone di ripristinare i file che sono stati eliminati dal sistema.", + "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." : "Questa applicazione consente alle persone 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 delle persone 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 account 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", "Unknown" : "Sconosciuto", "All files" : "Tutti i file", "You" : "Tu", + "Original location" : "Percorso originale", "Deleted by" : "Eliminato da", "Deleted" : "Eliminati", "A long time ago" : "Molto tempo fa", diff --git a/apps/files_trashbin/l10n/it.json b/apps/files_trashbin/l10n/it.json index e8836d97593..27523f423d8 100644 --- a/apps/files_trashbin/l10n/it.json +++ b/apps/files_trashbin/l10n/it.json @@ -2,10 +2,13 @@ "restored" : "ripristinati", "Deleted files" : "File eliminati", "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "File e cartelle eliminati nel cestino (possono scadere durante l'esportazione se lo spazio di archiviazione è insufficiente)", + "This application enables people to restore files that were deleted from the system." : "Questa applicazione permette alle persone di ripristinare i file che sono stati eliminati dal sistema.", + "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." : "Questa applicazione consente alle persone 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 delle persone 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 account 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", "Unknown" : "Sconosciuto", "All files" : "Tutti i file", "You" : "Tu", + "Original location" : "Percorso originale", "Deleted by" : "Eliminato da", "Deleted" : "Eliminati", "A long time ago" : "Molto tempo fa", diff --git a/apps/files_versions/l10n/it.js b/apps/files_versions/l10n/it.js index ae04df8b71c..fe735e2a9e1 100644 --- a/apps/files_versions/l10n/it.js +++ b/apps/files_versions/l10n/it.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Versions" : "Versioni", "This application automatically maintains older versions of files that are changed." : "Questa applicazione mantiene automaticamente versioni più datate dei file modificati.", + "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the account does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the account's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Questa applicazione conserva automaticamente le versioni più datate dei file che sono stati modificati. Se attivata, una cartella nascosta delle versioni viene generata in ogni cartella degli utenti ed è usata per archiviare le versioni datate dei file. Un utente può tornare a una versione più datata tramite l'interfaccia web in qualsiasi momento, con il file sostituito che diventa una versione. L'applicazione gestisce automaticamente la cartella delle versioni per assicurare che l'account non esaurisca mai la quota a causa delle versioni.\n\t\tIn aggiunta alla scadenza delle versioni, l'applicazione delle versioni si accerta che non sia utilizzato mai più del 50% dello spazio disponibile attualmente all'account. Se le versioni archiviate eccedono questo limite, l'applicazione eliminerà prima le versioni più vecchie, fino a raggiungere questo limite. Altre informazioni sono disponibili nella documentazione di Versioni.", "Name this version" : "Nome di questa versione", "Edit version name" : "Modifica nome versione", "Compare to current version" : "Confronta con la versione attuale", @@ -18,6 +19,7 @@ OC.L10N.register( "Initial version restored" : "Versione iniziale ripristinata", "Version restored" : "Versione ripristinata", "Could not restore version" : "Impossibile ripristinare la versione", + "Could not set version label" : "Impossibile impostare l'etichetta della versione", "Could not delete version" : "Impossibile eliminare la versione", "${version.label} restored" : "${version.label} ripristinato", "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Questa applicazione conserva automaticamente le versioni più datate dei file che sono stati modificati. Se attivata, una cartella nascosta delle versioni viene generata in ogni cartella degli utenti ed è usata per archiviare le versioni datate dei file. Un utente può tornare a una versione più datata tramite l'interfaccia web in qualsiasi momento, con il file sostituito che diventa una versione. L'applicazione gestisce automaticamente la cartella delle versioni per assicurare che l'utente non esaurisca mai la quota a causa delle versioni.\n\t\tIn aggiunta alla scadenza delle versioni, l'applicazione delle versioni si accerta che non sia utilizzato mai più del 50% dello spazio disponibile attualmente all'utente. Se le versioni archiviate eccedono questo limite, l'applicazione eliminerà prima le versioni più vecchie, fino a raggiungere questo limite. Altre informazioni sono disponibili nella documentazione di Versioni.", diff --git a/apps/files_versions/l10n/it.json b/apps/files_versions/l10n/it.json index 80ec697371f..0aca3b0458c 100644 --- a/apps/files_versions/l10n/it.json +++ b/apps/files_versions/l10n/it.json @@ -1,6 +1,7 @@ { "translations": { "Versions" : "Versioni", "This application automatically maintains older versions of files that are changed." : "Questa applicazione mantiene automaticamente versioni più datate dei file modificati.", + "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the account does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the account's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Questa applicazione conserva automaticamente le versioni più datate dei file che sono stati modificati. Se attivata, una cartella nascosta delle versioni viene generata in ogni cartella degli utenti ed è usata per archiviare le versioni datate dei file. Un utente può tornare a una versione più datata tramite l'interfaccia web in qualsiasi momento, con il file sostituito che diventa una versione. L'applicazione gestisce automaticamente la cartella delle versioni per assicurare che l'account non esaurisca mai la quota a causa delle versioni.\n\t\tIn aggiunta alla scadenza delle versioni, l'applicazione delle versioni si accerta che non sia utilizzato mai più del 50% dello spazio disponibile attualmente all'account. Se le versioni archiviate eccedono questo limite, l'applicazione eliminerà prima le versioni più vecchie, fino a raggiungere questo limite. Altre informazioni sono disponibili nella documentazione di Versioni.", "Name this version" : "Nome di questa versione", "Edit version name" : "Modifica nome versione", "Compare to current version" : "Confronta con la versione attuale", @@ -16,6 +17,7 @@ "Initial version restored" : "Versione iniziale ripristinata", "Version restored" : "Versione ripristinata", "Could not restore version" : "Impossibile ripristinare la versione", + "Could not set version label" : "Impossibile impostare l'etichetta della versione", "Could not delete version" : "Impossibile eliminare la versione", "${version.label} restored" : "${version.label} ripristinato", "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Questa applicazione conserva automaticamente le versioni più datate dei file che sono stati modificati. Se attivata, una cartella nascosta delle versioni viene generata in ogni cartella degli utenti ed è usata per archiviare le versioni datate dei file. Un utente può tornare a una versione più datata tramite l'interfaccia web in qualsiasi momento, con il file sostituito che diventa una versione. L'applicazione gestisce automaticamente la cartella delle versioni per assicurare che l'utente non esaurisca mai la quota a causa delle versioni.\n\t\tIn aggiunta alla scadenza delle versioni, l'applicazione delle versioni si accerta che non sia utilizzato mai più del 50% dello spazio disponibile attualmente all'utente. Se le versioni archiviate eccedono questo limite, l'applicazione eliminerà prima le versioni più vecchie, fino a raggiungere questo limite. Altre informazioni sono disponibili nella documentazione di Versioni.", diff --git a/apps/lookup_server_connector/l10n/it.js b/apps/lookup_server_connector/l10n/it.js index 70113fc3a4d..16aa7955c28 100644 --- a/apps/lookup_server_connector/l10n/it.js +++ b/apps/lookup_server_connector/l10n/it.js @@ -2,6 +2,7 @@ OC.L10N.register( "lookup_server_connector", { "Lookup Server Connector" : "Connettore server di ricerca", + "Sync public account information with the lookup server" : "Sincronizza le informazioni account pubbliche con il server di ricerca", "Sync public user information with the lookup server" : "Sincronizza le informazioni utente pubbliche con il server di ricerca" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/lookup_server_connector/l10n/it.json b/apps/lookup_server_connector/l10n/it.json index f8378fca795..4037a9fbfcb 100644 --- a/apps/lookup_server_connector/l10n/it.json +++ b/apps/lookup_server_connector/l10n/it.json @@ -1,5 +1,6 @@ { "translations": { "Lookup Server Connector" : "Connettore server di ricerca", + "Sync public account information with the lookup server" : "Sincronizza le informazioni account pubbliche con il server di ricerca", "Sync public user information with the lookup server" : "Sincronizza le informazioni utente pubbliche con il server di ricerca" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/oauth2/l10n/ar.js b/apps/oauth2/l10n/ar.js index 11c2b2c9d64..05945c7a2f3 100644 --- a/apps/oauth2/l10n/ar.js +++ b/apps/oauth2/l10n/ar.js @@ -5,7 +5,7 @@ OC.L10N.register( "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "عنوان URL المُعاد توجيهه يجب أن يكون عنواناً كاملاً كما في المثال التالي: https://yourdomain.com/path", "OAuth 2.0" : "OAuth 2.0", "Allows OAuth2 compatible authentication from other web applications." : "يسمح بالتحقّق من الهويّة عن طريق تطبيقات وب أخرى متوافقة مع OAuth2.", - "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "التطبيق OAuth2 يسمح للمشرفين بتهيئة الأجراء الأساسي للتحقّق من الهويّةبحيث يسمح بالتحقّق من الهويّة عن طريق تطبيقات وب أخرى متوافقة مع OAuth2.", + "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "التطبيق OAuth2 يسمح للمشرفين بتهيئة الإجراء الأساسي للتحقّق من الهويّةبحيث يسمح بالتحقّق من الهويّة عن طريق تطبيقات وب أخرى متوافقة مع OAuth2.", "OAuth 2.0 clients" : "عملاء OAuth2,0", "OAuth 2.0 allows external services to request access to {instanceName}." : "يسمح OAuth2.0 لخدمات خارجية بطلب الوصول إلى {instanceName}", "Name" : "الاسم", diff --git a/apps/oauth2/l10n/ar.json b/apps/oauth2/l10n/ar.json index 353e643c58e..fd30ea07a97 100644 --- a/apps/oauth2/l10n/ar.json +++ b/apps/oauth2/l10n/ar.json @@ -3,7 +3,7 @@ "Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "عنوان URL المُعاد توجيهه يجب أن يكون عنواناً كاملاً كما في المثال التالي: https://yourdomain.com/path", "OAuth 2.0" : "OAuth 2.0", "Allows OAuth2 compatible authentication from other web applications." : "يسمح بالتحقّق من الهويّة عن طريق تطبيقات وب أخرى متوافقة مع OAuth2.", - "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "التطبيق OAuth2 يسمح للمشرفين بتهيئة الأجراء الأساسي للتحقّق من الهويّةبحيث يسمح بالتحقّق من الهويّة عن طريق تطبيقات وب أخرى متوافقة مع OAuth2.", + "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "التطبيق OAuth2 يسمح للمشرفين بتهيئة الإجراء الأساسي للتحقّق من الهويّةبحيث يسمح بالتحقّق من الهويّة عن طريق تطبيقات وب أخرى متوافقة مع OAuth2.", "OAuth 2.0 clients" : "عملاء OAuth2,0", "OAuth 2.0 allows external services to request access to {instanceName}." : "يسمح OAuth2.0 لخدمات خارجية بطلب الوصول إلى {instanceName}", "Name" : "الاسم", diff --git a/apps/oauth2/l10n/it.js b/apps/oauth2/l10n/it.js index 69726925a4b..8721b17bcff 100644 --- a/apps/oauth2/l10n/it.js +++ b/apps/oauth2/l10n/it.js @@ -17,6 +17,7 @@ OC.L10N.register( "Add" : "Aggiungi", "Delete" : "Elimina", "Show client secret" : "Mostra segreto del client", + "Hide client secret" : "Nascondi segreto del client", "Secret" : "Segreto" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/oauth2/l10n/it.json b/apps/oauth2/l10n/it.json index 3abe47f48cd..91c5bc95652 100644 --- a/apps/oauth2/l10n/it.json +++ b/apps/oauth2/l10n/it.json @@ -15,6 +15,7 @@ "Add" : "Aggiungi", "Delete" : "Elimina", "Show client secret" : "Mostra segreto del client", + "Hide client secret" : "Nascondi segreto del client", "Secret" : "Segreto" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/settings/l10n/ar.js b/apps/settings/l10n/ar.js index 75c76312069..06c084b9af6 100644 --- a/apps/settings/l10n/ar.js +++ b/apps/settings/l10n/ar.js @@ -114,7 +114,7 @@ OC.L10N.register( "Overview" : "مُلخّص", "Basic settings" : "الإعدادات الأساسية", "Sharing" : "مشاركة", - "Availability" : "أوقات التواجد availability", + "Availability" : "أوقات التواجد ", "Calendar" : "التقويم", "Personal info" : "المعلومات الشخصية", "Mobile & desktop" : "الجوال وسطح المكتب", diff --git a/apps/settings/l10n/ar.json b/apps/settings/l10n/ar.json index 95d7a92ea01..55865ac48ba 100644 --- a/apps/settings/l10n/ar.json +++ b/apps/settings/l10n/ar.json @@ -112,7 +112,7 @@ "Overview" : "مُلخّص", "Basic settings" : "الإعدادات الأساسية", "Sharing" : "مشاركة", - "Availability" : "أوقات التواجد availability", + "Availability" : "أوقات التواجد ", "Calendar" : "التقويم", "Personal info" : "المعلومات الشخصية", "Mobile & desktop" : "الجوال وسطح المكتب", diff --git a/apps/settings/l10n/gl.js b/apps/settings/l10n/gl.js index 6accbcb20ef..5890bab7fa6 100644 --- a/apps/settings/l10n/gl.js +++ b/apps/settings/l10n/gl.js @@ -180,33 +180,33 @@ OC.L10N.register( "Internet connectivity is disabled in configuration file." : "A conectividade a Internet está desactivada no ficheiro de configuración.", "This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Este servidor non ten unha conexión a Internet que funcione: non foi posíbel acceder a varios puntos finais. Isto significa que algunhas das funcións como a instalación de almacenamento externo, as notificacións sobre actualizacións ou a instalación de aplicacións de terceiros non funcionarán. O acceso aos ficheiros de forma remota e o envío de correos de notificación pode que tampouco funcionen. Estabeleza unha conexión a Internet dende este servidor para gozar de todas as funcións.", "JavaScript modules support" : "Compatibilidade con módulos JavaScript", - "Your webserver does not serve `.mjs` files using the JavaScript MIME type. This will break some apps by preventing browsers from executing the JavaScript files. You should configure your webserver to serve `.mjs` files with either the `text/javascript` or `application/javascript` MIME type." : "O teu servidor web non serve ficheiros `.mjs` usando o tipo MIME JavaScript. Isto romperá algunhas aplicacións ao impedir que os navegadores executen os ficheiros JavaScript. Debería configurar o seu servidor web para que sirva ficheiros `.mjs` co tipo MIME `text/javascript` ou `application/javascript`.", - "JavaScript source map support" : "Compatibilidade con mapas fonte JavaScript", - "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "O teu servidor web non está configurado para servir ficheiros `.js.map`. Sen estes ficheiros, os mapas fonte de JavaScript non funcionarán correctamente, polo que resulta máis difícil solucionar e depurar os problemas que poidan xurdir.", + "Your webserver does not serve `.mjs` files using the JavaScript MIME type. This will break some apps by preventing browsers from executing the JavaScript files. You should configure your webserver to serve `.mjs` files with either the `text/javascript` or `application/javascript` MIME type." : "O seu servidor web non serve ficheiros «.mjs» usando o tipo MIME JavaScript. Isto rachará algunhas aplicacións ao impedir que os navegadores executen os ficheiros JavaScript. Debería configurar o seu servidor web para que sirva ficheiros «.mjs» co tipo MIME «text/javascript» ou «application/javascript».", + "JavaScript source map support" : "Compatibilidade con mapas de orixe JavaScript", + "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "O seu servidor web non está definido para servir ficheiros «.js.map». Sen estes ficheiros, os mapas de orixe JavaScript non funcionarán correctamente, polo que resulta máis difícil solucionar e depurar os problemas que poidan xurdir.", "Old server-side-encryption" : "Antigo cifrado no lado do servidor", "Disabled" : "Desactivado", "The old server-side-encryption format is enabled. We recommend disabling this." : "O antigo formato de cifrado do lado do servidor está activado. Recomendámoslle desactivalo.", - "Maintenance window start" : "Inicio da xanela de mantemento", - "Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks." : "O servidor non ten configurada a hora de inicio da xanela de mantemento. Isto significa que tamén se executarán traballos diarios en segundo plano que requiren un uso intensivo de recursos durante o seu tempo de uso principal. Recomendamos configuralo nun momento de uso reducido, para que os usuarios se vexan menos afectados pola carga que provocan estas tarefas pesadas.", - "Maintenance window to execute heavy background jobs is between {start}:00 UTC and {end}:00 UTC" : "A xanela de mantemento para executar traballos pesados en segundo plano está entre {start}:00 UTC e {end}:00 UTC", + "Maintenance window start" : "Inicio da fiestra temporal de mantemento", + "Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks." : "O servidor non ten configurada a hora de inicio da fiestra de mantemento. Isto significa que os traballos diarios en segundo plano que requiren un uso intensivo de recursos tamén se executarán durante o tempo de uso principal. Recomendamos configuralo a un momento de pouco uso, para que os usuarios se vexan menos afectados pola carga que provocan estas tarefas pesadas.", + "Maintenance window to execute heavy background jobs is between {start}:00 UTC and {end}:00 UTC" : "A fiestra de mantemento para executar traballos pesados en segundo plano está comprendida entre as {start}:00 UTC e as {end}:00 UTC", "Memcache" : "Memcache", "No memory cache has been configured. To enhance performance, please configure a memcache, if available." : "Non se configurou ningunha caché de memoria. Para mellorar o rendemento, configure Memcache, se está dispoñíbel.", "Configured" : "Configurado", - "MySQL Unicode support" : "Soporte MySQL Unicode", - "You are not using MySQL" : "Non estás usando MySQL", + "MySQL Unicode support" : "Compatibilidade con MySQL Unicode", + "You are not using MySQL" : "Non está a usar MySQL", "MySQL is used as database and does support 4-byte characters" : "MySQL úsase como base de datos e admite caracteres de 4 bytes", - "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 utilízase como base de datos, pero non admite caracteres de 4 bytes. Para poder manexar caracteres de 4 bytes (como emojis) sen problemas nos nomes de ficheiros ou comentarios, por exemplo, recoméndase activar a compatibilidade de 4 bytes en MySQL.", + "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 utilízase como base de datos, mais non admite caracteres de 4 bytes. Para poder manexar caracteres de 4 bytes (coma os «emojis») sen problemas nos nomes de ficheiros ou comentarios, por exemplo, recoméndase activar a compatibilidade de 4 bytes en MySQL.", "OCS provider resolving" : "Resolución do provedor OCS", - "Could not check if your web server properly resolves the OCM and OCS provider URLs." : "Non se puido comprobar se o seu servidor web resolve correctamente os URLs do provedor OCM e OCS.", - "Your web server is not properly set up to resolve %1$s.\nThis is most likely related to a web server configuration that was not updated to deliver this folder directly.\nPlease compare your configuration against the shipped rewrite rules in \".htaccess\" for Apache or the provided one in the documentation for Nginx.\nOn Nginx those are typically the lines starting with \"location ~\" that need an update." : "O teu servidor web non está configurado correctamente para resolver %1$s.\nProbablemente estea relacionado cunha configuración de servidor web que non se actualizou para entregar directamente este cartafol.\nCompare a súa configuración coas regras de reescritura enviadas en \".htaccess\" para Apache ou coa proporcionada na documentación de Nginx.\nEn Nginx, estas son normalmente as liñas que comezan por \"localización ~\" que precisan unha actualización.", + "Could not check if your web server properly resolves the OCM and OCS provider URLs." : "Non foi posíbel comprobar se o seu servidor web resolve correctamente os URL dos provedores OCM e OCS.", + "Your web server is not properly set up to resolve %1$s.\nThis is most likely related to a web server configuration that was not updated to deliver this folder directly.\nPlease compare your configuration against the shipped rewrite rules in \".htaccess\" for Apache or the provided one in the documentation for Nginx.\nOn Nginx those are typically the lines starting with \"location ~\" that need an update." : "O seu servidor web non está definido correctamente para resolver %1$s.\nProbabelmente estea relacionado cunha configuración de servidor web que non se actualizou para entregar directamente este cartafol.\nCompare a súa configuración coas regras de reescritura enviadas en «.htaccess» para Apache ou coa fornecida na documentación de Nginx.\nEn Nginx, adoitan ser as liñas que comezan por «location ~» as que precisan dunha actualización.", "Overwrite CLI URL" : "Sobrescribir o URL da interface da liña de ordes", "The \"overwrite.cli.url\" option in your config.php is correctly set to \"%s\"." : "A opción «overwrite.cli.url» está definida correctamente no seu config.php como «%s».", "The \"overwrite.cli.url\" option in your config.php is set to \"%s\" which is a correct URL. Suggested URL is \"%s\"." : "A opción «overwrite.cli.url» está definida no seu config.php como «%s», que é un URL correcto. O URL suxerido é «%s».", - "Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"%s\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Asegúrate de configurar a opción \"overwrite.cli.url\" no teu ficheiro config.php co URL que usan principalmente os teus usuarios para acceder a este Nextcloud. Suxestión: \"%s\". Se non, pode haber problemas coa xeración de URL a través de cron. (Non obstante, é posible que o URL suxerido non sexa o URL que usan principalmente os seus usuarios para acceder a este Nextcloud. O mellor é comprobar isto en calquera caso).", + "Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"%s\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Asegúrese de definir a opción «overwrite.cli.url» no seu ficheiro config.php co URL que usan principalmente os seus usuarios para acceder a este Nextcloud. Suxestión: «%s». Se non, pode haber problemas coa xeración de URL a través de cron. (Non obstante, é posíbel que o URL suxerido non sexa o URL que usan principalmente os seus usuarios para acceder a este Nextcloud. O mellor é volver comprobar isto en calquera caso).", "PHP default charset" : "Conxunto de caracteres predeterminado de PHP", "PHP configuration option \"default_charset\" should be UTF-8" : "A opción de configuración de PHP «default_charset» debería ser UTF-8", "PHP set_time_limit" : "PHP set_time_limit", - "The function is available." : "A función está dispoñible.", + "The function is available." : "A función está dispoñíbel.", "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. Enabling this function is strongly recommended." : "A función PHP «set_limit_time» non está dispoñíbel. Isto podería facer que o script se deteña na metade da execución, quebrando a instalación. Recomendámoslle encarecidamente que active esta función.", "Freetype" : "FreeType", "Supported" : "Compatíbel", @@ -217,26 +217,26 @@ OC.L10N.register( "The PHP memory limit is below the recommended value of %s." : "O límite de memoria de PHP está por baixo do valor recomendado de %s.", "PHP modules" : "PHP modules", "increases language translation performance and fixes sorting of non-ASCII characters" : "aumenta o rendemento da tradución de idiomas e corrixe a clasificación de caracteres non ASCII", - "for Argon2 for password hashing" : "para Argon2 para hash de contrasinal", - "for WebAuthn passwordless login" : "para iniciar sesión sen contrasinal de WebAuthn", - "for WebAuthn passwordless login, and SFTP storage" : "para o inicio de sesión sen contrasinal de WebAuthn, e o almacenamento SFTP", + "for Argon2 for password hashing" : "para Argon2 para a xeración do resumo criptográfico do contrasinal", + "for WebAuthn passwordless login" : "para acceso sen contrasinal de WebAuthn", + "for WebAuthn passwordless login, and SFTP storage" : "para acceso sen contrasinal de WebAuthn, e almacenamento SFTP", "for picture rotation in server and metadata extraction in the Photos app" : "para a rotación de imaxes no servidor e a extracción de metadatos na aplicación Fotos", "This instance is missing some required PHP modules. It is required to install them: %s." : "A esta instancia fáltanlle algúns módulos PHP necesarios. Precísase da súa instalación: %s.", - "This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them:\n%s" : "Faltan algúns módulos PHP recomendados nesta instancia. Para mellorar o rendemento e unha mellor compatibilidade, é moi recomendable instalalos:\n%s", + "This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them:\n%s" : "A esta instancia fáltanlle algúns módulos PHP recomendados. Para mellorar o rendemento e a compatibilidade, recoméndase instalalos:\n%s", "PHP opcache" : "PHP opcache", "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "O módulo PHP OPcache non está cargado. Para un mellor rendemento, recoméndase cargalo na súa instalación de PHP.", - "OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache está deshabilitado. Para un mellor rendemento, recoméndase aplicar \"opcache.enable=1\" á súa configuración de PHP.", - "The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "O OPcache baseado na memoria compartida está desactivado. Para un mellor rendemento, recoméndase aplicar \"opcache.file_cache_only=0\" á súa configuración de PHP e utilizar a caché de ficheiros só como caché de segundo nivel.", - "OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache non funciona como debería, opcache_get_status() devolve false, comprobe a configuración.", - "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\"." : "O número máximo de chaves OPcache está practicamente superado. Para garantir que todos os scripts poden manterse na caché, recoméndase aplicar \"opcache.max_accelerated_files\" á súa configuración de PHP cun valor superior 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\"." : "O búfer OPcache está case cheo. Para garantir que todos os scripts se poidan gardar na caché, recoméndase aplicar \"opcache.memory_consumption\" á súa configuración de PHP cun valor superior a \"%s\".", - "The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "O búfer de cadeas internadas en OPcache está case cheo. Para asegurarse de que as cadeas que se repiten se poidan almacenar na memoria caché, recoméndase aplicar \"opcache.interned_strings_buffer\" á súa configuración de PHP cun valor superior a \"%s\".", - "OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache está configurado para eliminar os comentarios do código. Con OPcache activado, debe configurarse \"opcache.save_comments=1\" para que Nextcloud funcione.", - "Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud non está autorizado a usar a API OPcache. Con OPcache activado, recoméndase encarecidamente incluír todos os directorios de Nextcloud con \"opcache.restrict_api\" ou desactivar esta configuración para desactivar as restricións da API de OPcache, para evitar erros durante as actualizacións do núcleo de Nextcloud ou das aplicacións.", + "OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache está desactivado. Para un mellor rendemento, recoméndase aplicar «opcache.enable=1» na configuración de PHP.", + "The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "O OPcache baseado na memoria compartida está desactivado. Para un mellor rendemento, recoméndase aplicar «opcache.file_cache_only=0» na configuración de PHP e utilizar a caché de ficheiros só como caché de segundo nivel.", + "OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache non funciona como debería, opcache_get_status() devolve «false», comprobe a configuración.", + "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\"." : "O número máximo de chaves OPcache está practicamente superado. Para garantir que todos os scripts poden manterse na caché, recoméndase aplicar «opcache.max_accelerated_files» na configuración de PHP cun valor superior 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\"." : "O búfer OPcache está case cheo. Para garantir que todos os scripts se poidan gardar na caché, recoméndase aplicar «opcache.memory_consumption» na configuración de PHP cun valor superior a «%s».", + "The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "O búfer de cadeas internadas en OPcache está case cheo. Para asegurarse de que as cadeas que se repiten se poidan almacenar na memoria caché, recoméndase aplicar «opcache.interned_strings_buffer» na configuración de PHP cun valor superior a «%s».", + "OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache está configurado para eliminar os comentarios do código. Con OPcache activado, debe configurarse «opcache.save_comments=1» para que Nextcloud funcione.", + "Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud non pode usar a API OPcache. Con OPcache activado, é moi recomendábel incluír todos os directorios de Nextcloud con «opcache.restrict_api» ou desactivar este axuste para desactivar as restricións da API de OPcache, para evitar erros durante as anovacións do núcleo de Nextcloud ou da aplicación.", "The PHP OPcache module is not properly configured. %s." : "O módulo PHP OPcache non está configurado correctamente. %s.", "Correctly configured" : "Configurado correctamente", "PHP version" : "PHP version", - "You are currently running PHP %s. PHP 8.1 is now deprecated in Nextcloud 30. Nextcloud 31 may require at least PHP 8.2. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Actualmente estás executando PHP %s. PHP 8.1 agora está obsoleto en Nextcloud 30. É posible que Nextcloud 31 requira polo menos PHP 8.2. Actualice a unha das versións de PHP oficialmente compatibles proporcionadas polo PHP Group canto antes.", + "You are currently running PHP %s. PHP 8.1 is now deprecated in Nextcloud 30. Nextcloud 31 may require at least PHP 8.2. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Actualmente está a executar PHP %s. PHP 8.1 é obsoleto en Nextcloud 30. Nextcloud 31 pode precisar polo menos PHP 8.2. Actualice a unha das versións de PHP oficialmente compatíbeis fornecidas polo Grupo PHP o antes posíbel.", "You are currently running PHP %s." : "Actualmente está a executar PHP %s.", "PHP \"output_buffering\" option" : "Opción de PHP «output_buffering»", "PHP configuration option \"output_buffering\" must be disabled" : "A opción de configuración de PHP «output_buffering» debe estar desactivada", @@ -268,7 +268,7 @@ OC.L10N.register( "Architecture" : "Arquitectura", "64-bit" : "64 bits", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Semella que está a executar unha versión de PHP de 32 bits. Nextcloud necesita 64 bits para funcionar ben. Actualice o seu sistema operativo e PHP a 64 bits.", - "Temporary space available" : "Espazo temporal dispoñible", + "Temporary space available" : "Espazo temporal dispoñíbel", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "Produciuse un erro ao comprobar a ruta temporal de PHP: non se axustou correctamente a un directorio. Valor devolto: %s", "Error while checking the available disk space of temporary PHP path or no free disk space returned. Temporary path: %s" : "Produciuse un erro ao comprobar o espazo no disco dispoñible da ruta PHP temporal ou non se devolveu espazo libre en disco. Ruta temporal: %s", "- %.1f GiB available in %s (PHP temporary directory)" : "-%.1f GiB dispoñible en %s (directorio temporal PHP)", @@ -758,7 +758,7 @@ OC.L10N.register( "Federated Cloud Sharing" : "Nube federada compartida", "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cURL está utilizando unha versión obsoleta %1$s (%2$s). Actualice o seu sistema operativo, caso contrario características como %3$s non funcionarán de xeito fiábel.", "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the Nextcloud log file for more details." : "Non foi posíbel determinar se a versión TLS de cURL está desactualizada ou non porque se produciu un erro durante a solicitude HTTPS contra https://nextcloud.com. Consulte o ficheiro de rexistro de Nextcloud para obter máis detalles.", - "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache está desactivado. Para un mellor rendemento, recoméndase aplicar <code>opcache.enable=1</code> á súa configuración de PHP.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache está desactivado. Para un mellor rendemento, recoméndase aplicar <code>opcache.enable=1</code> na configuración de PHP.", "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache está configurado para retirar comentarios de código. Con OPcache activado, debe configurarse <code>opcache.save_comments=1</code> para que Nextcloud funcione.", "Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with <code>opcache.restrict_api</code> or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud non pode usar a API OPcache. Con OPcache activado, é moi recomendábel incluír todos os directorios de Nextcloud con <code>opcache.restrict_api</code> ou desactivar este axuste para desactivar as restricións da API de OPcache, para evitar erros durante as anovacións do núcleo de Nextcloud ou da aplicación.", "Nextcloud is not allowed to use the OPcache API. It is highly recommended to include all Nextcloud directories with <code>opcache.restrict_api</code> or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud non pode usar a API OPcache. É moi recomendábel incluír todos os directorios de Nextcloud con <code>opcache.restrict_api</code> ou desactivar este axuste para desactivar as restricións da API de OPcache, para evitar erros durante as anovacións do núcleo de Nextcloud ou das aplicacións.", diff --git a/apps/settings/l10n/gl.json b/apps/settings/l10n/gl.json index fec7c39d79b..c2a246cb6b3 100644 --- a/apps/settings/l10n/gl.json +++ b/apps/settings/l10n/gl.json @@ -178,33 +178,33 @@ "Internet connectivity is disabled in configuration file." : "A conectividade a Internet está desactivada no ficheiro de configuración.", "This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Este servidor non ten unha conexión a Internet que funcione: non foi posíbel acceder a varios puntos finais. Isto significa que algunhas das funcións como a instalación de almacenamento externo, as notificacións sobre actualizacións ou a instalación de aplicacións de terceiros non funcionarán. O acceso aos ficheiros de forma remota e o envío de correos de notificación pode que tampouco funcionen. Estabeleza unha conexión a Internet dende este servidor para gozar de todas as funcións.", "JavaScript modules support" : "Compatibilidade con módulos JavaScript", - "Your webserver does not serve `.mjs` files using the JavaScript MIME type. This will break some apps by preventing browsers from executing the JavaScript files. You should configure your webserver to serve `.mjs` files with either the `text/javascript` or `application/javascript` MIME type." : "O teu servidor web non serve ficheiros `.mjs` usando o tipo MIME JavaScript. Isto romperá algunhas aplicacións ao impedir que os navegadores executen os ficheiros JavaScript. Debería configurar o seu servidor web para que sirva ficheiros `.mjs` co tipo MIME `text/javascript` ou `application/javascript`.", - "JavaScript source map support" : "Compatibilidade con mapas fonte JavaScript", - "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "O teu servidor web non está configurado para servir ficheiros `.js.map`. Sen estes ficheiros, os mapas fonte de JavaScript non funcionarán correctamente, polo que resulta máis difícil solucionar e depurar os problemas que poidan xurdir.", + "Your webserver does not serve `.mjs` files using the JavaScript MIME type. This will break some apps by preventing browsers from executing the JavaScript files. You should configure your webserver to serve `.mjs` files with either the `text/javascript` or `application/javascript` MIME type." : "O seu servidor web non serve ficheiros «.mjs» usando o tipo MIME JavaScript. Isto rachará algunhas aplicacións ao impedir que os navegadores executen os ficheiros JavaScript. Debería configurar o seu servidor web para que sirva ficheiros «.mjs» co tipo MIME «text/javascript» ou «application/javascript».", + "JavaScript source map support" : "Compatibilidade con mapas de orixe JavaScript", + "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "O seu servidor web non está definido para servir ficheiros «.js.map». Sen estes ficheiros, os mapas de orixe JavaScript non funcionarán correctamente, polo que resulta máis difícil solucionar e depurar os problemas que poidan xurdir.", "Old server-side-encryption" : "Antigo cifrado no lado do servidor", "Disabled" : "Desactivado", "The old server-side-encryption format is enabled. We recommend disabling this." : "O antigo formato de cifrado do lado do servidor está activado. Recomendámoslle desactivalo.", - "Maintenance window start" : "Inicio da xanela de mantemento", - "Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks." : "O servidor non ten configurada a hora de inicio da xanela de mantemento. Isto significa que tamén se executarán traballos diarios en segundo plano que requiren un uso intensivo de recursos durante o seu tempo de uso principal. Recomendamos configuralo nun momento de uso reducido, para que os usuarios se vexan menos afectados pola carga que provocan estas tarefas pesadas.", - "Maintenance window to execute heavy background jobs is between {start}:00 UTC and {end}:00 UTC" : "A xanela de mantemento para executar traballos pesados en segundo plano está entre {start}:00 UTC e {end}:00 UTC", + "Maintenance window start" : "Inicio da fiestra temporal de mantemento", + "Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks." : "O servidor non ten configurada a hora de inicio da fiestra de mantemento. Isto significa que os traballos diarios en segundo plano que requiren un uso intensivo de recursos tamén se executarán durante o tempo de uso principal. Recomendamos configuralo a un momento de pouco uso, para que os usuarios se vexan menos afectados pola carga que provocan estas tarefas pesadas.", + "Maintenance window to execute heavy background jobs is between {start}:00 UTC and {end}:00 UTC" : "A fiestra de mantemento para executar traballos pesados en segundo plano está comprendida entre as {start}:00 UTC e as {end}:00 UTC", "Memcache" : "Memcache", "No memory cache has been configured. To enhance performance, please configure a memcache, if available." : "Non se configurou ningunha caché de memoria. Para mellorar o rendemento, configure Memcache, se está dispoñíbel.", "Configured" : "Configurado", - "MySQL Unicode support" : "Soporte MySQL Unicode", - "You are not using MySQL" : "Non estás usando MySQL", + "MySQL Unicode support" : "Compatibilidade con MySQL Unicode", + "You are not using MySQL" : "Non está a usar MySQL", "MySQL is used as database and does support 4-byte characters" : "MySQL úsase como base de datos e admite caracteres de 4 bytes", - "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 utilízase como base de datos, pero non admite caracteres de 4 bytes. Para poder manexar caracteres de 4 bytes (como emojis) sen problemas nos nomes de ficheiros ou comentarios, por exemplo, recoméndase activar a compatibilidade de 4 bytes en MySQL.", + "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 utilízase como base de datos, mais non admite caracteres de 4 bytes. Para poder manexar caracteres de 4 bytes (coma os «emojis») sen problemas nos nomes de ficheiros ou comentarios, por exemplo, recoméndase activar a compatibilidade de 4 bytes en MySQL.", "OCS provider resolving" : "Resolución do provedor OCS", - "Could not check if your web server properly resolves the OCM and OCS provider URLs." : "Non se puido comprobar se o seu servidor web resolve correctamente os URLs do provedor OCM e OCS.", - "Your web server is not properly set up to resolve %1$s.\nThis is most likely related to a web server configuration that was not updated to deliver this folder directly.\nPlease compare your configuration against the shipped rewrite rules in \".htaccess\" for Apache or the provided one in the documentation for Nginx.\nOn Nginx those are typically the lines starting with \"location ~\" that need an update." : "O teu servidor web non está configurado correctamente para resolver %1$s.\nProbablemente estea relacionado cunha configuración de servidor web que non se actualizou para entregar directamente este cartafol.\nCompare a súa configuración coas regras de reescritura enviadas en \".htaccess\" para Apache ou coa proporcionada na documentación de Nginx.\nEn Nginx, estas son normalmente as liñas que comezan por \"localización ~\" que precisan unha actualización.", + "Could not check if your web server properly resolves the OCM and OCS provider URLs." : "Non foi posíbel comprobar se o seu servidor web resolve correctamente os URL dos provedores OCM e OCS.", + "Your web server is not properly set up to resolve %1$s.\nThis is most likely related to a web server configuration that was not updated to deliver this folder directly.\nPlease compare your configuration against the shipped rewrite rules in \".htaccess\" for Apache or the provided one in the documentation for Nginx.\nOn Nginx those are typically the lines starting with \"location ~\" that need an update." : "O seu servidor web non está definido correctamente para resolver %1$s.\nProbabelmente estea relacionado cunha configuración de servidor web que non se actualizou para entregar directamente este cartafol.\nCompare a súa configuración coas regras de reescritura enviadas en «.htaccess» para Apache ou coa fornecida na documentación de Nginx.\nEn Nginx, adoitan ser as liñas que comezan por «location ~» as que precisan dunha actualización.", "Overwrite CLI URL" : "Sobrescribir o URL da interface da liña de ordes", "The \"overwrite.cli.url\" option in your config.php is correctly set to \"%s\"." : "A opción «overwrite.cli.url» está definida correctamente no seu config.php como «%s».", "The \"overwrite.cli.url\" option in your config.php is set to \"%s\" which is a correct URL. Suggested URL is \"%s\"." : "A opción «overwrite.cli.url» está definida no seu config.php como «%s», que é un URL correcto. O URL suxerido é «%s».", - "Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"%s\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Asegúrate de configurar a opción \"overwrite.cli.url\" no teu ficheiro config.php co URL que usan principalmente os teus usuarios para acceder a este Nextcloud. Suxestión: \"%s\". Se non, pode haber problemas coa xeración de URL a través de cron. (Non obstante, é posible que o URL suxerido non sexa o URL que usan principalmente os seus usuarios para acceder a este Nextcloud. O mellor é comprobar isto en calquera caso).", + "Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"%s\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Asegúrese de definir a opción «overwrite.cli.url» no seu ficheiro config.php co URL que usan principalmente os seus usuarios para acceder a este Nextcloud. Suxestión: «%s». Se non, pode haber problemas coa xeración de URL a través de cron. (Non obstante, é posíbel que o URL suxerido non sexa o URL que usan principalmente os seus usuarios para acceder a este Nextcloud. O mellor é volver comprobar isto en calquera caso).", "PHP default charset" : "Conxunto de caracteres predeterminado de PHP", "PHP configuration option \"default_charset\" should be UTF-8" : "A opción de configuración de PHP «default_charset» debería ser UTF-8", "PHP set_time_limit" : "PHP set_time_limit", - "The function is available." : "A función está dispoñible.", + "The function is available." : "A función está dispoñíbel.", "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. Enabling this function is strongly recommended." : "A función PHP «set_limit_time» non está dispoñíbel. Isto podería facer que o script se deteña na metade da execución, quebrando a instalación. Recomendámoslle encarecidamente que active esta función.", "Freetype" : "FreeType", "Supported" : "Compatíbel", @@ -215,26 +215,26 @@ "The PHP memory limit is below the recommended value of %s." : "O límite de memoria de PHP está por baixo do valor recomendado de %s.", "PHP modules" : "PHP modules", "increases language translation performance and fixes sorting of non-ASCII characters" : "aumenta o rendemento da tradución de idiomas e corrixe a clasificación de caracteres non ASCII", - "for Argon2 for password hashing" : "para Argon2 para hash de contrasinal", - "for WebAuthn passwordless login" : "para iniciar sesión sen contrasinal de WebAuthn", - "for WebAuthn passwordless login, and SFTP storage" : "para o inicio de sesión sen contrasinal de WebAuthn, e o almacenamento SFTP", + "for Argon2 for password hashing" : "para Argon2 para a xeración do resumo criptográfico do contrasinal", + "for WebAuthn passwordless login" : "para acceso sen contrasinal de WebAuthn", + "for WebAuthn passwordless login, and SFTP storage" : "para acceso sen contrasinal de WebAuthn, e almacenamento SFTP", "for picture rotation in server and metadata extraction in the Photos app" : "para a rotación de imaxes no servidor e a extracción de metadatos na aplicación Fotos", "This instance is missing some required PHP modules. It is required to install them: %s." : "A esta instancia fáltanlle algúns módulos PHP necesarios. Precísase da súa instalación: %s.", - "This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them:\n%s" : "Faltan algúns módulos PHP recomendados nesta instancia. Para mellorar o rendemento e unha mellor compatibilidade, é moi recomendable instalalos:\n%s", + "This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them:\n%s" : "A esta instancia fáltanlle algúns módulos PHP recomendados. Para mellorar o rendemento e a compatibilidade, recoméndase instalalos:\n%s", "PHP opcache" : "PHP opcache", "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "O módulo PHP OPcache non está cargado. Para un mellor rendemento, recoméndase cargalo na súa instalación de PHP.", - "OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache está deshabilitado. Para un mellor rendemento, recoméndase aplicar \"opcache.enable=1\" á súa configuración de PHP.", - "The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "O OPcache baseado na memoria compartida está desactivado. Para un mellor rendemento, recoméndase aplicar \"opcache.file_cache_only=0\" á súa configuración de PHP e utilizar a caché de ficheiros só como caché de segundo nivel.", - "OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache non funciona como debería, opcache_get_status() devolve false, comprobe a configuración.", - "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\"." : "O número máximo de chaves OPcache está practicamente superado. Para garantir que todos os scripts poden manterse na caché, recoméndase aplicar \"opcache.max_accelerated_files\" á súa configuración de PHP cun valor superior 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\"." : "O búfer OPcache está case cheo. Para garantir que todos os scripts se poidan gardar na caché, recoméndase aplicar \"opcache.memory_consumption\" á súa configuración de PHP cun valor superior a \"%s\".", - "The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "O búfer de cadeas internadas en OPcache está case cheo. Para asegurarse de que as cadeas que se repiten se poidan almacenar na memoria caché, recoméndase aplicar \"opcache.interned_strings_buffer\" á súa configuración de PHP cun valor superior a \"%s\".", - "OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache está configurado para eliminar os comentarios do código. Con OPcache activado, debe configurarse \"opcache.save_comments=1\" para que Nextcloud funcione.", - "Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud non está autorizado a usar a API OPcache. Con OPcache activado, recoméndase encarecidamente incluír todos os directorios de Nextcloud con \"opcache.restrict_api\" ou desactivar esta configuración para desactivar as restricións da API de OPcache, para evitar erros durante as actualizacións do núcleo de Nextcloud ou das aplicacións.", + "OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache está desactivado. Para un mellor rendemento, recoméndase aplicar «opcache.enable=1» na configuración de PHP.", + "The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "O OPcache baseado na memoria compartida está desactivado. Para un mellor rendemento, recoméndase aplicar «opcache.file_cache_only=0» na configuración de PHP e utilizar a caché de ficheiros só como caché de segundo nivel.", + "OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache non funciona como debería, opcache_get_status() devolve «false», comprobe a configuración.", + "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\"." : "O número máximo de chaves OPcache está practicamente superado. Para garantir que todos os scripts poden manterse na caché, recoméndase aplicar «opcache.max_accelerated_files» na configuración de PHP cun valor superior 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\"." : "O búfer OPcache está case cheo. Para garantir que todos os scripts se poidan gardar na caché, recoméndase aplicar «opcache.memory_consumption» na configuración de PHP cun valor superior a «%s».", + "The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "O búfer de cadeas internadas en OPcache está case cheo. Para asegurarse de que as cadeas que se repiten se poidan almacenar na memoria caché, recoméndase aplicar «opcache.interned_strings_buffer» na configuración de PHP cun valor superior a «%s».", + "OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache está configurado para eliminar os comentarios do código. Con OPcache activado, debe configurarse «opcache.save_comments=1» para que Nextcloud funcione.", + "Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud non pode usar a API OPcache. Con OPcache activado, é moi recomendábel incluír todos os directorios de Nextcloud con «opcache.restrict_api» ou desactivar este axuste para desactivar as restricións da API de OPcache, para evitar erros durante as anovacións do núcleo de Nextcloud ou da aplicación.", "The PHP OPcache module is not properly configured. %s." : "O módulo PHP OPcache non está configurado correctamente. %s.", "Correctly configured" : "Configurado correctamente", "PHP version" : "PHP version", - "You are currently running PHP %s. PHP 8.1 is now deprecated in Nextcloud 30. Nextcloud 31 may require at least PHP 8.2. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Actualmente estás executando PHP %s. PHP 8.1 agora está obsoleto en Nextcloud 30. É posible que Nextcloud 31 requira polo menos PHP 8.2. Actualice a unha das versións de PHP oficialmente compatibles proporcionadas polo PHP Group canto antes.", + "You are currently running PHP %s. PHP 8.1 is now deprecated in Nextcloud 30. Nextcloud 31 may require at least PHP 8.2. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Actualmente está a executar PHP %s. PHP 8.1 é obsoleto en Nextcloud 30. Nextcloud 31 pode precisar polo menos PHP 8.2. Actualice a unha das versións de PHP oficialmente compatíbeis fornecidas polo Grupo PHP o antes posíbel.", "You are currently running PHP %s." : "Actualmente está a executar PHP %s.", "PHP \"output_buffering\" option" : "Opción de PHP «output_buffering»", "PHP configuration option \"output_buffering\" must be disabled" : "A opción de configuración de PHP «output_buffering» debe estar desactivada", @@ -266,7 +266,7 @@ "Architecture" : "Arquitectura", "64-bit" : "64 bits", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Semella que está a executar unha versión de PHP de 32 bits. Nextcloud necesita 64 bits para funcionar ben. Actualice o seu sistema operativo e PHP a 64 bits.", - "Temporary space available" : "Espazo temporal dispoñible", + "Temporary space available" : "Espazo temporal dispoñíbel", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "Produciuse un erro ao comprobar a ruta temporal de PHP: non se axustou correctamente a un directorio. Valor devolto: %s", "Error while checking the available disk space of temporary PHP path or no free disk space returned. Temporary path: %s" : "Produciuse un erro ao comprobar o espazo no disco dispoñible da ruta PHP temporal ou non se devolveu espazo libre en disco. Ruta temporal: %s", "- %.1f GiB available in %s (PHP temporary directory)" : "-%.1f GiB dispoñible en %s (directorio temporal PHP)", @@ -756,7 +756,7 @@ "Federated Cloud Sharing" : "Nube federada compartida", "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cURL está utilizando unha versión obsoleta %1$s (%2$s). Actualice o seu sistema operativo, caso contrario características como %3$s non funcionarán de xeito fiábel.", "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the Nextcloud log file for more details." : "Non foi posíbel determinar se a versión TLS de cURL está desactualizada ou non porque se produciu un erro durante a solicitude HTTPS contra https://nextcloud.com. Consulte o ficheiro de rexistro de Nextcloud para obter máis detalles.", - "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache está desactivado. Para un mellor rendemento, recoméndase aplicar <code>opcache.enable=1</code> á súa configuración de PHP.", + "OPcache is disabled. For better performance, it is recommended to apply <code>opcache.enable=1</code> to your PHP configuration." : "OPcache está desactivado. Para un mellor rendemento, recoméndase aplicar <code>opcache.enable=1</code> na configuración de PHP.", "OPcache is configured to remove code comments. With OPcache enabled, <code>opcache.save_comments=1</code> must be set for Nextcloud to function." : "OPcache está configurado para retirar comentarios de código. Con OPcache activado, debe configurarse <code>opcache.save_comments=1</code> para que Nextcloud funcione.", "Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with <code>opcache.restrict_api</code> or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud non pode usar a API OPcache. Con OPcache activado, é moi recomendábel incluír todos os directorios de Nextcloud con <code>opcache.restrict_api</code> ou desactivar este axuste para desactivar as restricións da API de OPcache, para evitar erros durante as anovacións do núcleo de Nextcloud ou da aplicación.", "Nextcloud is not allowed to use the OPcache API. It is highly recommended to include all Nextcloud directories with <code>opcache.restrict_api</code> or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud non pode usar a API OPcache. É moi recomendábel incluír todos os directorios de Nextcloud con <code>opcache.restrict_api</code> ou desactivar este axuste para desactivar as restricións da API de OPcache, para evitar erros durante as anovacións do núcleo de Nextcloud ou das aplicacións.", diff --git a/apps/settings/l10n/ru.js b/apps/settings/l10n/ru.js index 6d400c89e74..24d39c02058 100644 --- a/apps/settings/l10n/ru.js +++ b/apps/settings/l10n/ru.js @@ -128,6 +128,7 @@ OC.L10N.register( "App directories have the correct owner \"%s\"" : "У каталогов приложений есть правильный владелец \"%s\"", "Brute-force Throttle" : "Ограничение частоты ввода паролей", "Your remote address could not be determined." : "Не удалось определить ваш сетевой адрес.", + "Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ваш IP-адрес был определён как «%s» и в данный момент заблокирован защитой от перебора, что замедляет выполнение различных запросов. Если удаленный адрес не является вашим адресом, это может свидетельствовать о том, что прокси-сервер настроен неправильно.", "Your remote address \"%s\" is not brute-force throttled." : "Ваш сетевой адрес «%s» не имеет ограничений по частоте ввода паролей.", "Old administration imported certificates" : "Сертификаты, импортированные старым пользователем", "A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Запланировано фоновое задание проверки пользовательских SSL-сертификатов. Пожалуйста, проверьте позже.", @@ -177,6 +178,7 @@ OC.L10N.register( "Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead. Without it some important web functionality like \"copy to clipboard\" or \"service workers\" will not work!" : "Доступ к сайту осуществляется с использованием небезопасного протокола HTTP. Настоятельно рекомендуется вместо этого настроить использование протокола HTTPS, т.к. без него не будут работать некоторые важные веб-функции, такие, как копирование в буфер обмена и обработчики служб.", "Accessing site insecurely via HTTP." : "Используется небезопасное подключение по протоколу HTTP.", "You are accessing your instance over a secure connection, however your instance is generating insecure URLs. This likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Сервер создаёт небезопасные ссылки, несмотря на то, что к нему осуществлено безопасное подключение. Скорее всего, причиной являются неверно настроенные параметры обратного прокси и значения параметров «overwrite*», настраивающих перезапись адресов.", + "Your instance is generating insecure URLs. If you access your instance over HTTPS, this likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Сервер создаёт незащищённые ссылки. Если вы используете подключение по протоколу HTTPS, то, скорее всего, причиной являются неверно настроенные параметры обратного прокси и значения параметров «overwrite*», настраивающих перезапись адресов.", "You are accessing your instance over a secure connection, and your instance is generating secure URLs." : "Используется безопасное подключение по протоколу HTTPS и сервер создаёт безопасные ссылки.", "Internet connectivity" : "Подключение к интернету", "Internet connectivity is disabled in configuration file." : "Подключение к интернету отключено к файле конфигурации", @@ -184,6 +186,7 @@ OC.L10N.register( "JavaScript modules support" : "Поддержка модулей JavaScript", "Unable to run check for JavaScript support. Please remedy or confirm manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Не удалось проверить, поддерживается ли JavaScript. Внесите исправления или подтвердите, обрабатывает ли веб-сервер файлы *.mjs, основываясь на MIME-типах.", "JavaScript source map support" : "Поддержка модулей JavaScript", + "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "Веб-сервер не настроена должным образом для поддержки файлов «.js.map». Отсутствие поддержки этих файлов усложняет поиск ошибок и их отладку. ", "Old server-side-encryption" : "Устаревший режим шифрования на стороне сервера", "Disabled" : "Отключено", "The old server-side-encryption format is enabled. We recommend disabling this." : "Задействован устаревший режим шифрования файлов на стороне сервера. Рекомендуется отключить такое шифрование.", @@ -245,12 +248,18 @@ OC.L10N.register( "Nextcloud configuration file is writable" : "Файл конфигурации Nextcloud доступен для записи", "HTTP headers" : "Заголовки HTTP", "Database version" : "Версия базы данных", + "Unknown database platform" : "Неизвестная платформа базы данных", "Architecture" : "Архитектура", "64-bit" : "64-бита", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Похоже, вы используете 32-битную версию PHP. Для нормальной работы Nextcloud требуется 64-битная версия. Пожалуйста, обновите свою ОС и PHP до 64-битной версии!", + "Temporary space available" : "Доступное временное пространство", + "Temporary directory is correctly configured:\n%s" : "Каталог временных файлов настроен верно:\n%s", + "Database transaction isolation level" : "Уровень изоляции транзакций", "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "База данных не использует режиме изоляции транзакций «READ COMMITED». Такое поведение может вызвать проблемы при одновременном выполнении нескольких операций.", - ".well-known URLs" : "адреса .well-known", + ".well-known URLs" : "Адреса .well-known", "WOFF2 file loading" : "Загрузка файлов WOFF2", + "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Не удалось проверить, поддерживаются ли файлы формата WOFF2. Проверьте, что веб-сервер обрабатывает файлы с расширением «.woff2».", + "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Веб-сервер не настроен должным образом для передачи файлов шрифтов в формате .woff2, что необходимо для правильной работы Nextcloud версии 15. Как правило, это связано с конфигурацией веб-сервера Nginx. Сравните используемую конфигурацию с рекомендуемой конфигурацией из документации.", "Profile information" : "Сведения о профиле", "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Изображение профиля, полное имя, адрес электронной почты, номер телефона, адрес, веб-сайт, Twitter, организация, роль, заголовок, биография и сведения том, активен ли профиль", "Nextcloud settings" : "Параметры Nextcloud", @@ -286,10 +295,17 @@ OC.L10N.register( "Set default expiration date for shares" : "Установить срок действия общего доступа по умолчанию", "Enforce expiration date" : "Срок действия обязателен", "Default expiration time of new shares in days" : "Время истечения новых публикаций по умолчанию (в днях)", + "Expire shares after x days" : "Закрывать общий доступ через x дней", "Set default expiration date for shares to other servers" : "Установить дату истечения по умолчанию для общих ресурсов на других серверах", + "Enforce expiration date for remote shares" : "Принудительно задать срок истечения доступа к общим ресурсам с других серверов", + "Default expiration time of remote shares in days" : "Время истечения общих ресурсов с других серверов по умолчанию (в днях)", + "Expire remote shares after x days" : "Закрывать общий доступ к ресурсам с других серверов через x дней", "Set default expiration date for shares via link or mail" : "Установить срок действия общего доступа через ссылки или почту", + "Default expiration time of shares in days" : "Срок действия общего доступа по умолчанию", "Privacy settings for sharing" : "Настройки приватности для совместного использования", "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Если автозаполнение «одна группа» и «интеграция телефонного номера» включены, совпадения в любом из них достаточно, чтобы отобразить пользователя.", + "Allow account name autocompletion to users within the same groups and limit system address books to users in the same groups" : "Разрешить автодополнения имени учётной записи пользователям из одних и тех же групп и ограничить доступ к системным адресным книгам пользователями из одних и тех же групп", + "Allow account name autocompletion to users based on phone number integration" : "Разрешить пользователям автодополнение имени учётной записи на основе номера телефона", "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Разрешить автозаполнение при вводе полного имени или адреса электронной почты (игнорируя отсутствие совпадений в телефонной книге и нахождение в одной группе)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Показывать текст отказа от ответственности на странице публичной ссылки (показывается только когда скрыт список файлов)", "Disclaimer text" : "Текст отказа от ответственности", @@ -297,6 +313,7 @@ OC.L10N.register( "Default share permissions" : "Права общего доступа по умолчанию", "Changed disclaimer text" : "Текст отказа от ответственности изменён", "Deleted disclaimer text" : "Текст отказа от ответственности удалён", + "Could not set disclaimer text" : "Не удалось задать текст отказа от отвественности", "Two-Factor Authentication" : "Двухфакторная аутентификация", "Two-factor authentication can be enforced for all accounts and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "Двухфакторная аутентификация может быть принудительна включена для всех учётных записей и выбранных групп. В случае, если у пользователя не настроен механизм подтверждения подлинности вторым фактором, он не сможет войти в систему.", "Enforce two-factor authentication" : "Требовать двухфакторую аунтефикацию", @@ -308,12 +325,14 @@ OC.L10N.register( "Excluded groups" : "Группы без требования использования двухфакторной аутентификации", "When groups are selected/excluded, they use the following logic to determine if an account has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If an account is both in a selected and excluded group, the selected takes precedence and 2FA is enforced." : "Если выбрано включение или отключение использования двухфакторной проверки подлинности для групп, то для определения, требуется ли от пользователя использовать её, применяются следующие правила: \\n\n - если группы не включены в список, то двухфакторная проверка включена для всех их участников, кроме тех, кто также состоит в группах, проверка для которых отключена;\n - если группы включены в список, то двухфакторная проверка включена для всех участников таких групп;\n- если учётная запись состоит одновременно и в группе, проверка для которой включена и группе, проверка для которой отключена, то приоритет получает использование двухфакторной проверки.", "Save changes" : "Сохранить изменения", + "Show details for {appName} app" : "Подробные сведения о приложении «{appName}»", "Update to {update}" : "Обновить до {update}", "Remove" : "Удалить", "Disable" : "Отключить", "Featured" : "Рекомендуемые", "This app is supported via your current Nextcloud subscription." : "Это приложение поддерживается через вашу текущую подписку Nextcloud.", "Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Рекомендованные приложения разработаны совместно с сообществом. Эти приложения обеспечивают основной функционал и готовы для использования в рабочих системах.", + "Community rating: {score}/5" : "Оценка сообщества: {score}/5", "All apps are up-to-date." : "Обновления приложений отсутствуют.", "Icon" : "Значок", "Name" : "Имя", @@ -326,12 +345,16 @@ OC.L10N.register( "Download and enable all" : "Скачать и включить все", "_%n app has an update available_::_%n apps have an update available_" : ["Возможно обновить %n приложение.","Возможно обновить %n приложения.","Возможно обновить %n приложений.","Возможно обновить %n приложения."], "_Update_::_Update all_" : ["Обновить","Обновить все","Обновить все","Обновить все"], + "Nothing to show" : "Нет ни одного объекта для просмотра", + "Could not load section content from app store." : "Не удалось загрузить содержимое из магазина приложений", "Loading" : "Загрузка", "Fetching the latest news…" : "Получение последних новостей…", + "Could not load app discover section" : "Не удалось загрузить раздел «Центр приложений»", "Could not render element" : "Не удалось подготовить объект к показу", "Carousel" : "Карусель", "Previous slide" : "Предыдущий слайд", "Next slide" : "Следующий слайд", + "Choose slide to display" : "Выберите слайд для показа", "{index} of {total}" : "{index} из {total}", "Description" : "Описание", "Details" : "Подробные сведения", @@ -347,6 +370,7 @@ OC.L10N.register( "Categories" : "Категории", "Resources" : "Ресурсы", "Documentation" : "Документация", + "Interact" : "Содействовать", "Report a bug" : "Сообщить об ошибке", "Request feature" : "Запросить новую возможность", "Ask questions or discuss" : "Задать вопросы или обсудить", @@ -354,6 +378,7 @@ OC.L10N.register( "Rate" : "Оценка", "View in store" : "Посмотреть в магазине приложений", "Visit website" : "Перейти на веб-сайт", + "Usage documentation" : "Документация по использованию", "Admin documentation" : "Документация для администратора", "Developer documentation" : "Документация для разработчиков", "Changelog" : "Журнал изменений", @@ -374,6 +399,8 @@ OC.L10N.register( "{productName} Talk for Android" : "Приложение {productName} Talk для Android", "Sync client" : "Приложение для синхронизации", "This session" : "Этот сеанс работы", + "{client} - {version} ({system})" : "{client} — {version} ({system})", + "{client} - {version}" : "{client} — {version}", "Device" : "Устройство", "Last activity" : "Последние действия", "Devices & sessions" : "Активные устройства и сеансы", @@ -382,10 +409,16 @@ OC.L10N.register( "Create new app password" : "Создать пароль приложения", "Error while creating device token" : "Ошибка при создании токена для устройства", "New app password" : "Новый пароль приложения", + "Use the credentials below to configure your app or device. For security reasons this password will only be shown once." : "Для настройки приложения или устройства используйте данных для входа в систему, приведённые ниже. По соображениям безопасности, пароль будет показан только один раз.", "Login" : "Логин", "Password" : "Пароль", "Show QR code for mobile apps" : "Показать QR-код для мобильных приложений", - "Could not copy app password. Please copy it manually." : "Не удалось скопировать пароль приложения. Пожалуйста, скопируйте его вручную.", + "App password copied!" : "Пароль приложения скопирован.", + "Copy app password" : "Копировать пароль приложения", + "Login name copied!" : "Имя пользователя скопировано.", + "Copy login name" : "Копировать имя пользователя", + "Could not copy app password. Please copy it manually." : "Не удалось скопировать пароль приложения. Скопируйте его вручную.", + "Could not copy login name. Please copy it manually." : "Не удалось скопировать имя пользователя. Скопируйте его вручную.", "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." : "Для правильной работы сервера Nextcloud важно правильно настроить выполнение задач в фоновом режиме. Рекомендуемым вариантом запуска фоновых задач является использование планировщика Cron. Обратитесь к документации для получения дополнительной информации.", "Last job execution ran {time}. Something seems wrong." : "Последнее задание было выполнено {time}. Похоже, что-то не в порядке.", "Last job ran {relativeTime}." : "Последнее задание было запущено {relativeTime}.", @@ -418,6 +451,7 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "Необходимо выполнить перенос ключей из старого механизма шифрования (ownCloud <= 8.0) в новый. Для выполнения переноса активируйте приложение «Модуль шифрования по умолчанию» и запустите команду «{command}»", "Unable to update server side encryption config" : "Не удалось обновить параметры шифрования на стороне сервера", "Please confirm the group removal" : "Подтвердите удаление группы", + "You are about to remove the group \"{group}\". The accounts will NOT be deleted." : "Группа «{group}» будет удалена. Это действие НЕ ПРИВОДИТ к удалению учётных записей, входящих в эту группу.", "Cancel" : "Отмена", "Confirm" : "Подтвердить", "Submit" : "Отправить ответ", @@ -442,6 +476,8 @@ OC.L10N.register( "Error saving profile picture" : "Не удалось сохранить изображение профиля", "Error removing profile picture" : "Не удалось очистить изображения профиля", "Your biography" : "Ваша биография", + "Enter your date of birth" : "Введите дату своего рождения", + "Unable to update date of birth" : "Не удалось обновить дату рождения", "You are a member of the following groups:" : "Вы являетесь участником следующих групп:", "You are using <strong>{usage}</strong>" : "Вы используете <strong>{usage}</strong>", "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Вы используете <strong>{usage}</strong> из <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)", @@ -479,6 +515,7 @@ OC.L10N.register( "The more restrictive setting of either visibility or scope is respected on your Profile. For example, if visibility is set to \"Show to everyone\" and scope is set to \"Private\", \"Private\" is respected." : "В профиле устанавливаются более строгие настройки видимости или области действия. Например, если для видимости установлено значение «Видно всем», а для области действия установлено значение «Скрыто», будет использоваться значение «Скрыто».", "Unable to update visibility of {displayId}" : "Не удалось изменить видимость {displayId}", "Your role" : "Ваша роль", + "Your X (formerly Twitter) handle" : "Ваше имя в сети X (ранее — Твиттер)", "Your website" : "Ваш сайт", "No {property} set" : "Свойство «{property}» не задано", "Invalid value" : "Недопустимое значение", @@ -506,26 +543,39 @@ OC.L10N.register( "Email (required)" : "Эл. почта (обязательно)", "Email" : "Адрес эл. почты", "Groups (required)" : "Группы (обязательно)", + "Set account groups" : "Выбрать группы учётной записи", "Administered groups" : "Администрируемые группы", "Quota" : "Квота", + "Set account quota" : "Задать квоту для учётной записи", "Language" : "Язык", "Set default language" : "Выбрать язык по умолчанию", + "Add new account" : "Создать учётную запись", "Manager" : "Руководитель", + "Set account manager" : "Выбрать руководителя учётной записи", + "Account name will be autogenerated" : "Имя учётной записи будет создано автоматически", + "Account name (required)" : "Имя учётной записи (обязательно)", "Total rows summary" : "Количество строк в общем", "Scroll to load more rows" : "Прокрутите, чтобы загрузить больше строк", + "_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} учётная запись…","{userCount} учётных записи…","{userCount} учётных записей…","{userCount} учётных записи…"], + "_{userCount} account_::_{userCount} accounts_" : ["{userCount} учётная запись","{userCount} учётныt записи","{userCount} учётных записей","{userCount} учётные записи"], "Avatar" : "Аватар", + "Account name" : "Имя учётной записи", "Group admin for" : "Администратор групп", + "Account backend" : "Механизм учёта", "Storage location" : "Расположение хранилища", "Last login" : "Последний вход", "Account actions" : "Действия над аккаунтом", "Password or insufficient permissions message" : "Сообщение о пароле или недостаточных разрешениях", + "Loading account …" : "Загрузка сведений об учётной записи…", "Change display name" : "Изменить отображаемое имя", "Set new password" : "Установить новый пароль", "You do not have permissions to see the details of this account" : "У вас нет прав на просмотр данных этой учётной записи", "Set new email address" : "Установить новый адрес эл. почты", "Add account to group" : "Добавить учётную запись в группу", "Set account as admin for" : "Назначить администратором", + "Select account quota" : "Выбор квоты для учётной записи", "Set the language" : "Выбрать язык", + "Set line manager" : "Выбрать руководителя", "{size} used" : "использовано {size}", "Delete account" : "Удалить учётную запись", "Disconnect all devices and delete local data" : "Отключить все устройства и удалить локальные данные", @@ -548,6 +598,7 @@ OC.L10N.register( "Account management settings" : "Параметры управления учётными записями", "Visibility" : "Видимость", "Show language" : "Показывать язык", + "Show account backend" : "Показать механизм учёта", "Show storage path" : "Путь хранилища", "Show last login" : "Время последнего входа в систему", "Sorting" : "Сортировка", @@ -555,6 +606,7 @@ OC.L10N.register( "By member count" : "По количеству участников", "By name" : "По имени", "Send email" : "Отправить сообщение", + "Send welcome email to new accounts" : "Отправлять приветственное электронное письмо новым пользователям", "Defaults" : "Значения по умолчанию", "Default quota" : "Квота по умолчанию", "Select default quota" : "Квота по умолчанию", @@ -600,9 +652,12 @@ OC.L10N.register( "X (formerly Twitter)" : "X (ранее Твиттер)", "Fediverse (e.g. Mastodon)" : "Федерации (например, Mastodon)", "Website" : "Адрес сайта", + "Date of birth" : "Дата рождения", "Profile visibility" : "Видимость профиля", "Locale" : "Региональные стандарты", "Not available as this property is required for core functionality including file sharing and calendar invitations" : "Заданный параметр не может быть использован, так как его используют основные функции, такие как совместный доступ к файлам и приглашения к событиям из календаря", + "Not available as federation has been disabled for your account, contact your system administration if you have any questions" : "Недоступно, так как федерация отключена для вашей учетной записи. Если у вас есть какие-либо вопросы, обратитесь к системному администратору.", + "Not available as publishing account specific data to the lookup server is not allowed, contact your system administration if you have any questions" : "Недоступно, так как публикация пользовательских данных на сервере поиска запрещена. Обратитесь к системному администратору, если у вас возникнут какие-либо вопросы.", "Discover" : "Центр приложений", "Your apps" : "Ваши приложения", "Active apps" : "Активные приложения", @@ -612,23 +667,31 @@ OC.L10N.register( "Featured apps" : "Рекомендуемые приложения", "Supported apps" : "Поддерживаемые приложения", "Show to everyone" : "Для всех", + "Show to logged in accounts only" : "Только для вошедших в систему", "Hide" : "Скрыт", "Download and enable" : "Скачать и включить", "Allow untested app" : "Разрешить непроверенное приложение", "The app will be downloaded from the App Store" : "Приложение будет скачано из магазина приложений", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Это приложение не отмечено как совместимое с вашей версией Nextcloud. Если вы продолжите, вы сможете установить это приложение, однако оно может работать не так, как ожидается.", "Never" : "Никогда", + "Could not register device: Network error" : "Не удалось зарегистрировать устройство: ошибка сети", + "Could not register device: Probably already registered" : "Не удалось зарегистрировать устройство: возможно, это устройство уже зарегистрировано", + "Could not register device" : "Не удалось зарегистрировать устройство", "An error occurred during the request. Unable to proceed." : "Во время запроса произошла ошибка. Продолжение невозможно.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Приложение было включено, но нуждается в обновлении. В течении 5 секунд будет выполнено перенаправление на страницу обновления.", "Error: This app cannot be enabled because it makes the server unstable" : "Ошибка: это приложение не может быть включено, так как оно сделает сервер нестабильным", "Do you really want to wipe your data from this device?" : "Действительно удалить свои данные с этого устройства?", "Confirm wipe" : "Подтверждение удаления данных", + "Could not delete the app token" : "Не удалось удалить токен приложения", "Error while wiping the device with the token" : "Ошибка при очистке устройства с данным токеном", "Error while updating device token name" : "Ошибка при обновлении имени токена устройства", "Error while updating device token scope" : "Ошибка при обновлении разрешений токена устройства", + "Could not set group sorting" : "Не удалось настроить сортировку групп", "There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Превышено количество запросов из вашей сети. Попробуйте позднее или сообщите администратору об этой ошибке.", "Administration documentation" : "Документация администратора", "Forum" : "Форум", + "Nextcloud help & privacy resources" : "Справочные ресурсы Nexcloud и руководства по безопасности", + "General documentation" : "Основная документация", "Legal notice" : "Официальное уведомление", "Privacy policy" : "Политика конфиденциальности", "None/STARTTLS" : "Без шифрования/STARTTLS", @@ -644,6 +707,7 @@ OC.L10N.register( "Authentication" : "Аутентификация", "Authentication required" : "Требуется аутентификация ", "Credentials" : "Учётные данные", + "SMTP Login" : "Ипя пользователя SMTP", "SMTP Password" : "Пароль SMTP", "Save" : "Сохранить", "Test and verify email settings" : "Проверить параметры эл. почты", @@ -773,10 +837,14 @@ OC.L10N.register( "Old user imported certificates" : "Сертификаты, импортированные старым пользователем", "Missing optional index \"%s\" in table \"%s\"." : "В таблице «%s» отсутствует необязательный индекс «%s».", "The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running \"occ db:add-missing-indices\" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster." : "В базе данных отсутствуют некоторые индексы. Так как создание таких индексов может занять достаточно продолжительное время, оно должно быть запущено вручную. Для создания индексов необходимо запустить команду «occ db:add-missing-indices» во время работы сервера Nextcloud. При созданных индексах, как правило, запросы к базе данных выполняются значительно быстрее.", + "Could not check for JavaScript support. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Не удалось проверить, поддерживается ли JavaScript. Внесите исправления или подтвердите, обрабатывает ли веб-сервер файлы *.mjs, основываясь на MIME-типах.", + "MySQL unicode support" : "Поддержка стандарта кодирования Юникод в MySQL", + "Overwrite cli URL" : "Перезапись адреса интерфейса командной строки", "You are currently running PHP %s. PHP 8.0 is now deprecated in Nextcloud 27. Nextcloud 28 may require at least PHP 8.1. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "В настоящее время вы используете PHP %s. PHP 8.0 больше не поддерживается в Nextcloud 27. Для Nextcloud 28 может потребоваться как минимум PHP 8.1. Пожалуйста, как можно скорее обновитесь до одной из официально поддерживаемых версий PHP, предоставленных PHP Group.", + "Rating: {score}/10" : "Оценка: {score}/10", "You are about to remove the group \"{group}\". The users will NOT be deleted." : "Группа \"{group}\" будет удалена. Пользователи НЕ будут удалены.", "No users" : "Нет пользователей", - "Loading users …" : "Загрузка пользователей …", + "Loading users …" : "Загрузка пользователей…", "List of users. This list is not fully rendered for performance reasons. The users will be rendered as you navigate through the list." : "Список пользователей. Этот список отображен не полностью по соображениям производительности. Пользователи будут отображаться по мере того, как Вы будете перемещаться по списку.", "Set user groups" : "Задать группы пользователя", "Set user as admin for …" : "Назначить пользователя администратором для ...", @@ -792,6 +860,9 @@ OC.L10N.register( "Failed to update user manager" : "Не удалось обновить диспетчер пользователей", "User management settings" : "Настройки управления пользователями", "Send welcome email to new users" : "Отправлять приветственное электронное письмо новым пользователям", - "Creating group …" : "Создание группы…" + "User management" : "Управление пользователями", + "Creating group …" : "Создание группы…", + "User group: {group}" : "Группа пользователя: {group}", + "Nextcloud help resources" : "Справочные ресурсы Nextcloud" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/settings/l10n/ru.json b/apps/settings/l10n/ru.json index a056697772f..7ddc82f5cbc 100644 --- a/apps/settings/l10n/ru.json +++ b/apps/settings/l10n/ru.json @@ -126,6 +126,7 @@ "App directories have the correct owner \"%s\"" : "У каталогов приложений есть правильный владелец \"%s\"", "Brute-force Throttle" : "Ограничение частоты ввода паролей", "Your remote address could not be determined." : "Не удалось определить ваш сетевой адрес.", + "Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ваш IP-адрес был определён как «%s» и в данный момент заблокирован защитой от перебора, что замедляет выполнение различных запросов. Если удаленный адрес не является вашим адресом, это может свидетельствовать о том, что прокси-сервер настроен неправильно.", "Your remote address \"%s\" is not brute-force throttled." : "Ваш сетевой адрес «%s» не имеет ограничений по частоте ввода паролей.", "Old administration imported certificates" : "Сертификаты, импортированные старым пользователем", "A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Запланировано фоновое задание проверки пользовательских SSL-сертификатов. Пожалуйста, проверьте позже.", @@ -175,6 +176,7 @@ "Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead. Without it some important web functionality like \"copy to clipboard\" or \"service workers\" will not work!" : "Доступ к сайту осуществляется с использованием небезопасного протокола HTTP. Настоятельно рекомендуется вместо этого настроить использование протокола HTTPS, т.к. без него не будут работать некоторые важные веб-функции, такие, как копирование в буфер обмена и обработчики служб.", "Accessing site insecurely via HTTP." : "Используется небезопасное подключение по протоколу HTTP.", "You are accessing your instance over a secure connection, however your instance is generating insecure URLs. This likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Сервер создаёт небезопасные ссылки, несмотря на то, что к нему осуществлено безопасное подключение. Скорее всего, причиной являются неверно настроенные параметры обратного прокси и значения параметров «overwrite*», настраивающих перезапись адресов.", + "Your instance is generating insecure URLs. If you access your instance over HTTPS, this likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Сервер создаёт незащищённые ссылки. Если вы используете подключение по протоколу HTTPS, то, скорее всего, причиной являются неверно настроенные параметры обратного прокси и значения параметров «overwrite*», настраивающих перезапись адресов.", "You are accessing your instance over a secure connection, and your instance is generating secure URLs." : "Используется безопасное подключение по протоколу HTTPS и сервер создаёт безопасные ссылки.", "Internet connectivity" : "Подключение к интернету", "Internet connectivity is disabled in configuration file." : "Подключение к интернету отключено к файле конфигурации", @@ -182,6 +184,7 @@ "JavaScript modules support" : "Поддержка модулей JavaScript", "Unable to run check for JavaScript support. Please remedy or confirm manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Не удалось проверить, поддерживается ли JavaScript. Внесите исправления или подтвердите, обрабатывает ли веб-сервер файлы *.mjs, основываясь на MIME-типах.", "JavaScript source map support" : "Поддержка модулей JavaScript", + "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "Веб-сервер не настроена должным образом для поддержки файлов «.js.map». Отсутствие поддержки этих файлов усложняет поиск ошибок и их отладку. ", "Old server-side-encryption" : "Устаревший режим шифрования на стороне сервера", "Disabled" : "Отключено", "The old server-side-encryption format is enabled. We recommend disabling this." : "Задействован устаревший режим шифрования файлов на стороне сервера. Рекомендуется отключить такое шифрование.", @@ -243,12 +246,18 @@ "Nextcloud configuration file is writable" : "Файл конфигурации Nextcloud доступен для записи", "HTTP headers" : "Заголовки HTTP", "Database version" : "Версия базы данных", + "Unknown database platform" : "Неизвестная платформа базы данных", "Architecture" : "Архитектура", "64-bit" : "64-бита", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Похоже, вы используете 32-битную версию PHP. Для нормальной работы Nextcloud требуется 64-битная версия. Пожалуйста, обновите свою ОС и PHP до 64-битной версии!", + "Temporary space available" : "Доступное временное пространство", + "Temporary directory is correctly configured:\n%s" : "Каталог временных файлов настроен верно:\n%s", + "Database transaction isolation level" : "Уровень изоляции транзакций", "Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "База данных не использует режиме изоляции транзакций «READ COMMITED». Такое поведение может вызвать проблемы при одновременном выполнении нескольких операций.", - ".well-known URLs" : "адреса .well-known", + ".well-known URLs" : "Адреса .well-known", "WOFF2 file loading" : "Загрузка файлов WOFF2", + "Could not check for WOFF2 loading support. Please check manually if your webserver serves `.woff2` files." : "Не удалось проверить, поддерживаются ли файлы формата WOFF2. Проверьте, что веб-сервер обрабатывает файлы с расширением «.woff2».", + "Your web server is not properly set up to deliver .woff2 files. This is typically an issue with the Nginx configuration. For Nextcloud 15 it needs an adjustement to also deliver .woff2 files. Compare your Nginx configuration to the recommended configuration in our documentation." : "Веб-сервер не настроен должным образом для передачи файлов шрифтов в формате .woff2, что необходимо для правильной работы Nextcloud версии 15. Как правило, это связано с конфигурацией веб-сервера Nginx. Сравните используемую конфигурацию с рекомендуемой конфигурацией из документации.", "Profile information" : "Сведения о профиле", "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Изображение профиля, полное имя, адрес электронной почты, номер телефона, адрес, веб-сайт, Twitter, организация, роль, заголовок, биография и сведения том, активен ли профиль", "Nextcloud settings" : "Параметры Nextcloud", @@ -284,10 +293,17 @@ "Set default expiration date for shares" : "Установить срок действия общего доступа по умолчанию", "Enforce expiration date" : "Срок действия обязателен", "Default expiration time of new shares in days" : "Время истечения новых публикаций по умолчанию (в днях)", + "Expire shares after x days" : "Закрывать общий доступ через x дней", "Set default expiration date for shares to other servers" : "Установить дату истечения по умолчанию для общих ресурсов на других серверах", + "Enforce expiration date for remote shares" : "Принудительно задать срок истечения доступа к общим ресурсам с других серверов", + "Default expiration time of remote shares in days" : "Время истечения общих ресурсов с других серверов по умолчанию (в днях)", + "Expire remote shares after x days" : "Закрывать общий доступ к ресурсам с других серверов через x дней", "Set default expiration date for shares via link or mail" : "Установить срок действия общего доступа через ссылки или почту", + "Default expiration time of shares in days" : "Срок действия общего доступа по умолчанию", "Privacy settings for sharing" : "Настройки приватности для совместного использования", "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "Если автозаполнение «одна группа» и «интеграция телефонного номера» включены, совпадения в любом из них достаточно, чтобы отобразить пользователя.", + "Allow account name autocompletion to users within the same groups and limit system address books to users in the same groups" : "Разрешить автодополнения имени учётной записи пользователям из одних и тех же групп и ограничить доступ к системным адресным книгам пользователями из одних и тех же групп", + "Allow account name autocompletion to users based on phone number integration" : "Разрешить пользователям автодополнение имени учётной записи на основе номера телефона", "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Разрешить автозаполнение при вводе полного имени или адреса электронной почты (игнорируя отсутствие совпадений в телефонной книге и нахождение в одной группе)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Показывать текст отказа от ответственности на странице публичной ссылки (показывается только когда скрыт список файлов)", "Disclaimer text" : "Текст отказа от ответственности", @@ -295,6 +311,7 @@ "Default share permissions" : "Права общего доступа по умолчанию", "Changed disclaimer text" : "Текст отказа от ответственности изменён", "Deleted disclaimer text" : "Текст отказа от ответственности удалён", + "Could not set disclaimer text" : "Не удалось задать текст отказа от отвественности", "Two-Factor Authentication" : "Двухфакторная аутентификация", "Two-factor authentication can be enforced for all accounts and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "Двухфакторная аутентификация может быть принудительна включена для всех учётных записей и выбранных групп. В случае, если у пользователя не настроен механизм подтверждения подлинности вторым фактором, он не сможет войти в систему.", "Enforce two-factor authentication" : "Требовать двухфакторую аунтефикацию", @@ -306,12 +323,14 @@ "Excluded groups" : "Группы без требования использования двухфакторной аутентификации", "When groups are selected/excluded, they use the following logic to determine if an account has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If an account is both in a selected and excluded group, the selected takes precedence and 2FA is enforced." : "Если выбрано включение или отключение использования двухфакторной проверки подлинности для групп, то для определения, требуется ли от пользователя использовать её, применяются следующие правила: \\n\n - если группы не включены в список, то двухфакторная проверка включена для всех их участников, кроме тех, кто также состоит в группах, проверка для которых отключена;\n - если группы включены в список, то двухфакторная проверка включена для всех участников таких групп;\n- если учётная запись состоит одновременно и в группе, проверка для которой включена и группе, проверка для которой отключена, то приоритет получает использование двухфакторной проверки.", "Save changes" : "Сохранить изменения", + "Show details for {appName} app" : "Подробные сведения о приложении «{appName}»", "Update to {update}" : "Обновить до {update}", "Remove" : "Удалить", "Disable" : "Отключить", "Featured" : "Рекомендуемые", "This app is supported via your current Nextcloud subscription." : "Это приложение поддерживается через вашу текущую подписку Nextcloud.", "Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Рекомендованные приложения разработаны совместно с сообществом. Эти приложения обеспечивают основной функционал и готовы для использования в рабочих системах.", + "Community rating: {score}/5" : "Оценка сообщества: {score}/5", "All apps are up-to-date." : "Обновления приложений отсутствуют.", "Icon" : "Значок", "Name" : "Имя", @@ -324,12 +343,16 @@ "Download and enable all" : "Скачать и включить все", "_%n app has an update available_::_%n apps have an update available_" : ["Возможно обновить %n приложение.","Возможно обновить %n приложения.","Возможно обновить %n приложений.","Возможно обновить %n приложения."], "_Update_::_Update all_" : ["Обновить","Обновить все","Обновить все","Обновить все"], + "Nothing to show" : "Нет ни одного объекта для просмотра", + "Could not load section content from app store." : "Не удалось загрузить содержимое из магазина приложений", "Loading" : "Загрузка", "Fetching the latest news…" : "Получение последних новостей…", + "Could not load app discover section" : "Не удалось загрузить раздел «Центр приложений»", "Could not render element" : "Не удалось подготовить объект к показу", "Carousel" : "Карусель", "Previous slide" : "Предыдущий слайд", "Next slide" : "Следующий слайд", + "Choose slide to display" : "Выберите слайд для показа", "{index} of {total}" : "{index} из {total}", "Description" : "Описание", "Details" : "Подробные сведения", @@ -345,6 +368,7 @@ "Categories" : "Категории", "Resources" : "Ресурсы", "Documentation" : "Документация", + "Interact" : "Содействовать", "Report a bug" : "Сообщить об ошибке", "Request feature" : "Запросить новую возможность", "Ask questions or discuss" : "Задать вопросы или обсудить", @@ -352,6 +376,7 @@ "Rate" : "Оценка", "View in store" : "Посмотреть в магазине приложений", "Visit website" : "Перейти на веб-сайт", + "Usage documentation" : "Документация по использованию", "Admin documentation" : "Документация для администратора", "Developer documentation" : "Документация для разработчиков", "Changelog" : "Журнал изменений", @@ -372,6 +397,8 @@ "{productName} Talk for Android" : "Приложение {productName} Talk для Android", "Sync client" : "Приложение для синхронизации", "This session" : "Этот сеанс работы", + "{client} - {version} ({system})" : "{client} — {version} ({system})", + "{client} - {version}" : "{client} — {version}", "Device" : "Устройство", "Last activity" : "Последние действия", "Devices & sessions" : "Активные устройства и сеансы", @@ -380,10 +407,16 @@ "Create new app password" : "Создать пароль приложения", "Error while creating device token" : "Ошибка при создании токена для устройства", "New app password" : "Новый пароль приложения", + "Use the credentials below to configure your app or device. For security reasons this password will only be shown once." : "Для настройки приложения или устройства используйте данных для входа в систему, приведённые ниже. По соображениям безопасности, пароль будет показан только один раз.", "Login" : "Логин", "Password" : "Пароль", "Show QR code for mobile apps" : "Показать QR-код для мобильных приложений", - "Could not copy app password. Please copy it manually." : "Не удалось скопировать пароль приложения. Пожалуйста, скопируйте его вручную.", + "App password copied!" : "Пароль приложения скопирован.", + "Copy app password" : "Копировать пароль приложения", + "Login name copied!" : "Имя пользователя скопировано.", + "Copy login name" : "Копировать имя пользователя", + "Could not copy app password. Please copy it manually." : "Не удалось скопировать пароль приложения. Скопируйте его вручную.", + "Could not copy login name. Please copy it manually." : "Не удалось скопировать имя пользователя. Скопируйте его вручную.", "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." : "Для правильной работы сервера Nextcloud важно правильно настроить выполнение задач в фоновом режиме. Рекомендуемым вариантом запуска фоновых задач является использование планировщика Cron. Обратитесь к документации для получения дополнительной информации.", "Last job execution ran {time}. Something seems wrong." : "Последнее задание было выполнено {time}. Похоже, что-то не в порядке.", "Last job ran {relativeTime}." : "Последнее задание было запущено {relativeTime}.", @@ -416,6 +449,7 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run {command}" : "Необходимо выполнить перенос ключей из старого механизма шифрования (ownCloud <= 8.0) в новый. Для выполнения переноса активируйте приложение «Модуль шифрования по умолчанию» и запустите команду «{command}»", "Unable to update server side encryption config" : "Не удалось обновить параметры шифрования на стороне сервера", "Please confirm the group removal" : "Подтвердите удаление группы", + "You are about to remove the group \"{group}\". The accounts will NOT be deleted." : "Группа «{group}» будет удалена. Это действие НЕ ПРИВОДИТ к удалению учётных записей, входящих в эту группу.", "Cancel" : "Отмена", "Confirm" : "Подтвердить", "Submit" : "Отправить ответ", @@ -440,6 +474,8 @@ "Error saving profile picture" : "Не удалось сохранить изображение профиля", "Error removing profile picture" : "Не удалось очистить изображения профиля", "Your biography" : "Ваша биография", + "Enter your date of birth" : "Введите дату своего рождения", + "Unable to update date of birth" : "Не удалось обновить дату рождения", "You are a member of the following groups:" : "Вы являетесь участником следующих групп:", "You are using <strong>{usage}</strong>" : "Вы используете <strong>{usage}</strong>", "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Вы используете <strong>{usage}</strong> из <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)", @@ -477,6 +513,7 @@ "The more restrictive setting of either visibility or scope is respected on your Profile. For example, if visibility is set to \"Show to everyone\" and scope is set to \"Private\", \"Private\" is respected." : "В профиле устанавливаются более строгие настройки видимости или области действия. Например, если для видимости установлено значение «Видно всем», а для области действия установлено значение «Скрыто», будет использоваться значение «Скрыто».", "Unable to update visibility of {displayId}" : "Не удалось изменить видимость {displayId}", "Your role" : "Ваша роль", + "Your X (formerly Twitter) handle" : "Ваше имя в сети X (ранее — Твиттер)", "Your website" : "Ваш сайт", "No {property} set" : "Свойство «{property}» не задано", "Invalid value" : "Недопустимое значение", @@ -504,26 +541,39 @@ "Email (required)" : "Эл. почта (обязательно)", "Email" : "Адрес эл. почты", "Groups (required)" : "Группы (обязательно)", + "Set account groups" : "Выбрать группы учётной записи", "Administered groups" : "Администрируемые группы", "Quota" : "Квота", + "Set account quota" : "Задать квоту для учётной записи", "Language" : "Язык", "Set default language" : "Выбрать язык по умолчанию", + "Add new account" : "Создать учётную запись", "Manager" : "Руководитель", + "Set account manager" : "Выбрать руководителя учётной записи", + "Account name will be autogenerated" : "Имя учётной записи будет создано автоматически", + "Account name (required)" : "Имя учётной записи (обязательно)", "Total rows summary" : "Количество строк в общем", "Scroll to load more rows" : "Прокрутите, чтобы загрузить больше строк", + "_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} учётная запись…","{userCount} учётных записи…","{userCount} учётных записей…","{userCount} учётных записи…"], + "_{userCount} account_::_{userCount} accounts_" : ["{userCount} учётная запись","{userCount} учётныt записи","{userCount} учётных записей","{userCount} учётные записи"], "Avatar" : "Аватар", + "Account name" : "Имя учётной записи", "Group admin for" : "Администратор групп", + "Account backend" : "Механизм учёта", "Storage location" : "Расположение хранилища", "Last login" : "Последний вход", "Account actions" : "Действия над аккаунтом", "Password or insufficient permissions message" : "Сообщение о пароле или недостаточных разрешениях", + "Loading account …" : "Загрузка сведений об учётной записи…", "Change display name" : "Изменить отображаемое имя", "Set new password" : "Установить новый пароль", "You do not have permissions to see the details of this account" : "У вас нет прав на просмотр данных этой учётной записи", "Set new email address" : "Установить новый адрес эл. почты", "Add account to group" : "Добавить учётную запись в группу", "Set account as admin for" : "Назначить администратором", + "Select account quota" : "Выбор квоты для учётной записи", "Set the language" : "Выбрать язык", + "Set line manager" : "Выбрать руководителя", "{size} used" : "использовано {size}", "Delete account" : "Удалить учётную запись", "Disconnect all devices and delete local data" : "Отключить все устройства и удалить локальные данные", @@ -546,6 +596,7 @@ "Account management settings" : "Параметры управления учётными записями", "Visibility" : "Видимость", "Show language" : "Показывать язык", + "Show account backend" : "Показать механизм учёта", "Show storage path" : "Путь хранилища", "Show last login" : "Время последнего входа в систему", "Sorting" : "Сортировка", @@ -553,6 +604,7 @@ "By member count" : "По количеству участников", "By name" : "По имени", "Send email" : "Отправить сообщение", + "Send welcome email to new accounts" : "Отправлять приветственное электронное письмо новым пользователям", "Defaults" : "Значения по умолчанию", "Default quota" : "Квота по умолчанию", "Select default quota" : "Квота по умолчанию", @@ -598,9 +650,12 @@ "X (formerly Twitter)" : "X (ранее Твиттер)", "Fediverse (e.g. Mastodon)" : "Федерации (например, Mastodon)", "Website" : "Адрес сайта", + "Date of birth" : "Дата рождения", "Profile visibility" : "Видимость профиля", "Locale" : "Региональные стандарты", "Not available as this property is required for core functionality including file sharing and calendar invitations" : "Заданный параметр не может быть использован, так как его используют основные функции, такие как совместный доступ к файлам и приглашения к событиям из календаря", + "Not available as federation has been disabled for your account, contact your system administration if you have any questions" : "Недоступно, так как федерация отключена для вашей учетной записи. Если у вас есть какие-либо вопросы, обратитесь к системному администратору.", + "Not available as publishing account specific data to the lookup server is not allowed, contact your system administration if you have any questions" : "Недоступно, так как публикация пользовательских данных на сервере поиска запрещена. Обратитесь к системному администратору, если у вас возникнут какие-либо вопросы.", "Discover" : "Центр приложений", "Your apps" : "Ваши приложения", "Active apps" : "Активные приложения", @@ -610,23 +665,31 @@ "Featured apps" : "Рекомендуемые приложения", "Supported apps" : "Поддерживаемые приложения", "Show to everyone" : "Для всех", + "Show to logged in accounts only" : "Только для вошедших в систему", "Hide" : "Скрыт", "Download and enable" : "Скачать и включить", "Allow untested app" : "Разрешить непроверенное приложение", "The app will be downloaded from the App Store" : "Приложение будет скачано из магазина приложений", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Это приложение не отмечено как совместимое с вашей версией Nextcloud. Если вы продолжите, вы сможете установить это приложение, однако оно может работать не так, как ожидается.", "Never" : "Никогда", + "Could not register device: Network error" : "Не удалось зарегистрировать устройство: ошибка сети", + "Could not register device: Probably already registered" : "Не удалось зарегистрировать устройство: возможно, это устройство уже зарегистрировано", + "Could not register device" : "Не удалось зарегистрировать устройство", "An error occurred during the request. Unable to proceed." : "Во время запроса произошла ошибка. Продолжение невозможно.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Приложение было включено, но нуждается в обновлении. В течении 5 секунд будет выполнено перенаправление на страницу обновления.", "Error: This app cannot be enabled because it makes the server unstable" : "Ошибка: это приложение не может быть включено, так как оно сделает сервер нестабильным", "Do you really want to wipe your data from this device?" : "Действительно удалить свои данные с этого устройства?", "Confirm wipe" : "Подтверждение удаления данных", + "Could not delete the app token" : "Не удалось удалить токен приложения", "Error while wiping the device with the token" : "Ошибка при очистке устройства с данным токеном", "Error while updating device token name" : "Ошибка при обновлении имени токена устройства", "Error while updating device token scope" : "Ошибка при обновлении разрешений токена устройства", + "Could not set group sorting" : "Не удалось настроить сортировку групп", "There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Превышено количество запросов из вашей сети. Попробуйте позднее или сообщите администратору об этой ошибке.", "Administration documentation" : "Документация администратора", "Forum" : "Форум", + "Nextcloud help & privacy resources" : "Справочные ресурсы Nexcloud и руководства по безопасности", + "General documentation" : "Основная документация", "Legal notice" : "Официальное уведомление", "Privacy policy" : "Политика конфиденциальности", "None/STARTTLS" : "Без шифрования/STARTTLS", @@ -642,6 +705,7 @@ "Authentication" : "Аутентификация", "Authentication required" : "Требуется аутентификация ", "Credentials" : "Учётные данные", + "SMTP Login" : "Ипя пользователя SMTP", "SMTP Password" : "Пароль SMTP", "Save" : "Сохранить", "Test and verify email settings" : "Проверить параметры эл. почты", @@ -771,10 +835,14 @@ "Old user imported certificates" : "Сертификаты, импортированные старым пользователем", "Missing optional index \"%s\" in table \"%s\"." : "В таблице «%s» отсутствует необязательный индекс «%s».", "The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running \"occ db:add-missing-indices\" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster." : "В базе данных отсутствуют некоторые индексы. Так как создание таких индексов может занять достаточно продолжительное время, оно должно быть запущено вручную. Для создания индексов необходимо запустить команду «occ db:add-missing-indices» во время работы сервера Nextcloud. При созданных индексах, как правило, запросы к базе данных выполняются значительно быстрее.", + "Could not check for JavaScript support. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "Не удалось проверить, поддерживается ли JavaScript. Внесите исправления или подтвердите, обрабатывает ли веб-сервер файлы *.mjs, основываясь на MIME-типах.", + "MySQL unicode support" : "Поддержка стандарта кодирования Юникод в MySQL", + "Overwrite cli URL" : "Перезапись адреса интерфейса командной строки", "You are currently running PHP %s. PHP 8.0 is now deprecated in Nextcloud 27. Nextcloud 28 may require at least PHP 8.1. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "В настоящее время вы используете PHP %s. PHP 8.0 больше не поддерживается в Nextcloud 27. Для Nextcloud 28 может потребоваться как минимум PHP 8.1. Пожалуйста, как можно скорее обновитесь до одной из официально поддерживаемых версий PHP, предоставленных PHP Group.", + "Rating: {score}/10" : "Оценка: {score}/10", "You are about to remove the group \"{group}\". The users will NOT be deleted." : "Группа \"{group}\" будет удалена. Пользователи НЕ будут удалены.", "No users" : "Нет пользователей", - "Loading users …" : "Загрузка пользователей …", + "Loading users …" : "Загрузка пользователей…", "List of users. This list is not fully rendered for performance reasons. The users will be rendered as you navigate through the list." : "Список пользователей. Этот список отображен не полностью по соображениям производительности. Пользователи будут отображаться по мере того, как Вы будете перемещаться по списку.", "Set user groups" : "Задать группы пользователя", "Set user as admin for …" : "Назначить пользователя администратором для ...", @@ -790,6 +858,9 @@ "Failed to update user manager" : "Не удалось обновить диспетчер пользователей", "User management settings" : "Настройки управления пользователями", "Send welcome email to new users" : "Отправлять приветственное электронное письмо новым пользователям", - "Creating group …" : "Создание группы…" + "User management" : "Управление пользователями", + "Creating group …" : "Создание группы…", + "User group: {group}" : "Группа пользователя: {group}", + "Nextcloud help resources" : "Справочные ресурсы Nextcloud" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/apps/settings/l10n/sk.js b/apps/settings/l10n/sk.js index 8d37c2705d8..ff8a4bd0b72 100644 --- a/apps/settings/l10n/sk.js +++ b/apps/settings/l10n/sk.js @@ -698,7 +698,7 @@ OC.L10N.register( "Could not register device: Network error" : "Zariadenie sa nepodarilo zaregistrovať: Chyba siete", "Could not register device: Probably already registered" : "Zariadenie sa nepodarilo zaregistrovať: Pravdepodobne je už zaregistrované", "Could not register device" : "Zariadenie sa nepodarilo zaregistrovať", - "An error occurred during the request. Unable to proceed." : "Počas vykonania požiadavky nastala chyba. Nie je možné pokračovať.", + "An error occurred during the request. Unable to proceed." : "Počas vybavovania požiadavky nastala chyba. Nie je možné pokračovať.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikácia bola povolená, ale vyžaduje sa aktualizácia. Presmerovanie na stránku aktualizácie o 5 sekúnd.", "Error: This app cannot be enabled because it makes the server unstable" : "Chyba: aplikáciu nie je možné povoliť, lebo naruší stabilitu servera", "Do you really want to wipe your data from this device?" : "Naozaj chcete vymazať svoje údaje z tohto zariadenia?", diff --git a/apps/settings/l10n/sk.json b/apps/settings/l10n/sk.json index d6f118208dc..7b431a90560 100644 --- a/apps/settings/l10n/sk.json +++ b/apps/settings/l10n/sk.json @@ -696,7 +696,7 @@ "Could not register device: Network error" : "Zariadenie sa nepodarilo zaregistrovať: Chyba siete", "Could not register device: Probably already registered" : "Zariadenie sa nepodarilo zaregistrovať: Pravdepodobne je už zaregistrované", "Could not register device" : "Zariadenie sa nepodarilo zaregistrovať", - "An error occurred during the request. Unable to proceed." : "Počas vykonania požiadavky nastala chyba. Nie je možné pokračovať.", + "An error occurred during the request. Unable to proceed." : "Počas vybavovania požiadavky nastala chyba. Nie je možné pokračovať.", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikácia bola povolená, ale vyžaduje sa aktualizácia. Presmerovanie na stránku aktualizácie o 5 sekúnd.", "Error: This app cannot be enabled because it makes the server unstable" : "Chyba: aplikáciu nie je možné povoliť, lebo naruší stabilitu servera", "Do you really want to wipe your data from this device?" : "Naozaj chcete vymazať svoje údaje z tohto zariadenia?", diff --git a/apps/settings/l10n/tr.js b/apps/settings/l10n/tr.js index d1e658fb201..6eb210d733b 100644 --- a/apps/settings/l10n/tr.js +++ b/apps/settings/l10n/tr.js @@ -130,6 +130,7 @@ OC.L10N.register( "Your remote address could not be determined." : "Uzak adresiniz belirlenemedi.", "Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Uzak adresiniz \"%s\" olarak belirlendi ve şu anda çeşitli isteklerin yerine getirilmesini yavaşlatacak şekilde kaba kuvvet saldırısı nedeniyle kısıtlanıyor. Uzak adres sizin adresiniz değilse bu, vekil sunucusunun doğru şekilde yapılandırılmadığını gösteriyor olabilir.", "Your remote address \"%s\" is not brute-force throttled." : "\"%s\" uzak adresinize kaba kuvvet sınırlaması uygulanmıyor.", + "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir.", "Old administration imported certificates" : "Eski yönetimin içe aktarılmış sertifikaları", "A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Yönetim tarafından içe aktarılmış SSL sertifikalarını denetleyen bir arka plan görevi bekliyor. Lütfen bir süre sonra yeniden denetleyin.", "There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Yönetim tarafından içe aktarılmış ancak artık Nextcloud 21 ile kullanılmayan bazı SSL sertifikaları var. Bunlar, komut satırından \"occ security:certificates:import\" komutu ile içe aktarılabilir. Veri klasörü içindeki yollarını aşağıda görebilirsiniz.", @@ -150,6 +151,9 @@ OC.L10N.register( "Missing optional column \"%s\" in table \"%s\"." : "İsteğe bağlı \"%s\" sütunu \"%s\" tablosunda eksik.", "The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running \"occ db:add-missing-columns\" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability." : "Veri tabanında bazı isteğe bağlı sütunlar eksik. Büyük tablolara sütunların eklenmesi uzun sürebildiğinden, sütunlar isteğe bağlı olduğunda bu işlem otomatik olarak yapılmaz. Sunucunuz normal çalışırken eksik sütunları el ile eklemek için \"occ db:add-missing-columns\" komutunu yürütün. Sütunlar eklendikten sonra bazı özelliklerin yanıtı ya da kullanımı daha iyileşebilir.", "Database missing indices" : "Veri tabanında dizinler eksik", + "Missing indices:" : "Dizinler eksik:", + "\"%s\" in table \"%s\"" : "\"%s\", \"%s\" tablosunda", + "Detected some missing optional indices. Occasionally new indices are added (by Nextcloud or installed applications) to improve database performance. Adding indices can sometimes take awhile and temporarily hurt performance so this is not done automatically during upgrades. Once the indices are added, queries to those tables should be faster. Use the command `occ db:add-missing-indices` to add them. " : "İsteğe bağlı bazı dizinlerin eksik olduğu bulundu. Bazen veri tabanı başarımını iyileştirmek için yeni dizinler eklenir (Nextcloud veya kurulmuş uygulamalar tarafından). Dizinleri eklemek bazen biraz zaman alabilir ve başarımı geçici olarak düşürebilir, bu nedenle yükseltmeler sırasında bu işlem otomatik olarak yapılmaz. Dizinler eklendikten sonra, bu tablolara yapılan sorguların daha hızlı olması beklenir. Bunları eklemek için `occ db:add-missing-indices` komutunu kullanın.", "Database missing primary keys" : "Veri tabanında birincil anahtarlar eksik", "Missing primary key on table \"%s\"." : "\"%s\" tablosunda birincil dizin anahtarı eksik.", "The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running \"occ db:add-missing-primary-keys\" those missing primary keys could be added manually while the instance keeps running." : "Veri tabanında bazı birincil dizin anahtarları eksik. Büyük tablolara birincil anahtarların eklenmesi uzun sürebildiğinden bu işlem otomatik olarak yapılmaz. Sunucunuz normal çalışırken eksik birincil anahtarları el ile eklemek için \"occ db:add-missing-primary-keys\" komutunu yürütün.", @@ -175,11 +179,14 @@ OC.L10N.register( "HTTPS access and URLs" : "HTTPS erişimi ve adresleri", "Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead. Without it some important web functionality like \"copy to clipboard\" or \"service workers\" will not work!" : "Siteye HTTP üzerinden güvenli olmayan bağlantı ile erişiliyor. Sunucunuzu HTTPS kullanacak şekilde yapılandırmanız önemle önerilir. HTTPS olmadan \"panoya kopyala\" ya da \"hizmet işlemleri\" gibi bazı önemli internet işlevleri çalışmaz.", "Accessing site insecurely via HTTP." : "Siteye güvenli olmayan HTTP ile erişiyorsunuz", + "You are accessing your instance over a secure connection, however your instance is generating insecure URLs. This likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Kopyanıza güvenli bir bağlantı üzerinden erişiyorsunuz. Bununla birlikte kopyanız güvenli olmayan adresler üretiyor. Bu durum genellikle bir ters vekil sunucunun arkasında bulunmanızdan ve Nextcloud `overwrite*` yapılandırma değerlerinin doğru olarak ayarlanmamış olmasından kaynaklanır.", + "Your instance is generating insecure URLs. If you access your instance over HTTPS, this likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Kopyanız güvenli olmayan adresler üretiyor. Kopyanıza HTTPS üzerinden erişiyorsanız, bu durum genellikle bir ters vekil sunucunun arkasında bulunmanızdan ve Nextcloud `overwrite*` yapılandırma değerlerinin doğru olarak ayarlanmamış olmasından kaynaklanır.", "You are accessing your instance over a secure connection, and your instance is generating secure URLs." : "Kopyanıza güvenli bir bağlantı üzerinden erişiyorsunuz ve kopyanız güvenli adresler oluşturuyor.", "Internet connectivity" : "İnternet bağlantısı", "Internet connectivity is disabled in configuration file." : "İnternet bağlantısı yapılandırma dosyasından devre dışı bırakılmış.", "This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Bu sunucunun çalışan bir İnternet bağlantısı yok. Birden çok uç noktaya erişilemez. Bu durumda dış depolama alanı bağlama, güncelleme bildirimleri ya da üçüncü taraf uygulamalarını kurmak gibi bazı özellikler çalışmaz. Dosyalara uzaktan erişim ve bildirim e-postalarının gönderilmesi işlemleri de yapılamaz. Tüm bu özelliklerin kullanılabilmesi için sunucuyu İnternet üzerine bağlamanız önerilir.", "JavaScript modules support" : "JavaScript modülleri desteği", + "Unable to run check for JavaScript support. Please remedy or confirm manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "JavaScript desteği denetlenemedi. Lütfen site sunucunuzun JavaScript MIME türünü kullanarak `.mjs` dosyalarını sunup sunmadığını el ile denetleyin.", "Your webserver does not serve `.mjs` files using the JavaScript MIME type. This will break some apps by preventing browsers from executing the JavaScript files. You should configure your webserver to serve `.mjs` files with either the `text/javascript` or `application/javascript` MIME type." : "Site sunucunuz, JavaScript MIME türünü kullanan `.mjs` dosyaları sunmuyor. Bu durum, tarayıcıların JavaScript dosyalarını yürütmesini engelleyerek bazı uygulamaların bozulmasına neden olur. Site sunucunuzu, 'text/javascript' veya 'application/javascript' MIME türüyle '.mjs' dosyalarını sunacak şekilde yapılandırmanız gerekir.", "JavaScript source map support" : "JavaScript kaynak haritası desteği", "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "Site sunucunuz `.js.map` dosyalarını sunacak şekilde ayarlanmamış. Bu dosyalar olmadan, JavaScript kaynak haritaları düzgün çalışmaz. Bu durum ortaya çıkabilecek sorunların giderilmesini ve hata ayıklamasını zorlaştırır.", @@ -190,6 +197,8 @@ OC.L10N.register( "Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks." : "Sunucuda yapılandırılmış bir bakım aralığı başlangıç zamanı yok. Bu durum, yoğun kaynak kullanan günlük arka plan işlerinin de asıl kullanım süreniz boyunca yapılacağı anlamına gelir. Kullanıcıların bu ağır görevlerin neden olduğu yükten daha az etkilenmesi için bu zamanı düşük kaynak kullanılan zamana ayarlamanızı öneririz.", "Maintenance window to execute heavy background jobs is between {start}:00 UTC and {end}:00 UTC" : "Ağır arka plan işlerini yapmak için bakım aralığı {start}:00 UTC ile {end}:00 UTC arasındadır", "Memcache" : "Memcache", + "Memcached is configured as distributed cache, but the wrong PHP module (\"memcache\") is installed. Please install the PHP module \"memcached\"." : "Memcached dağıtılmış ön bellek olarak yapılandırılmış, ancak yanlış PHP modülü (\"memcache\") kurulmuş. Lütfen \"memcached\" PHP modülünü yükleyin.", + "Memcached is configured as distributed cache, but the PHP module \"memcached\" is not installed. Please install the PHP module \"memcached\"." : "Memcached dağıtılmış önbellek olarak yapılandırılmış, ancak \"memcached\" PHP modülü kurulmamış. Lütfen \"memcached\" PHP modülünü yükleyin.", "No memory cache has been configured. To enhance performance, please configure a memcache, if available." : "Herhangi bir bellek ön belleği yapılandırılmamış. Başarımı artırmak için varsa lütfen bir memcache yapılandırın.", "Configured" : "Yapılandırılmış", "MySQL Unicode support" : "MySQL Unikod desteği", @@ -250,6 +259,9 @@ OC.L10N.register( "Configuration file access rights" : "Yapılandırma dosyasının erişim izinleri", "The read-only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Salt okunur yapılandırma etkinleştirilmiş. Bu yapılandırma, bazı ayarların site arayüzünden yapılmasını önler. Ayrıca, bu dosyanın her güncelleme öncesinde el ile yazılabilir yapılması gerekir.", "Nextcloud configuration file is writable" : "Nextcloud yapılandırma dosyası yazılabilir", + "Scheduling objects table size" : "Zamanlama nesneler tablosu boyutu", + "You have more than 500 000 rows in the scheduling objects table. Please run the expensive repair jobs via occ maintenance:repair --include-expensive" : "Zamanlama nesneleri tablosunda 500.000 üzerinde satır var. Lütfen büyük onarım işlerini occ maintenance:repair --include-expensive komutu ile yapın", + "Scheduling objects table size is within acceptable range." : "Zamanlama nesneleri tablosunun boyutu kabul edilebilir aralıkta.", "HTTP headers" : "HTTP üst bilgileri", "- The `%1$s` HTTP header is not set to `%2$s`. Some features might not work correctly, as it is recommended to adjust this setting accordingly." : "`%1$s` HTTP üst bilgisi `%2$s` şeklinde ayarlanmamış. Bu durum bazı özelliklerin düzgün çalışmasını engelleyebileceğinden bu ayarın belirtildiği gibi yapılması önerilir.", "- The `%1$s` HTTP header is not set to `%2$s`. This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "`%1$s` HTTP üst bilgisi `%2$s` şeklinde ayarlanmamış. Bu durum olası bir güvenlik ya da gizlilik riski oluşturduğundan bu ayarın belirtildiği gibi yapılması önerilir.", @@ -263,6 +275,9 @@ OC.L10N.register( "Could not check that your web server serves security headers correctly, unable to query `%s`" : "Site sunucunuzun güvenlik üst bilgilerini doğru şekilde sunup sunmadığı denetlenemedi. `%s` sorgulanamadı.", "Your server is correctly configured to send security headers." : "Sunucunuz, güvenlik üst bilgilerini göndermek üzere doğru şekilde yapılandırılmış.", "Database version" : "Veri tabanı sürümü", + "MariaDB version \"%s\" detected. MariaDB >=10.3 and <=10.11 is suggested for best performance, stability and functionality with this version of Nextcloud." : "MariaDB \"%s\" sürümü bulundu. Bu Nextcloud sürümüyle en iyi başarım, kararlılık ve işlevsellik sağlamak için MariaDB sürümünün 10.3 ile 10.11 arasında olması önerilir.", + "MySQL version \"%s\" detected. MySQL >=8.0 and <=8.3 is suggested for best performance, stability and functionality with this version of Nextcloud." : "MySQL \"%s\" sürümü bulundu. Bu Nextcloud sürümüyle en iyi başarım, kararlılık ve işlevsellik sağlamak için MySQL sürümünün 8.0 ile 8.3 arasında olması önerilir.", + "PostgreSQL version \"%s\" detected. PostgreSQL >=12 and <=16 is suggested for best performance, stability and functionality with this version of Nextcloud." : "PostgreSQL \"%s\" sürümü bulundu. Bu Nextcloud sürümüyle en iyi başarım, kararlılık ve işlevsellik sağlamak için PostgreSQL sürümünün 12 ile 16 arasında olması önerilir.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend. This is particularly recommended when using the desktop client for file synchronisation. To migrate to another database use the command line tool: \"occ db:convert-type\"." : "Şu anda arka uç veri tabanı olarak SQLite kullanılıyor. Daha büyük kurulumlar için farklı bir veri tabanı arka ucuna geçmenizi öneririz. Bu özellikle dosya eşitlemesi için masaüstü istemcisini kullanırken önerilir. Başka bir veri tabanına geçmek için komut satırı aracını kullanın: \"occ db:convert-type\".", "Unknown database platform" : "Veri tabanı platformu bilinmiyor", "Architecture" : "Mimari", @@ -334,7 +349,10 @@ OC.L10N.register( "Set default expiration date for shares via link or mail" : "Bağlantı ya da e-posta ile yapılan paylaşımlar için varsayılan geçerlilik sonu tarihini ayarlansın", "Default expiration time of shares in days" : "Paylaşımların gün olarak varsayılan geçerlilik süresi", "Privacy settings for sharing" : "Paylaşım için gizlilik ayarı", + "Allow account name autocompletion in share dialog and allow access to the system address book" : "Paylaşım penceresinde hesap adının otomatik tamamlanmasına ve sistem adres defterine erişilmesine izin verilsin", "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "\"Aynı grup\" ve \"telefon numarası bütünleştirmesi\" etkinleştirilmiş ise. Kullanıcının görüntülenmesi için ikisinden birinde eşleşme olması yeterlidir.", + "Allow account name autocompletion to users within the same groups and limit system address books to users in the same groups" : "Aynı gruplarda hesap adının otomatik olarak tamamlanmasına izin verilsin ve sistem adres defterleri aynı gruplardaki kullanıcılarla sınırlansın", + "Allow account name autocompletion to users based on phone number integration" : "Telefon numarası bütünleştirmesi eşleşmelerine göre hesap adları otomatik olarak tamamlanabilsin", "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Tam ad ya da e-posta adresi yazılırken otomatik olarak tamamlanabilsin (aynı grupta olma ya da telefon defteri eşleşmesi yok sayılarak)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Herkese açık bağlantı yükleme sayfasında sorumluluk reddi bildirimi görüntülensin (yalnızca dosya listesi gizli iken görüntülenir)", "Disclaimer text" : "Sorumluluk reddi metni", @@ -506,6 +524,8 @@ OC.L10N.register( "Error saving profile picture" : "Profil görseli kaydediliirken sorun çıktı", "Error removing profile picture" : "Profil görseli kaldırılırken sorun çıktı", "Your biography" : "Özgeçmişiniz", + "Enter your date of birth" : "Doğum tarihinizi yazın", + "Unable to update date of birth" : "Doğum tarihi güncellenemedi", "You are a member of the following groups:" : "Şu gruplara üyesiniz:", "You are using <strong>{usage}</strong>" : "<strong>{usage}</strong> kullanıyorsunuz", "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "<strong>{usage}</strong> / <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>) kullanıyorsunuz", @@ -572,16 +592,26 @@ OC.L10N.register( "Email (required)" : "E-posta adresi (zorunlu)", "Email" : "E-posta", "Groups (required)" : "Gruplar (zorunlu)", + "Set account groups" : "Hesap gruplarını ayarla", "Administered groups" : "Yönetilen gruplar", + "Set account as admin for …" : "Hesabı şunun yöneticisi olarak ayarla…", "Quota" : "Kota", + "Set account quota" : "Hesap kotasını ayarla", "Language" : "Dil", "Set default language" : "Varsayılan dili ayarla", + "Add new account" : "Yeni hesap ekle", "Manager" : "Yönetici", + "Set account manager" : "Hesap yönetici olarak ayarla", + "Account name will be autogenerated" : "Hesap adı otomatik olarak oluşturulacak", + "Account name (required)" : "Hesap adı (zorunlu)", "Total rows summary" : "Toplam satır özeti", "Scroll to load more rows" : "Diğer satırları görüntülemek için aşağı kaydırın", + "_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} hesap…","{userCount} hesap…"], + "_{userCount} account_::_{userCount} accounts_" : ["{userCount} hesap","{userCount} hesap"], "Avatar" : "Avatar", "Account name" : "Hesap adı", "Group admin for" : "Şunun grup yöneticisi", + "Account backend" : "Hesap arka ucu", "Storage location" : "Depolama konumu", "Last login" : "Son oturum açma", "Account actions" : "Hesap işlemleri", @@ -675,6 +705,7 @@ OC.L10N.register( "X (formerly Twitter)" : "X (eski Twitter)", "Fediverse (e.g. Mastodon)" : "Fediverse (Mastodon gibi)", "Website" : "Site", + "Date of birth" : "Doğum tarihi", "Profile visibility" : "Profil görünürlüğü", "Locale" : "Yerel Ayar", "Not available as this property is required for core functionality including file sharing and calendar invitations" : "Bu özellik, dosya paylaşımı ve takvim davetleri gibi temel işlevler için gerekli olduğundan kullanılamıyor", diff --git a/apps/settings/l10n/tr.json b/apps/settings/l10n/tr.json index fa913177ac4..29b04448002 100644 --- a/apps/settings/l10n/tr.json +++ b/apps/settings/l10n/tr.json @@ -128,6 +128,7 @@ "Your remote address could not be determined." : "Uzak adresiniz belirlenemedi.", "Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Uzak adresiniz \"%s\" olarak belirlendi ve şu anda çeşitli isteklerin yerine getirilmesini yavaşlatacak şekilde kaba kuvvet saldırısı nedeniyle kısıtlanıyor. Uzak adres sizin adresiniz değilse bu, vekil sunucusunun doğru şekilde yapılandırılmadığını gösteriyor olabilir.", "Your remote address \"%s\" is not brute-force throttled." : "\"%s\" uzak adresinize kaba kuvvet sınırlaması uygulanmıyor.", + "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir.", "Old administration imported certificates" : "Eski yönetimin içe aktarılmış sertifikaları", "A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Yönetim tarafından içe aktarılmış SSL sertifikalarını denetleyen bir arka plan görevi bekliyor. Lütfen bir süre sonra yeniden denetleyin.", "There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Yönetim tarafından içe aktarılmış ancak artık Nextcloud 21 ile kullanılmayan bazı SSL sertifikaları var. Bunlar, komut satırından \"occ security:certificates:import\" komutu ile içe aktarılabilir. Veri klasörü içindeki yollarını aşağıda görebilirsiniz.", @@ -148,6 +149,9 @@ "Missing optional column \"%s\" in table \"%s\"." : "İsteğe bağlı \"%s\" sütunu \"%s\" tablosunda eksik.", "The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running \"occ db:add-missing-columns\" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability." : "Veri tabanında bazı isteğe bağlı sütunlar eksik. Büyük tablolara sütunların eklenmesi uzun sürebildiğinden, sütunlar isteğe bağlı olduğunda bu işlem otomatik olarak yapılmaz. Sunucunuz normal çalışırken eksik sütunları el ile eklemek için \"occ db:add-missing-columns\" komutunu yürütün. Sütunlar eklendikten sonra bazı özelliklerin yanıtı ya da kullanımı daha iyileşebilir.", "Database missing indices" : "Veri tabanında dizinler eksik", + "Missing indices:" : "Dizinler eksik:", + "\"%s\" in table \"%s\"" : "\"%s\", \"%s\" tablosunda", + "Detected some missing optional indices. Occasionally new indices are added (by Nextcloud or installed applications) to improve database performance. Adding indices can sometimes take awhile and temporarily hurt performance so this is not done automatically during upgrades. Once the indices are added, queries to those tables should be faster. Use the command `occ db:add-missing-indices` to add them. " : "İsteğe bağlı bazı dizinlerin eksik olduğu bulundu. Bazen veri tabanı başarımını iyileştirmek için yeni dizinler eklenir (Nextcloud veya kurulmuş uygulamalar tarafından). Dizinleri eklemek bazen biraz zaman alabilir ve başarımı geçici olarak düşürebilir, bu nedenle yükseltmeler sırasında bu işlem otomatik olarak yapılmaz. Dizinler eklendikten sonra, bu tablolara yapılan sorguların daha hızlı olması beklenir. Bunları eklemek için `occ db:add-missing-indices` komutunu kullanın.", "Database missing primary keys" : "Veri tabanında birincil anahtarlar eksik", "Missing primary key on table \"%s\"." : "\"%s\" tablosunda birincil dizin anahtarı eksik.", "The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running \"occ db:add-missing-primary-keys\" those missing primary keys could be added manually while the instance keeps running." : "Veri tabanında bazı birincil dizin anahtarları eksik. Büyük tablolara birincil anahtarların eklenmesi uzun sürebildiğinden bu işlem otomatik olarak yapılmaz. Sunucunuz normal çalışırken eksik birincil anahtarları el ile eklemek için \"occ db:add-missing-primary-keys\" komutunu yürütün.", @@ -173,11 +177,14 @@ "HTTPS access and URLs" : "HTTPS erişimi ve adresleri", "Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead. Without it some important web functionality like \"copy to clipboard\" or \"service workers\" will not work!" : "Siteye HTTP üzerinden güvenli olmayan bağlantı ile erişiliyor. Sunucunuzu HTTPS kullanacak şekilde yapılandırmanız önemle önerilir. HTTPS olmadan \"panoya kopyala\" ya da \"hizmet işlemleri\" gibi bazı önemli internet işlevleri çalışmaz.", "Accessing site insecurely via HTTP." : "Siteye güvenli olmayan HTTP ile erişiyorsunuz", + "You are accessing your instance over a secure connection, however your instance is generating insecure URLs. This likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Kopyanıza güvenli bir bağlantı üzerinden erişiyorsunuz. Bununla birlikte kopyanız güvenli olmayan adresler üretiyor. Bu durum genellikle bir ters vekil sunucunun arkasında bulunmanızdan ve Nextcloud `overwrite*` yapılandırma değerlerinin doğru olarak ayarlanmamış olmasından kaynaklanır.", + "Your instance is generating insecure URLs. If you access your instance over HTTPS, this likely means that your instance is behind a reverse proxy and the Nextcloud `overwrite*` config values are not set correctly." : "Kopyanız güvenli olmayan adresler üretiyor. Kopyanıza HTTPS üzerinden erişiyorsanız, bu durum genellikle bir ters vekil sunucunun arkasında bulunmanızdan ve Nextcloud `overwrite*` yapılandırma değerlerinin doğru olarak ayarlanmamış olmasından kaynaklanır.", "You are accessing your instance over a secure connection, and your instance is generating secure URLs." : "Kopyanıza güvenli bir bağlantı üzerinden erişiyorsunuz ve kopyanız güvenli adresler oluşturuyor.", "Internet connectivity" : "İnternet bağlantısı", "Internet connectivity is disabled in configuration file." : "İnternet bağlantısı yapılandırma dosyasından devre dışı bırakılmış.", "This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Bu sunucunun çalışan bir İnternet bağlantısı yok. Birden çok uç noktaya erişilemez. Bu durumda dış depolama alanı bağlama, güncelleme bildirimleri ya da üçüncü taraf uygulamalarını kurmak gibi bazı özellikler çalışmaz. Dosyalara uzaktan erişim ve bildirim e-postalarının gönderilmesi işlemleri de yapılamaz. Tüm bu özelliklerin kullanılabilmesi için sunucuyu İnternet üzerine bağlamanız önerilir.", "JavaScript modules support" : "JavaScript modülleri desteği", + "Unable to run check for JavaScript support. Please remedy or confirm manually if your webserver serves `.mjs` files using the JavaScript MIME type." : "JavaScript desteği denetlenemedi. Lütfen site sunucunuzun JavaScript MIME türünü kullanarak `.mjs` dosyalarını sunup sunmadığını el ile denetleyin.", "Your webserver does not serve `.mjs` files using the JavaScript MIME type. This will break some apps by preventing browsers from executing the JavaScript files. You should configure your webserver to serve `.mjs` files with either the `text/javascript` or `application/javascript` MIME type." : "Site sunucunuz, JavaScript MIME türünü kullanan `.mjs` dosyaları sunmuyor. Bu durum, tarayıcıların JavaScript dosyalarını yürütmesini engelleyerek bazı uygulamaların bozulmasına neden olur. Site sunucunuzu, 'text/javascript' veya 'application/javascript' MIME türüyle '.mjs' dosyalarını sunacak şekilde yapılandırmanız gerekir.", "JavaScript source map support" : "JavaScript kaynak haritası desteği", "Your webserver is not set up to serve `.js.map` files. Without these files, JavaScript Source Maps won't function properly, making it more challenging to troubleshoot and debug any issues that may arise." : "Site sunucunuz `.js.map` dosyalarını sunacak şekilde ayarlanmamış. Bu dosyalar olmadan, JavaScript kaynak haritaları düzgün çalışmaz. Bu durum ortaya çıkabilecek sorunların giderilmesini ve hata ayıklamasını zorlaştırır.", @@ -188,6 +195,8 @@ "Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks." : "Sunucuda yapılandırılmış bir bakım aralığı başlangıç zamanı yok. Bu durum, yoğun kaynak kullanan günlük arka plan işlerinin de asıl kullanım süreniz boyunca yapılacağı anlamına gelir. Kullanıcıların bu ağır görevlerin neden olduğu yükten daha az etkilenmesi için bu zamanı düşük kaynak kullanılan zamana ayarlamanızı öneririz.", "Maintenance window to execute heavy background jobs is between {start}:00 UTC and {end}:00 UTC" : "Ağır arka plan işlerini yapmak için bakım aralığı {start}:00 UTC ile {end}:00 UTC arasındadır", "Memcache" : "Memcache", + "Memcached is configured as distributed cache, but the wrong PHP module (\"memcache\") is installed. Please install the PHP module \"memcached\"." : "Memcached dağıtılmış ön bellek olarak yapılandırılmış, ancak yanlış PHP modülü (\"memcache\") kurulmuş. Lütfen \"memcached\" PHP modülünü yükleyin.", + "Memcached is configured as distributed cache, but the PHP module \"memcached\" is not installed. Please install the PHP module \"memcached\"." : "Memcached dağıtılmış önbellek olarak yapılandırılmış, ancak \"memcached\" PHP modülü kurulmamış. Lütfen \"memcached\" PHP modülünü yükleyin.", "No memory cache has been configured. To enhance performance, please configure a memcache, if available." : "Herhangi bir bellek ön belleği yapılandırılmamış. Başarımı artırmak için varsa lütfen bir memcache yapılandırın.", "Configured" : "Yapılandırılmış", "MySQL Unicode support" : "MySQL Unikod desteği", @@ -248,6 +257,9 @@ "Configuration file access rights" : "Yapılandırma dosyasının erişim izinleri", "The read-only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Salt okunur yapılandırma etkinleştirilmiş. Bu yapılandırma, bazı ayarların site arayüzünden yapılmasını önler. Ayrıca, bu dosyanın her güncelleme öncesinde el ile yazılabilir yapılması gerekir.", "Nextcloud configuration file is writable" : "Nextcloud yapılandırma dosyası yazılabilir", + "Scheduling objects table size" : "Zamanlama nesneler tablosu boyutu", + "You have more than 500 000 rows in the scheduling objects table. Please run the expensive repair jobs via occ maintenance:repair --include-expensive" : "Zamanlama nesneleri tablosunda 500.000 üzerinde satır var. Lütfen büyük onarım işlerini occ maintenance:repair --include-expensive komutu ile yapın", + "Scheduling objects table size is within acceptable range." : "Zamanlama nesneleri tablosunun boyutu kabul edilebilir aralıkta.", "HTTP headers" : "HTTP üst bilgileri", "- The `%1$s` HTTP header is not set to `%2$s`. Some features might not work correctly, as it is recommended to adjust this setting accordingly." : "`%1$s` HTTP üst bilgisi `%2$s` şeklinde ayarlanmamış. Bu durum bazı özelliklerin düzgün çalışmasını engelleyebileceğinden bu ayarın belirtildiği gibi yapılması önerilir.", "- The `%1$s` HTTP header is not set to `%2$s`. This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "`%1$s` HTTP üst bilgisi `%2$s` şeklinde ayarlanmamış. Bu durum olası bir güvenlik ya da gizlilik riski oluşturduğundan bu ayarın belirtildiği gibi yapılması önerilir.", @@ -261,6 +273,9 @@ "Could not check that your web server serves security headers correctly, unable to query `%s`" : "Site sunucunuzun güvenlik üst bilgilerini doğru şekilde sunup sunmadığı denetlenemedi. `%s` sorgulanamadı.", "Your server is correctly configured to send security headers." : "Sunucunuz, güvenlik üst bilgilerini göndermek üzere doğru şekilde yapılandırılmış.", "Database version" : "Veri tabanı sürümü", + "MariaDB version \"%s\" detected. MariaDB >=10.3 and <=10.11 is suggested for best performance, stability and functionality with this version of Nextcloud." : "MariaDB \"%s\" sürümü bulundu. Bu Nextcloud sürümüyle en iyi başarım, kararlılık ve işlevsellik sağlamak için MariaDB sürümünün 10.3 ile 10.11 arasında olması önerilir.", + "MySQL version \"%s\" detected. MySQL >=8.0 and <=8.3 is suggested for best performance, stability and functionality with this version of Nextcloud." : "MySQL \"%s\" sürümü bulundu. Bu Nextcloud sürümüyle en iyi başarım, kararlılık ve işlevsellik sağlamak için MySQL sürümünün 8.0 ile 8.3 arasında olması önerilir.", + "PostgreSQL version \"%s\" detected. PostgreSQL >=12 and <=16 is suggested for best performance, stability and functionality with this version of Nextcloud." : "PostgreSQL \"%s\" sürümü bulundu. Bu Nextcloud sürümüyle en iyi başarım, kararlılık ve işlevsellik sağlamak için PostgreSQL sürümünün 12 ile 16 arasında olması önerilir.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend. This is particularly recommended when using the desktop client for file synchronisation. To migrate to another database use the command line tool: \"occ db:convert-type\"." : "Şu anda arka uç veri tabanı olarak SQLite kullanılıyor. Daha büyük kurulumlar için farklı bir veri tabanı arka ucuna geçmenizi öneririz. Bu özellikle dosya eşitlemesi için masaüstü istemcisini kullanırken önerilir. Başka bir veri tabanına geçmek için komut satırı aracını kullanın: \"occ db:convert-type\".", "Unknown database platform" : "Veri tabanı platformu bilinmiyor", "Architecture" : "Mimari", @@ -332,7 +347,10 @@ "Set default expiration date for shares via link or mail" : "Bağlantı ya da e-posta ile yapılan paylaşımlar için varsayılan geçerlilik sonu tarihini ayarlansın", "Default expiration time of shares in days" : "Paylaşımların gün olarak varsayılan geçerlilik süresi", "Privacy settings for sharing" : "Paylaşım için gizlilik ayarı", + "Allow account name autocompletion in share dialog and allow access to the system address book" : "Paylaşım penceresinde hesap adının otomatik tamamlanmasına ve sistem adres defterine erişilmesine izin verilsin", "If autocompletion \"same group\" and \"phone number integration\" are enabled a match in either is enough to show the user." : "\"Aynı grup\" ve \"telefon numarası bütünleştirmesi\" etkinleştirilmiş ise. Kullanıcının görüntülenmesi için ikisinden birinde eşleşme olması yeterlidir.", + "Allow account name autocompletion to users within the same groups and limit system address books to users in the same groups" : "Aynı gruplarda hesap adının otomatik olarak tamamlanmasına izin verilsin ve sistem adres defterleri aynı gruplardaki kullanıcılarla sınırlansın", + "Allow account name autocompletion to users based on phone number integration" : "Telefon numarası bütünleştirmesi eşleşmelerine göre hesap adları otomatik olarak tamamlanabilsin", "Allow autocompletion when entering the full name or email address (ignoring missing phonebook match and being in the same group)" : "Tam ad ya da e-posta adresi yazılırken otomatik olarak tamamlanabilsin (aynı grupta olma ya da telefon defteri eşleşmesi yok sayılarak)", "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Herkese açık bağlantı yükleme sayfasında sorumluluk reddi bildirimi görüntülensin (yalnızca dosya listesi gizli iken görüntülenir)", "Disclaimer text" : "Sorumluluk reddi metni", @@ -504,6 +522,8 @@ "Error saving profile picture" : "Profil görseli kaydediliirken sorun çıktı", "Error removing profile picture" : "Profil görseli kaldırılırken sorun çıktı", "Your biography" : "Özgeçmişiniz", + "Enter your date of birth" : "Doğum tarihinizi yazın", + "Unable to update date of birth" : "Doğum tarihi güncellenemedi", "You are a member of the following groups:" : "Şu gruplara üyesiniz:", "You are using <strong>{usage}</strong>" : "<strong>{usage}</strong> kullanıyorsunuz", "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "<strong>{usage}</strong> / <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>) kullanıyorsunuz", @@ -570,16 +590,26 @@ "Email (required)" : "E-posta adresi (zorunlu)", "Email" : "E-posta", "Groups (required)" : "Gruplar (zorunlu)", + "Set account groups" : "Hesap gruplarını ayarla", "Administered groups" : "Yönetilen gruplar", + "Set account as admin for …" : "Hesabı şunun yöneticisi olarak ayarla…", "Quota" : "Kota", + "Set account quota" : "Hesap kotasını ayarla", "Language" : "Dil", "Set default language" : "Varsayılan dili ayarla", + "Add new account" : "Yeni hesap ekle", "Manager" : "Yönetici", + "Set account manager" : "Hesap yönetici olarak ayarla", + "Account name will be autogenerated" : "Hesap adı otomatik olarak oluşturulacak", + "Account name (required)" : "Hesap adı (zorunlu)", "Total rows summary" : "Toplam satır özeti", "Scroll to load more rows" : "Diğer satırları görüntülemek için aşağı kaydırın", + "_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} hesap…","{userCount} hesap…"], + "_{userCount} account_::_{userCount} accounts_" : ["{userCount} hesap","{userCount} hesap"], "Avatar" : "Avatar", "Account name" : "Hesap adı", "Group admin for" : "Şunun grup yöneticisi", + "Account backend" : "Hesap arka ucu", "Storage location" : "Depolama konumu", "Last login" : "Son oturum açma", "Account actions" : "Hesap işlemleri", @@ -673,6 +703,7 @@ "X (formerly Twitter)" : "X (eski Twitter)", "Fediverse (e.g. Mastodon)" : "Fediverse (Mastodon gibi)", "Website" : "Site", + "Date of birth" : "Doğum tarihi", "Profile visibility" : "Profil görünürlüğü", "Locale" : "Yerel Ayar", "Not available as this property is required for core functionality including file sharing and calendar invitations" : "Bu özellik, dosya paylaşımı ve takvim davetleri gibi temel işlevler için gerekli olduğundan kullanılamıyor", diff --git a/apps/systemtags/l10n/it.js b/apps/systemtags/l10n/it.js index 49853312f63..70ed98e3068 100644 --- a/apps/systemtags/l10n/it.js +++ b/apps/systemtags/l10n/it.js @@ -42,6 +42,8 @@ OC.L10N.register( "All tagged %s …" : "Tutti etichettati %s …", "tagged %s" : "etichettato %s", "Collaborative tags" : "Etichette collaborative", + "Collaborative tagging functionality which shares tags among people." : "Funzionalità di etichettatura collaborativa che condivide le etichette tra le persone.", + "Collaborative tagging functionality which shares tags among people. Great for teams.\n\t(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)" : "Funzionalità di etichettatura collaborativa che condivide le etichette tra le persone. Ottima per le squadre.\n\t(Se sei un fornitore con un'installazione multi-tenant, ti consigliamo di disattivare questa applicazione poiché le etichette sono condivise.)", "Create or edit tags" : "Crea o modifica etichette", "Search for a tag to edit" : "Cerca un'etichetta da modificare", "Collaborative tags …" : "Etichette collaborative …", diff --git a/apps/systemtags/l10n/it.json b/apps/systemtags/l10n/it.json index 255241d0340..0ec84d4bbe0 100644 --- a/apps/systemtags/l10n/it.json +++ b/apps/systemtags/l10n/it.json @@ -40,6 +40,8 @@ "All tagged %s …" : "Tutti etichettati %s …", "tagged %s" : "etichettato %s", "Collaborative tags" : "Etichette collaborative", + "Collaborative tagging functionality which shares tags among people." : "Funzionalità di etichettatura collaborativa che condivide le etichette tra le persone.", + "Collaborative tagging functionality which shares tags among people. Great for teams.\n\t(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)" : "Funzionalità di etichettatura collaborativa che condivide le etichette tra le persone. Ottima per le squadre.\n\t(Se sei un fornitore con un'installazione multi-tenant, ti consigliamo di disattivare questa applicazione poiché le etichette sono condivise.)", "Create or edit tags" : "Crea o modifica etichette", "Search for a tag to edit" : "Cerca un'etichetta da modificare", "Collaborative tags …" : "Etichette collaborative …", diff --git a/apps/systemtags/lib/Search/TagSearchProvider.php b/apps/systemtags/lib/Search/TagSearchProvider.php index 8fb2475999f..fe6f5470a16 100644 --- a/apps/systemtags/lib/Search/TagSearchProvider.php +++ b/apps/systemtags/lib/Search/TagSearchProvider.php @@ -138,9 +138,9 @@ class TagSearchProvider implements IProvider { // prepare direct tag results $tagResults = array_map(function (ISystemTag $tag) { $thumbnailUrl = ''; - $link = $this->urlGenerator->linkToRoute( - 'files.view.index' - ) . '?view=systemtagsfilter&tags='.$tag->getId(); + $link = $this->urlGenerator->linkToRoute('files.view.indexView', [ + 'view' => 'tags', + ]) . '?dir='.$tag->getId(); $searchResultEntry = new SearchResultEntry( $thumbnailUrl, $this->l10n->t('All tagged %s …', [$tag->getName()]), diff --git a/apps/theming/l10n/ar.js b/apps/theming/l10n/ar.js index 5c43152f20a..ce3342a92e1 100644 --- a/apps/theming/l10n/ar.js +++ b/apps/theming/l10n/ar.js @@ -26,7 +26,7 @@ OC.L10N.register( "No file uploaded" : "لم يتم رفع الملف", "You are already using a custom theme. Theming app settings might be overwritten by that." : "أنت تستخدم الآن ثيمة مُخصّصة. إعدادات تطبيق الثيمات يُمكن أن يتم الكتابة عليها بسبب ذلك. ", "Theming" : "تخصيص القالب", - "Appearance and accessibility" : "المظهر appearance، و سهولة الوصول accessibility", + "Appearance and accessibility" : "المظهر و سهولة الوصول ", "PHP Imagick module" : "جزئية PHP Imagick ", "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "وحدة PHP ـ \"imahick\" غير مُفعّلة بالرغم من تفعيل تطبيق الثيمات theming. حتى يتم توليد الأيقونة الأساسية favicon بشكل صحيح يتوجب تنصيب و تفعيل هذه الوحدة.", "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "جزئية PHP Imagick في هذا الخادوم لا تدعم خاصية SVG. لتوافق أفضل، يُنصح بتثبيتها", @@ -47,7 +47,7 @@ OC.L10N.register( "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع تباين الألوان العالي يساعدك على التنقل في الموقع بسهولة. الجودة المرئية سوف تقل بينما الوضوح سيزداد.", "Light theme" : "ثيمة فاتحة light", "Enable the default light theme" : "مكّن الثيمة التلقائية الفاتحة", - "The default light appearance." : "المظهر الفاتح التلقائي", + "The default light appearance." : "المظهر الفاتح التلقائي.", "Legal notice" : "ملاحظة قانونية", "Privacy policy" : "سياسة الخصوصية", "Adjust the Nextcloud theme" : "تضبيط ثيمة نكست كلاود", diff --git a/apps/theming/l10n/ar.json b/apps/theming/l10n/ar.json index c2adf514fa3..50e4c57d178 100644 --- a/apps/theming/l10n/ar.json +++ b/apps/theming/l10n/ar.json @@ -24,7 +24,7 @@ "No file uploaded" : "لم يتم رفع الملف", "You are already using a custom theme. Theming app settings might be overwritten by that." : "أنت تستخدم الآن ثيمة مُخصّصة. إعدادات تطبيق الثيمات يُمكن أن يتم الكتابة عليها بسبب ذلك. ", "Theming" : "تخصيص القالب", - "Appearance and accessibility" : "المظهر appearance، و سهولة الوصول accessibility", + "Appearance and accessibility" : "المظهر و سهولة الوصول ", "PHP Imagick module" : "جزئية PHP Imagick ", "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "وحدة PHP ـ \"imahick\" غير مُفعّلة بالرغم من تفعيل تطبيق الثيمات theming. حتى يتم توليد الأيقونة الأساسية favicon بشكل صحيح يتوجب تنصيب و تفعيل هذه الوحدة.", "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "جزئية PHP Imagick في هذا الخادوم لا تدعم خاصية SVG. لتوافق أفضل، يُنصح بتثبيتها", @@ -45,7 +45,7 @@ "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع تباين الألوان العالي يساعدك على التنقل في الموقع بسهولة. الجودة المرئية سوف تقل بينما الوضوح سيزداد.", "Light theme" : "ثيمة فاتحة light", "Enable the default light theme" : "مكّن الثيمة التلقائية الفاتحة", - "The default light appearance." : "المظهر الفاتح التلقائي", + "The default light appearance." : "المظهر الفاتح التلقائي.", "Legal notice" : "ملاحظة قانونية", "Privacy policy" : "سياسة الخصوصية", "Adjust the Nextcloud theme" : "تضبيط ثيمة نكست كلاود", diff --git a/apps/theming/l10n/it.js b/apps/theming/l10n/it.js index a4bb2d7d835..0d3aeaa6a62 100644 --- a/apps/theming/l10n/it.js +++ b/apps/theming/l10n/it.js @@ -27,7 +27,9 @@ OC.L10N.register( "You are already using a custom theme. Theming app settings might be overwritten by that." : "Stai già utilizzando un tema personalizzato. Le impostazioni dell'applicazione dei temi potrebbero essere sovrascritte.", "Theming" : "Tema", "Appearance and accessibility" : "Aspetto e accessibilità", + "PHP Imagick module" : "Modulo Imagick PHP", "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Il modulo PHP \"imagick\" non è attivato sebbene l'applicazione dei temi lo sia. Affinché la generazione di favicon funzioni bene, devi installare ed attivare questo modulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Al modulo \"imagick\" di PHP manca il supporto SVG. Per una migliore compatibilità si consiglia di installarlo.", "Dark theme with high contrast mode" : "Tema scuro con modalità di contrasto elevato", "Enable dark high contrast mode" : "Abilita la modalità scuro ad alto contrasto", "Similar to the high contrast mode, but with dark colours." : "Simile alla modalità a contrasto elevato, ma con colori scuri.", @@ -43,13 +45,15 @@ OC.L10N.register( "High contrast mode" : "Modalità ad alto contrasto", "Enable high contrast mode" : "Abilita la modalità ad alto contrasto", "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Una modalità ad alto contrasto per semplificare la tua navigazione. La qualità visiva sarà ridotta per incrementare la chiarezza.", - "Light theme" : "Tema leggero", - "Enable the default light theme" : "Abilita il tema leggero predefinito", - "The default light appearance." : "L'aspetto predefinito del tema leggero.", + "Light theme" : "Tema chiaro", + "Enable the default light theme" : "Abilita il tema chiaro predefinito", + "The default light appearance." : "L'aspetto del tema chiaro predefinito.", "Legal notice" : "Avviso legale", "Privacy policy" : "Criterio di riservatezza", "Adjust the Nextcloud theme" : "Modifica il tema di Nextcloud", "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "La gestione dei temi rende semplice la personalizzazione dell'aspetto della tua istanza e dei client supportati. Ciò sarà visibile a tutti gli utenti.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Al posto di un'immagine, puoi anche configurare un colore di sfondo. Se usi un'immagine di sfondo, cambiare questo colore influenzerà il colore delle icone dei menu.", + "Background color" : "Colore di sfondo", "Upload new logo" : "Carica nuovo logo", "Logo" : "Logo", "Upload new background and login image" : "Carica nuova immagine di sfondo e di accesso", @@ -60,6 +64,8 @@ OC.L10N.register( "Web link" : "Collegamento web", "a safe home for all your data" : "un posto sicuro per tutti i tuoi dati", "Slogan" : "Slogan", + "Primary color" : "Colore primario", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Il colore primario è usato per evidenziare elementi, come pulsanti importanti. Può essere regolato un po' a seconda dello schema di colori attuale.", "Legal notice link" : "Collegamento avviso legale", "Privacy policy link" : "Collegamento criteri di riservatezza", "Header logo" : "Logo dell'intestazione", @@ -69,7 +75,11 @@ OC.L10N.register( "User settings" : "Impostazioni utente", "Disable user theming" : "Disattiva temi utente", "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Sebbene tu possa selezionare e personalizzare la tua istanza, gli utenti possono cambiare il loro sfondo e colore. Se vuoi forzare la tua personalizzazione, puoi attivare questo.", + "Appearance and accessibility settings" : "Impostazioni di aspetto e accessibilità", "Customization has been disabled by your administrator" : "La personalizzazione è stata disattivata dall'amministratore", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Imposta un colore primario per evidenziare elementi importanti. Il colore usato per elementi come pulsanti principali può essere leggermente diverso, dato che viene regolato per soddisfare i requisiti di accessibilità.", + "Background and color" : "Sfondo e colore", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Lo sfondo può essere impostato ad un'immagine dal set predefinito, un'immagine caricata a mano, o un colore unico.", "Keyboard shortcuts" : "Scorciatoie da tastiera", "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In alcuni casi le scorciatoie da tastiera possono interferire con gli strumenti di accessibilità. Per concentrarti correttamente sullo strumento, è possibile disattivare tutte le scorciatoie da tastiera. Verranno disattivate anche tutte le scorciatoie disponibili nelle applicazioni.", "Disable all keyboard shortcuts" : "Disattiva tutte le scorciatoie da tastiera", @@ -92,6 +102,8 @@ OC.L10N.register( "Reset default app order" : "Ripristina ordine predefinito delle applicazioni", "Could not set the app order" : "Impossibile impostare l'ordine delle applicazioni", "Could not reset the app order" : "Impossibile ripristinare l'ordine delle applicazioni", + "Reset primary color" : "Ripristina colore primario", + "Could not set primary color" : "Impossibile impostare il colore primario", "Default app" : "Applicazione predefinita", "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'applicazione predefinita è quella che viene aperta dopo l'accesso o quando si fa clic sul logo nel menu.", "Use custom default app" : "Usa app predefinita personalizzata", diff --git a/apps/theming/l10n/it.json b/apps/theming/l10n/it.json index a8c32bf0cae..6f551dea3f4 100644 --- a/apps/theming/l10n/it.json +++ b/apps/theming/l10n/it.json @@ -25,7 +25,9 @@ "You are already using a custom theme. Theming app settings might be overwritten by that." : "Stai già utilizzando un tema personalizzato. Le impostazioni dell'applicazione dei temi potrebbero essere sovrascritte.", "Theming" : "Tema", "Appearance and accessibility" : "Aspetto e accessibilità", + "PHP Imagick module" : "Modulo Imagick PHP", "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Il modulo PHP \"imagick\" non è attivato sebbene l'applicazione dei temi lo sia. Affinché la generazione di favicon funzioni bene, devi installare ed attivare questo modulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Al modulo \"imagick\" di PHP manca il supporto SVG. Per una migliore compatibilità si consiglia di installarlo.", "Dark theme with high contrast mode" : "Tema scuro con modalità di contrasto elevato", "Enable dark high contrast mode" : "Abilita la modalità scuro ad alto contrasto", "Similar to the high contrast mode, but with dark colours." : "Simile alla modalità a contrasto elevato, ma con colori scuri.", @@ -41,13 +43,15 @@ "High contrast mode" : "Modalità ad alto contrasto", "Enable high contrast mode" : "Abilita la modalità ad alto contrasto", "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Una modalità ad alto contrasto per semplificare la tua navigazione. La qualità visiva sarà ridotta per incrementare la chiarezza.", - "Light theme" : "Tema leggero", - "Enable the default light theme" : "Abilita il tema leggero predefinito", - "The default light appearance." : "L'aspetto predefinito del tema leggero.", + "Light theme" : "Tema chiaro", + "Enable the default light theme" : "Abilita il tema chiaro predefinito", + "The default light appearance." : "L'aspetto del tema chiaro predefinito.", "Legal notice" : "Avviso legale", "Privacy policy" : "Criterio di riservatezza", "Adjust the Nextcloud theme" : "Modifica il tema di Nextcloud", "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "La gestione dei temi rende semplice la personalizzazione dell'aspetto della tua istanza e dei client supportati. Ciò sarà visibile a tutti gli utenti.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Al posto di un'immagine, puoi anche configurare un colore di sfondo. Se usi un'immagine di sfondo, cambiare questo colore influenzerà il colore delle icone dei menu.", + "Background color" : "Colore di sfondo", "Upload new logo" : "Carica nuovo logo", "Logo" : "Logo", "Upload new background and login image" : "Carica nuova immagine di sfondo e di accesso", @@ -58,6 +62,8 @@ "Web link" : "Collegamento web", "a safe home for all your data" : "un posto sicuro per tutti i tuoi dati", "Slogan" : "Slogan", + "Primary color" : "Colore primario", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Il colore primario è usato per evidenziare elementi, come pulsanti importanti. Può essere regolato un po' a seconda dello schema di colori attuale.", "Legal notice link" : "Collegamento avviso legale", "Privacy policy link" : "Collegamento criteri di riservatezza", "Header logo" : "Logo dell'intestazione", @@ -67,7 +73,11 @@ "User settings" : "Impostazioni utente", "Disable user theming" : "Disattiva temi utente", "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Sebbene tu possa selezionare e personalizzare la tua istanza, gli utenti possono cambiare il loro sfondo e colore. Se vuoi forzare la tua personalizzazione, puoi attivare questo.", + "Appearance and accessibility settings" : "Impostazioni di aspetto e accessibilità", "Customization has been disabled by your administrator" : "La personalizzazione è stata disattivata dall'amministratore", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Imposta un colore primario per evidenziare elementi importanti. Il colore usato per elementi come pulsanti principali può essere leggermente diverso, dato che viene regolato per soddisfare i requisiti di accessibilità.", + "Background and color" : "Sfondo e colore", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Lo sfondo può essere impostato ad un'immagine dal set predefinito, un'immagine caricata a mano, o un colore unico.", "Keyboard shortcuts" : "Scorciatoie da tastiera", "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In alcuni casi le scorciatoie da tastiera possono interferire con gli strumenti di accessibilità. Per concentrarti correttamente sullo strumento, è possibile disattivare tutte le scorciatoie da tastiera. Verranno disattivate anche tutte le scorciatoie disponibili nelle applicazioni.", "Disable all keyboard shortcuts" : "Disattiva tutte le scorciatoie da tastiera", @@ -90,6 +100,8 @@ "Reset default app order" : "Ripristina ordine predefinito delle applicazioni", "Could not set the app order" : "Impossibile impostare l'ordine delle applicazioni", "Could not reset the app order" : "Impossibile ripristinare l'ordine delle applicazioni", + "Reset primary color" : "Ripristina colore primario", + "Could not set primary color" : "Impossibile impostare il colore primario", "Default app" : "Applicazione predefinita", "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'applicazione predefinita è quella che viene aperta dopo l'accesso o quando si fa clic sul logo nel menu.", "Use custom default app" : "Usa app predefinita personalizzata", diff --git a/apps/theming/l10n/tr.js b/apps/theming/l10n/tr.js index 052b46c188e..d2b05ba389f 100644 --- a/apps/theming/l10n/tr.js +++ b/apps/theming/l10n/tr.js @@ -52,6 +52,8 @@ OC.L10N.register( "Privacy policy" : "Kişisel gizliliğin korunması ilkesi", "Adjust the Nextcloud theme" : "Nextcloud temasını ayarla", "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Temalar kullandığınız kopyanın ve desteklenen istemcilerin genel görünümün kolayca değiştirilmesini sağlar. Tüm kullanıcılara görüntülenir.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Arka plan görseli yerine düz bir arka plan rengi de yapılandırabilirsiniz. Arka plan görseli kullanıyorsanız bu rengi değiştirmek uygulama menüsü simgelerinin rengini etkiler.", + "Background color" : "Arka plan rengi", "Upload new logo" : "Yeni logo yükle", "Logo" : "Logo", "Upload new background and login image" : "Yeni arka plan ve oturum açma görselini yükleyin", @@ -62,6 +64,8 @@ OC.L10N.register( "Web link" : "Site bağlantısı", "a safe home for all your data" : "verileriniz için güvenli bir barınak", "Slogan" : "Slogan", + "Primary color" : "Birincil renk", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Birincil renk, önemli düğmeler gibi ögeleri vurgulamak için kullanılır. Geçerli renk temasına bağlı olarak biraz değiştirilebilir.", "Legal notice link" : "Yasal bildirim bağlantısı", "Privacy policy link" : "Gizlilik ilkesi bağlantısı", "Header logo" : "Üst bilgi logosu", @@ -73,7 +77,9 @@ OC.L10N.register( "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Kopyanızı seçip özelleştirebilmenize rağmen, kullanıcılar arka planlarını ve renklerini değiştirebilir. Özelleştirmenizi dayatmak istiyorsanız, bu seçeneği etkinleştirebilirsiniz.", "Appearance and accessibility settings" : "Görünüm ve erişilebilirlik ayarları", "Customization has been disabled by your administrator" : "Özelleştirme yöneticiniz tarafından devre dışı bırakılmış", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Önemli ögeleri vurgulamak için bir birincil renk ayarlayın. Birincil düğmeler gibi ögeler için kullanılan renk, erişilebilirlik gereksinimlerini karşılamak üzere ayarlandığında biraz farklılık gösterebilir.", "Background and color" : "Arka plan ve renk", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Arka plan varsayılan ayardaki bir görsele, özel olarak yüklenen bir görsele veya düz bir renge ayarlanabilir.", "Keyboard shortcuts" : "Kısayol tuşları", "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Bazı durumlarda klavye kısayolları erişilebilirlik araçlarına etki edebilir. Aracınıza doğru şekilde odaklanmanızı sağlamak için tüm klavye kısayollarını buradan devre dışı bırakabilirsiniz. Bu aynı zamanda uygulamalarda var olan tüm kısayolları da devre dışı bırakır.", "Disable all keyboard shortcuts" : "Tüm klavye kısayolları devre dışı bırakılsın", @@ -96,6 +102,8 @@ OC.L10N.register( "Reset default app order" : "Varsayılan uygulama sırasını yükle", "Could not set the app order" : "Uygulama sırası ayarlanamadı", "Could not reset the app order" : "Uygulama sırasını sıfırla", + "Reset primary color" : "Birincil rengi sıfırla", + "Could not set primary color" : "Birincil renk ayarlanamadı", "Default app" : "Varsayılan uygulama", "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Varsayılan uygulama, oturum açtıktan ya da menüdeki logo üzerine tıkladıktan sonra açılır.", "Use custom default app" : "Özel varsayılan uygulama kullanılsın", diff --git a/apps/theming/l10n/tr.json b/apps/theming/l10n/tr.json index fc45669099f..c31f5991492 100644 --- a/apps/theming/l10n/tr.json +++ b/apps/theming/l10n/tr.json @@ -50,6 +50,8 @@ "Privacy policy" : "Kişisel gizliliğin korunması ilkesi", "Adjust the Nextcloud theme" : "Nextcloud temasını ayarla", "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Temalar kullandığınız kopyanın ve desteklenen istemcilerin genel görünümün kolayca değiştirilmesini sağlar. Tüm kullanıcılara görüntülenir.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Arka plan görseli yerine düz bir arka plan rengi de yapılandırabilirsiniz. Arka plan görseli kullanıyorsanız bu rengi değiştirmek uygulama menüsü simgelerinin rengini etkiler.", + "Background color" : "Arka plan rengi", "Upload new logo" : "Yeni logo yükle", "Logo" : "Logo", "Upload new background and login image" : "Yeni arka plan ve oturum açma görselini yükleyin", @@ -60,6 +62,8 @@ "Web link" : "Site bağlantısı", "a safe home for all your data" : "verileriniz için güvenli bir barınak", "Slogan" : "Slogan", + "Primary color" : "Birincil renk", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Birincil renk, önemli düğmeler gibi ögeleri vurgulamak için kullanılır. Geçerli renk temasına bağlı olarak biraz değiştirilebilir.", "Legal notice link" : "Yasal bildirim bağlantısı", "Privacy policy link" : "Gizlilik ilkesi bağlantısı", "Header logo" : "Üst bilgi logosu", @@ -71,7 +75,9 @@ "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Kopyanızı seçip özelleştirebilmenize rağmen, kullanıcılar arka planlarını ve renklerini değiştirebilir. Özelleştirmenizi dayatmak istiyorsanız, bu seçeneği etkinleştirebilirsiniz.", "Appearance and accessibility settings" : "Görünüm ve erişilebilirlik ayarları", "Customization has been disabled by your administrator" : "Özelleştirme yöneticiniz tarafından devre dışı bırakılmış", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Önemli ögeleri vurgulamak için bir birincil renk ayarlayın. Birincil düğmeler gibi ögeler için kullanılan renk, erişilebilirlik gereksinimlerini karşılamak üzere ayarlandığında biraz farklılık gösterebilir.", "Background and color" : "Arka plan ve renk", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Arka plan varsayılan ayardaki bir görsele, özel olarak yüklenen bir görsele veya düz bir renge ayarlanabilir.", "Keyboard shortcuts" : "Kısayol tuşları", "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Bazı durumlarda klavye kısayolları erişilebilirlik araçlarına etki edebilir. Aracınıza doğru şekilde odaklanmanızı sağlamak için tüm klavye kısayollarını buradan devre dışı bırakabilirsiniz. Bu aynı zamanda uygulamalarda var olan tüm kısayolları da devre dışı bırakır.", "Disable all keyboard shortcuts" : "Tüm klavye kısayolları devre dışı bırakılsın", @@ -94,6 +100,8 @@ "Reset default app order" : "Varsayılan uygulama sırasını yükle", "Could not set the app order" : "Uygulama sırası ayarlanamadı", "Could not reset the app order" : "Uygulama sırasını sıfırla", + "Reset primary color" : "Birincil rengi sıfırla", + "Could not set primary color" : "Birincil renk ayarlanamadı", "Default app" : "Varsayılan uygulama", "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Varsayılan uygulama, oturum açtıktan ya da menüdeki logo üzerine tıkladıktan sonra açılır.", "Use custom default app" : "Özel varsayılan uygulama kullanılsın", diff --git a/apps/updatenotification/l10n/it.js b/apps/updatenotification/l10n/it.js index f2e3a6b21e4..a850297695f 100644 --- a/apps/updatenotification/l10n/it.js +++ b/apps/updatenotification/l10n/it.js @@ -17,13 +17,16 @@ OC.L10N.register( "What's new in {app} {version}" : "Novità in {app} {versione}", "Give feedback" : "Dai un feedback", "Get started" : "Cominciamo", + "No changelog available" : "Nessuna nota di rilascio disponibile", "Update" : "Aggiorna", "The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible." : "La versione che stai eseguendo non è più mantenuta. Assicurati di aggiornare a una versione supportata non appena possibile.", "Apps missing compatible version" : "Applicazioni senza versione compatibile", "View in store" : "Visualizza nel negozio", "Apps with compatible version" : "Applicazioni con versione compatibile", + "Please note that the web updater is not recommended with more than 100 accounts! Please use the command line updater instead!" : "Tieni presente che il programma di aggiornamento web non è consigliato con più di 100 account! Si prega di utilizzare, invece, il programma di aggiornamento tramite riga di comando!", "Open updater" : "Apri strumento di aggiornamento", "Download now" : "Scarica ora", + "Web updater is disabled. Please use the command line updater or the appropriate update mechanism for your installation method (e.g. Docker pull) to update." : "Programma di aggiornamento web disattivato. Usa quello da riga di comando o il meccanismo di aggiornamento appropriato per il tuo metodo di installazione (es. Docker pull).", "What's new?" : "Cosa c'è di nuovo?", "View changelog" : "Visualizza le novità", "The update check is not yet finished. Please refresh the page." : "Il controllo degli aggiornamenti non è ancora terminato. Aggiorna la pagina.", @@ -39,6 +42,8 @@ OC.L10N.register( "The selected update channel makes dedicated notifications for the server obsolete." : "Il canale di aggiornamento selezionato rende obsolete le notifiche dedicate al server.", "The selected update channel does not support updates of the server." : "Il canale di aggiornamento selezionato non supporta gli aggiornamenti del server.", "A new version is available: <strong>{newVersionString}</strong>" : "Una nuova versione è disponibile: <strong>{newVersionString}</strong>", + "Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}" : "Nota che, dopo una nuova versione, l'aggiornamento viene mostrato solo dopo la prima versione minore o successivamente. Pubblichiamo nel tempo nuove versioni e, a volte, ne saltiamo una se troviamo dei problemi. Ulteriori informazioni sugli aggiornamenti e sui canali di rilascio su {link}", + "Checked on {lastCheckedDate} - Open changelog" : "Controllato il {lastCheckedDate} - Apri note di rilascio", "Checking apps for compatible versions" : "Controllo di applicazioni con versioni compatibili", "Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Assicurati che il tuo config.php non abbia <samp>appstoreenabled</samp> impostata a false.", "Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Impossibile connettersi al negozio delle applicazioni o il negozio delle applicazioni non ha restituito alcun aggiornamento. Cerca manualmente gli aggiornamenti o assicurati che il server abbia accesso a Internet e possa collegarsi al negozio delle applicazioni.", @@ -50,6 +55,8 @@ OC.L10N.register( "Beta" : "Beta", "A pre-release version only for testing new features, not for production environments." : "Una versione pre-rilascio solo per provare le nuove funzionalità, non per ambienti di produzione.", "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["<strong>%n</strong> applicazione non ha una versione compatibile disponibile per questa versione di Nextcloud.","<strong>%n</strong> applicazioni non hanno una versione compatibile disponibile per questa versione di Nextcloud.","<strong>%n</strong> applicazioni non hanno una versione compatibile disponibile per questa versione di Nextcloud."], + "Changelog for app {app}" : "Note di rilascio per l'app {app}", + "What's new in {app} version {version}" : "Novità nella versione {version} di {app}", "Update to %1$s is available." : "Aggiornamento a %1$s disponibile.", "Displays update notifications for Nextcloud and provides the SSO for the updater." : "Visualizza le notifiche degli aggiornamenti per Nextcloud e fornisce il SSO per lo strumento di aggiornamento.", "Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!" : "Tieni presente che il programma di aggiornamento web non è consigliato con più di 100 utenti! Si prega di utilizzare, invece, il programma di aggiornamento tramite riga di comando!", diff --git a/apps/updatenotification/l10n/it.json b/apps/updatenotification/l10n/it.json index dc087a12652..13eef0c0ea6 100644 --- a/apps/updatenotification/l10n/it.json +++ b/apps/updatenotification/l10n/it.json @@ -15,13 +15,16 @@ "What's new in {app} {version}" : "Novità in {app} {versione}", "Give feedback" : "Dai un feedback", "Get started" : "Cominciamo", + "No changelog available" : "Nessuna nota di rilascio disponibile", "Update" : "Aggiorna", "The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible." : "La versione che stai eseguendo non è più mantenuta. Assicurati di aggiornare a una versione supportata non appena possibile.", "Apps missing compatible version" : "Applicazioni senza versione compatibile", "View in store" : "Visualizza nel negozio", "Apps with compatible version" : "Applicazioni con versione compatibile", + "Please note that the web updater is not recommended with more than 100 accounts! Please use the command line updater instead!" : "Tieni presente che il programma di aggiornamento web non è consigliato con più di 100 account! Si prega di utilizzare, invece, il programma di aggiornamento tramite riga di comando!", "Open updater" : "Apri strumento di aggiornamento", "Download now" : "Scarica ora", + "Web updater is disabled. Please use the command line updater or the appropriate update mechanism for your installation method (e.g. Docker pull) to update." : "Programma di aggiornamento web disattivato. Usa quello da riga di comando o il meccanismo di aggiornamento appropriato per il tuo metodo di installazione (es. Docker pull).", "What's new?" : "Cosa c'è di nuovo?", "View changelog" : "Visualizza le novità", "The update check is not yet finished. Please refresh the page." : "Il controllo degli aggiornamenti non è ancora terminato. Aggiorna la pagina.", @@ -37,6 +40,8 @@ "The selected update channel makes dedicated notifications for the server obsolete." : "Il canale di aggiornamento selezionato rende obsolete le notifiche dedicate al server.", "The selected update channel does not support updates of the server." : "Il canale di aggiornamento selezionato non supporta gli aggiornamenti del server.", "A new version is available: <strong>{newVersionString}</strong>" : "Una nuova versione è disponibile: <strong>{newVersionString}</strong>", + "Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}" : "Nota che, dopo una nuova versione, l'aggiornamento viene mostrato solo dopo la prima versione minore o successivamente. Pubblichiamo nel tempo nuove versioni e, a volte, ne saltiamo una se troviamo dei problemi. Ulteriori informazioni sugli aggiornamenti e sui canali di rilascio su {link}", + "Checked on {lastCheckedDate} - Open changelog" : "Controllato il {lastCheckedDate} - Apri note di rilascio", "Checking apps for compatible versions" : "Controllo di applicazioni con versioni compatibili", "Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Assicurati che il tuo config.php non abbia <samp>appstoreenabled</samp> impostata a false.", "Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Impossibile connettersi al negozio delle applicazioni o il negozio delle applicazioni non ha restituito alcun aggiornamento. Cerca manualmente gli aggiornamenti o assicurati che il server abbia accesso a Internet e possa collegarsi al negozio delle applicazioni.", @@ -48,6 +53,8 @@ "Beta" : "Beta", "A pre-release version only for testing new features, not for production environments." : "Una versione pre-rilascio solo per provare le nuove funzionalità, non per ambienti di produzione.", "_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["<strong>%n</strong> applicazione non ha una versione compatibile disponibile per questa versione di Nextcloud.","<strong>%n</strong> applicazioni non hanno una versione compatibile disponibile per questa versione di Nextcloud.","<strong>%n</strong> applicazioni non hanno una versione compatibile disponibile per questa versione di Nextcloud."], + "Changelog for app {app}" : "Note di rilascio per l'app {app}", + "What's new in {app} version {version}" : "Novità nella versione {version} di {app}", "Update to %1$s is available." : "Aggiornamento a %1$s disponibile.", "Displays update notifications for Nextcloud and provides the SSO for the updater." : "Visualizza le notifiche degli aggiornamenti per Nextcloud e fornisce il SSO per lo strumento di aggiornamento.", "Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!" : "Tieni presente che il programma di aggiornamento web non è consigliato con più di 100 utenti! Si prega di utilizzare, invece, il programma di aggiornamento tramite riga di comando!", diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js index 2bd53b81ca8..cab562a6f8d 100644 --- a/apps/user_ldap/l10n/tr.js +++ b/apps/user_ldap/l10n/tr.js @@ -212,6 +212,8 @@ OC.L10N.register( "User profile Headline will be set from the specified attribute" : "Kullanıcı profilindeki başlık alanının değeri belirtilen öznitelikten alınır", "Biography Field" : "Özgeçmiş alanı", "User profile Biography will be set from the specified attribute" : "Kullanıcı profilindeki özgeçmiş alanının değeri belirtilen öznitelikten alınır", + "Birthdate Field" : "Doğum tarihi alanı", + "User profile Date of birth will be set from the specified attribute" : "Kullanıcı profilindeki doğum tarihi alanının değeri belirtilen öznitelikten alınır", "Internal Username" : "İç kullanıcı adı", "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnızca şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@-]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin DAV hizmetlerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Değişiklikler yalnızca yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler. Varsayılan davranışın kullanılması için boş bırakın.", "Internal Username Attribute:" : "İç kullanıcı adı özniteliği:", diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json index 71cd330348e..e5d623731f5 100644 --- a/apps/user_ldap/l10n/tr.json +++ b/apps/user_ldap/l10n/tr.json @@ -210,6 +210,8 @@ "User profile Headline will be set from the specified attribute" : "Kullanıcı profilindeki başlık alanının değeri belirtilen öznitelikten alınır", "Biography Field" : "Özgeçmiş alanı", "User profile Biography will be set from the specified attribute" : "Kullanıcı profilindeki özgeçmiş alanının değeri belirtilen öznitelikten alınır", + "Birthdate Field" : "Doğum tarihi alanı", + "User profile Date of birth will be set from the specified attribute" : "Kullanıcı profilindeki doğum tarihi alanının değeri belirtilen öznitelikten alınır", "Internal Username" : "İç kullanıcı adı", "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnızca şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@-]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin DAV hizmetlerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Değişiklikler yalnızca yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler. Varsayılan davranışın kullanılması için boş bırakın.", "Internal Username Attribute:" : "İç kullanıcı adı özniteliği:", diff --git a/apps/user_ldap/lib/User_Proxy.php b/apps/user_ldap/lib/User_Proxy.php index 96cd7b47637..7b927100fe5 100644 --- a/apps/user_ldap/lib/User_Proxy.php +++ b/apps/user_ldap/lib/User_Proxy.php @@ -464,6 +464,9 @@ class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP } public function getDisabledUserList(?int $limit = null, int $offset = 0, string $search = ''): array { + if ((int)$this->getAccess(array_key_first($this->backends) ?? '')->connection->markRemnantsAsDisabled !== 1) { + return []; + } $disabledUsers = $this->deletedUsersIndex->getUsers(); if ($search !== '') { $disabledUsers = array_filter( diff --git a/apps/weather_status/l10n/it.js b/apps/weather_status/l10n/it.js index 8a963f5e161..5dbad38f38a 100644 --- a/apps/weather_status/l10n/it.js +++ b/apps/weather_status/l10n/it.js @@ -7,6 +7,7 @@ OC.L10N.register( "Error" : "Errore", "Weather status" : "Stato meteo", "Weather status in your dashboard" : "Stato meteo nel tuo cruscotto", + "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." : "Meteo integrato nell'applicazione del cruscotto.\n La posizione geografica può essere determinata automaticamente o definita a mano. Vengono poi mostrate previsioni per 6 ore.\n Questo stato può anche essere integrato in altri posti come nell'applicazione Calendario.", "Detect location" : "Elimina località", "Set custom address" : "Imposta indirizzo personalizzato", "Favorites" : "Preferiti", diff --git a/apps/weather_status/l10n/it.json b/apps/weather_status/l10n/it.json index 48606db69f9..3681e5f6aac 100644 --- a/apps/weather_status/l10n/it.json +++ b/apps/weather_status/l10n/it.json @@ -5,6 +5,7 @@ "Error" : "Errore", "Weather status" : "Stato meteo", "Weather status in your dashboard" : "Stato meteo nel tuo cruscotto", + "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." : "Meteo integrato nell'applicazione del cruscotto.\n La posizione geografica può essere determinata automaticamente o definita a mano. Vengono poi mostrate previsioni per 6 ore.\n Questo stato può anche essere integrato in altri posti come nell'applicazione Calendario.", "Detect location" : "Elimina località", "Set custom address" : "Imposta indirizzo personalizzato", "Favorites" : "Preferiti", diff --git a/apps/workflowengine/l10n/ar.js b/apps/workflowengine/l10n/ar.js index 9557dd6a4fa..9b3bafb42d7 100644 --- a/apps/workflowengine/l10n/ar.js +++ b/apps/workflowengine/l10n/ar.js @@ -44,8 +44,8 @@ OC.L10N.register( "The provided check value is too long" : "قيمة التحقق المقدمة طويلة جدًا", "Check #%s does not exist" : "تحقق من#%s غير موجود", "Check %s is invalid or does not exist" : "التحقق من %s فهو غير صالح أو غير موجود", - "Flow" : "مسار دفقٍ Flow", - "Nextcloud workflow engine" : "محرك الدفق الإجرائي workflow لنكست كلود", + "Flow" : "مسارات الدَّفق ", + "Nextcloud workflow engine" : "محرك مسارات الدَّفق لنكست كلاود", "Select a filter" : "اختر عامل تصفية", "Select a comparator" : "اختر أساس المقارنة", "Remove filter" : "إزالة الفلتر", @@ -83,15 +83,15 @@ OC.L10N.register( "Save" : "حفظ", "Available flows" : "مسارات الدفق المتاحة", "For details on how to write your own flow, check out the development documentation." : "للحصول على تفاصيل حول كيفية كتابة مسارات الدفق خاصّتك، تحقق من وثائق التطوير.", - "No flows installed" : "لم يتم تثبيت أي مسارات دفقٍ", - "Ask your administrator to install new flows." : "أطلُب من مُشرِفِك تثبيت مسارات دفقٍ جديدة.", + "No flows installed" : "لم يتم تثبيت أي مسارات للدَّفق", + "Ask your administrator to install new flows." : "أطلُب من مُشرِفِك تثبيت مسارات جديدة للدَّفق.", "More flows" : "المزيد من مسارات الدفق", "Browse the App Store" : "إستعرض متجر التطبيقات", "Show less" : "عرض أقل", "Show more" : "عرض المزيد", "Configured flows" : "مسارات الدفق المُعدّة", "Your flows" : "مسارات الدفق خاصّتك", - "No flows configured" : "لم تتم تهيئة أي مسارات دفقٍ", + "No flows configured" : "لم تتم تهيئة أي مسارات للدَّفق", "matches" : "متوافق", "does not match" : "غير متوافق", "is" : "يكون", diff --git a/apps/workflowengine/l10n/ar.json b/apps/workflowengine/l10n/ar.json index 20d3e00acb0..ce761dc2112 100644 --- a/apps/workflowengine/l10n/ar.json +++ b/apps/workflowengine/l10n/ar.json @@ -42,8 +42,8 @@ "The provided check value is too long" : "قيمة التحقق المقدمة طويلة جدًا", "Check #%s does not exist" : "تحقق من#%s غير موجود", "Check %s is invalid or does not exist" : "التحقق من %s فهو غير صالح أو غير موجود", - "Flow" : "مسار دفقٍ Flow", - "Nextcloud workflow engine" : "محرك الدفق الإجرائي workflow لنكست كلود", + "Flow" : "مسارات الدَّفق ", + "Nextcloud workflow engine" : "محرك مسارات الدَّفق لنكست كلاود", "Select a filter" : "اختر عامل تصفية", "Select a comparator" : "اختر أساس المقارنة", "Remove filter" : "إزالة الفلتر", @@ -81,15 +81,15 @@ "Save" : "حفظ", "Available flows" : "مسارات الدفق المتاحة", "For details on how to write your own flow, check out the development documentation." : "للحصول على تفاصيل حول كيفية كتابة مسارات الدفق خاصّتك، تحقق من وثائق التطوير.", - "No flows installed" : "لم يتم تثبيت أي مسارات دفقٍ", - "Ask your administrator to install new flows." : "أطلُب من مُشرِفِك تثبيت مسارات دفقٍ جديدة.", + "No flows installed" : "لم يتم تثبيت أي مسارات للدَّفق", + "Ask your administrator to install new flows." : "أطلُب من مُشرِفِك تثبيت مسارات جديدة للدَّفق.", "More flows" : "المزيد من مسارات الدفق", "Browse the App Store" : "إستعرض متجر التطبيقات", "Show less" : "عرض أقل", "Show more" : "عرض المزيد", "Configured flows" : "مسارات الدفق المُعدّة", "Your flows" : "مسارات الدفق خاصّتك", - "No flows configured" : "لم تتم تهيئة أي مسارات دفقٍ", + "No flows configured" : "لم تتم تهيئة أي مسارات للدَّفق", "matches" : "متوافق", "does not match" : "غير متوافق", "is" : "يكون", |