diff options
Diffstat (limited to 'apps')
47 files changed, 570 insertions, 88 deletions
diff --git a/apps/dashboard/l10n/ro.js b/apps/dashboard/l10n/ro.js index faa3ca3a7c8..c3716430422 100644 --- a/apps/dashboard/l10n/ro.js +++ b/apps/dashboard/l10n/ro.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Dashboard" : "Panou", "Dashboard app" : "Panou de bord aplicație", + "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Începeți ziua în cunoștință de cauză\n\nTabloul de bord Nextcloud este punctul dumneavoastră de pornire al zilei, oferindu-vă un\nprivire de ansamblu asupra viitoarelor dvs. întâlniri, e-mailurilor urgente, mesajelor de chat,\nbilete primite, cele mai recente tweet-uri și multe altele! Utilizatorii pot adăuga widget-urile\ncare le plac și să schimbe fundalul după bunul lor plac.", "Customize" : "Personalizează", "Edit widgets" : "Editează widget", "Get more widgets from the App Store" : "Obține mai multe widget-uri din App Store", diff --git a/apps/dashboard/l10n/ro.json b/apps/dashboard/l10n/ro.json index b775ae40b42..98ef3671d91 100644 --- a/apps/dashboard/l10n/ro.json +++ b/apps/dashboard/l10n/ro.json @@ -1,6 +1,7 @@ { "translations": { "Dashboard" : "Panou", "Dashboard app" : "Panou de bord aplicație", + "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Începeți ziua în cunoștință de cauză\n\nTabloul de bord Nextcloud este punctul dumneavoastră de pornire al zilei, oferindu-vă un\nprivire de ansamblu asupra viitoarelor dvs. întâlniri, e-mailurilor urgente, mesajelor de chat,\nbilete primite, cele mai recente tweet-uri și multe altele! Utilizatorii pot adăuga widget-urile\ncare le plac și să schimbe fundalul după bunul lor plac.", "Customize" : "Personalizează", "Edit widgets" : "Editează widget", "Get more widgets from the App Store" : "Obține mai multe widget-uri din App Store", diff --git a/apps/dav/l10n/de.js b/apps/dav/l10n/de.js index 76c3f3ece67..7f60996b78e 100644 --- a/apps/dav/l10n/de.js +++ b/apps/dav/l10n/de.js @@ -156,6 +156,9 @@ OC.L10N.register( "Saturday" : "Samstag", "Sunday" : "Sonntag", "Save" : "Speichern", + "Failed to load availability" : "Fehler beim Laden der Verfügbarkeit", + "Saved availability" : "Verfügbarkeit gespeichert", + "Failed to save availability" : "Fehler beim Speichern der Verfügbarkeit", "Calendar server" : "Kalender-Server", "Send invitations to attendees" : "Einladungen an die Teilnehmer versenden", "Automatically generate a birthday calendar" : "Automatisch einen Kalender für Geburtstage erstellen", diff --git a/apps/dav/l10n/de.json b/apps/dav/l10n/de.json index 34ccefe668b..a53bd9f0473 100644 --- a/apps/dav/l10n/de.json +++ b/apps/dav/l10n/de.json @@ -154,6 +154,9 @@ "Saturday" : "Samstag", "Sunday" : "Sonntag", "Save" : "Speichern", + "Failed to load availability" : "Fehler beim Laden der Verfügbarkeit", + "Saved availability" : "Verfügbarkeit gespeichert", + "Failed to save availability" : "Fehler beim Speichern der Verfügbarkeit", "Calendar server" : "Kalender-Server", "Send invitations to attendees" : "Einladungen an die Teilnehmer versenden", "Automatically generate a birthday calendar" : "Automatisch einen Kalender für Geburtstage erstellen", diff --git a/apps/dav/l10n/pt_BR.js b/apps/dav/l10n/pt_BR.js index 57d665cc064..8c56afa1708 100644 --- a/apps/dav/l10n/pt_BR.js +++ b/apps/dav/l10n/pt_BR.js @@ -156,6 +156,9 @@ OC.L10N.register( "Saturday" : "Sábado ", "Sunday" : "Domingo", "Save" : "Salvar", + "Failed to load availability" : "Falha ao carregar a disponibilidade", + "Saved availability" : "Disponibilidade salva", + "Failed to save availability" : "Falha ao salvar a disponibilidade", "Calendar server" : "Servidor de calendário", "Send invitations to attendees" : "Enviar convites aos participantes", "Automatically generate a birthday calendar" : "Gerar um calendário de aniversários automaticamente", diff --git a/apps/dav/l10n/pt_BR.json b/apps/dav/l10n/pt_BR.json index 8cf7a50ab24..852dac798ba 100644 --- a/apps/dav/l10n/pt_BR.json +++ b/apps/dav/l10n/pt_BR.json @@ -154,6 +154,9 @@ "Saturday" : "Sábado ", "Sunday" : "Domingo", "Save" : "Salvar", + "Failed to load availability" : "Falha ao carregar a disponibilidade", + "Saved availability" : "Disponibilidade salva", + "Failed to save availability" : "Falha ao salvar a disponibilidade", "Calendar server" : "Servidor de calendário", "Send invitations to attendees" : "Enviar convites aos participantes", "Automatically generate a birthday calendar" : "Gerar um calendário de aniversários automaticamente", diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 3253d41a5cd..8bdc084cd7b 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -1139,7 +1139,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription */ public function getCalendarObject($calendarId, $objectUri, int $calendarType = self::CALENDAR_TYPE_CALENDAR) { $query = $this->db->getQueryBuilder(); - $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification']) + $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification', 'deleted_at']) ->from('calendarobjects') ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))) ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri))) @@ -1161,7 +1161,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription 'size' => (int)$row['size'], 'calendardata' => $this->readBlob($row['calendardata']), 'component' => strtolower($row['componenttype']), - 'classification' => (int)$row['classification'] + 'classification' => (int)$row['classification'], + '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_NEXTCLOUD . '}deleted-at' => $row['deleted_at'] === null ? $row['deleted_at'] : (int) $row['deleted_at'], ]; } diff --git a/apps/dav/lib/CalDAV/Reminder/ReminderService.php b/apps/dav/lib/CalDAV/Reminder/ReminderService.php index b33bc8a175a..2a065469052 100644 --- a/apps/dav/lib/CalDAV/Reminder/ReminderService.php +++ b/apps/dav/lib/CalDAV/Reminder/ReminderService.php @@ -38,6 +38,7 @@ use OCP\IGroup; use OCP\IGroupManager; use OCP\IUser; use OCP\IUserManager; +use Psr\Log\LoggerInterface; use Sabre\VObject; use Sabre\VObject\Component\VAlarm; use Sabre\VObject\Component\VEvent; @@ -46,6 +47,7 @@ use Sabre\VObject\ParseException; use Sabre\VObject\Recur\EventIterator; use Sabre\VObject\Recur\MaxInstancesExceededException; use Sabre\VObject\Recur\NoInstancesException; +use function count; use function strcasecmp; class ReminderService { @@ -71,6 +73,9 @@ class ReminderService { /** @var IConfig */ private $config; + /** @var LoggerInterface */ + private $logger; + public const REMINDER_TYPE_EMAIL = 'EMAIL'; public const REMINDER_TYPE_DISPLAY = 'DISPLAY'; public const REMINDER_TYPE_AUDIO = 'AUDIO'; @@ -86,24 +91,14 @@ class ReminderService { self::REMINDER_TYPE_AUDIO ]; - /** - * ReminderService constructor. - * - * @param Backend $backend - * @param NotificationProviderManager $notificationProviderManager - * @param IUserManager $userManager - * @param IGroupManager $groupManager - * @param CalDavBackend $caldavBackend - * @param ITimeFactory $timeFactory - * @param IConfig $config - */ public function __construct(Backend $backend, NotificationProviderManager $notificationProviderManager, IUserManager $userManager, IGroupManager $groupManager, CalDavBackend $caldavBackend, ITimeFactory $timeFactory, - IConfig $config) { + IConfig $config, + LoggerInterface $logger) { $this->backend = $backend; $this->notificationProviderManager = $notificationProviderManager; $this->userManager = $userManager; @@ -111,6 +106,7 @@ class ReminderService { $this->caldavBackend = $caldavBackend; $this->timeFactory = $timeFactory; $this->config = $config; + $this->logger = $logger; } /** @@ -119,8 +115,11 @@ class ReminderService { * @throws NotificationProvider\ProviderNotAvailableException * @throws NotificationTypeDoesNotExistException */ - public function processReminders():void { + public function processReminders() :void { $reminders = $this->backend->getRemindersToProcess(); + $this->logger->debug('{numReminders} reminders to process', [ + 'numReminders' => count($reminders), + ]); foreach ($reminders as $reminder) { $calendarData = is_resource($reminder['calendardata']) @@ -133,22 +132,34 @@ class ReminderService { $vcalendar = $this->parseCalendarData($calendarData); if (!$vcalendar) { + $this->logger->debug('Reminder {id} does not belong to a valid calendar', [ + 'id' => $reminder['id'], + ]); $this->backend->removeReminder($reminder['id']); continue; } $vevent = $this->getVEventByRecurrenceId($vcalendar, $reminder['recurrence_id'], $reminder['is_recurrence_exception']); if (!$vevent) { + $this->logger->debug('Reminder {id} does not belong to a valid event', [ + 'id' => $reminder['id'], + ]); $this->backend->removeReminder($reminder['id']); continue; } if ($this->wasEventCancelled($vevent)) { + $this->logger->debug('Reminder {id} belongs to a cancelled event', [ + 'id' => $reminder['id'], + ]); $this->deleteOrProcessNext($reminder, $vevent); continue; } if (!$this->notificationProviderManager->hasProvider($reminder['type'])) { + $this->logger->debug('Reminder {id} does not belong to a valid notification provider', [ + 'id' => $reminder['id'], + ]); $this->deleteOrProcessNext($reminder, $vevent); continue; } @@ -164,6 +175,10 @@ class ReminderService { $users[] = $user; } + $this->logger->debug('Reminder {id} will be sent to {numUsers} users', [ + 'id' => $reminder['id'], + 'numUsers' => count($users), + ]); $notificationProvider = $this->notificationProviderManager->getProvider($reminder['type']); $notificationProvider->send($vevent, $reminder['displayname'], $users); diff --git a/apps/dav/lib/CardDAV/PhotoCache.php b/apps/dav/lib/CardDAV/PhotoCache.php index 777a0b0e169..101111f9310 100644 --- a/apps/dav/lib/CardDAV/PhotoCache.php +++ b/apps/dav/lib/CardDAV/PhotoCache.php @@ -133,7 +133,7 @@ class PhotoCache { throw new NotFoundException; } - $photo = new \OC_Image(); + $photo = new \OCP\Image(); /** @var ISimpleFile $file */ $file = $folder->getFile('photo.' . $ext); $photo->loadFromData($file->getContent()); diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php index 37fb109a3bd..ebcfdabc6b3 100644 --- a/apps/dav/lib/Connector/Sabre/File.php +++ b/apps/dav/lib/Connector/Sabre/File.php @@ -215,15 +215,26 @@ class File extends Node implements IFile { $data = $tmpData; } - $data = HashWrapper::wrap($data, 'md5', function ($hash) { - $this->header('X-Hash-MD5: ' . $hash); - }); - $data = HashWrapper::wrap($data, 'sha1', function ($hash) { - $this->header('X-Hash-SHA1: ' . $hash); - }); - $data = HashWrapper::wrap($data, 'sha256', function ($hash) { - $this->header('X-Hash-SHA256: ' . $hash); - }); + if ($this->request->getHeader('X-HASH') !== '') { + $hash = $this->request->getHeader('X-HASH'); + if ($hash === 'all' || $hash === 'md5') { + $data = HashWrapper::wrap($data, 'md5', function ($hash) { + $this->header('X-Hash-MD5: ' . $hash); + }); + } + + if ($hash === 'all' || $hash === 'sha1') { + $data = HashWrapper::wrap($data, 'sha1', function ($hash) { + $this->header('X-Hash-SHA1: ' . $hash); + }); + } + + if ($hash === 'all' || $hash === 'sha256') { + $data = HashWrapper::wrap($data, 'sha256', function ($hash) { + $this->header('X-Hash-SHA256: ' . $hash); + }); + } + } if ($partStorage->instanceOfStorage(Storage\IWriteStreamStorage::class)) { $isEOF = false; diff --git a/apps/dav/lib/UserMigration/CalendarMigrator.php b/apps/dav/lib/UserMigration/CalendarMigrator.php index 015ce6faa86..057f7dce77d 100644 --- a/apps/dav/lib/UserMigration/CalendarMigrator.php +++ b/apps/dav/lib/UserMigration/CalendarMigrator.php @@ -42,6 +42,7 @@ use OCP\IUser; use OCP\UserMigration\IExportDestination; use OCP\UserMigration\IImportSource; use OCP\UserMigration\IMigrator; +use OCP\UserMigration\ISizeEstimationMigrator; use OCP\UserMigration\TMigratorBasicVersionHandling; use Sabre\VObject\Component as VObjectComponent; use Sabre\VObject\Component\VCalendar; @@ -50,10 +51,11 @@ use Sabre\VObject\Property\ICalendar\DateTime; use Sabre\VObject\Reader as VObjectReader; use Sabre\VObject\UUIDUtil; use Safe\Exceptions\StringsException; +use Symfony\Component\Console\Output\NullOutput; use Symfony\Component\Console\Output\OutputInterface; use Throwable; -class CalendarMigrator implements IMigrator { +class CalendarMigrator implements IMigrator, ISizeEstimationMigrator { use TMigratorBasicVersionHandling; @@ -209,6 +211,31 @@ class CalendarMigrator implements IMigrator { /** * {@inheritDoc} */ + public function getEstimatedExportSize(IUser $user): int { + $calendarExports = $this->getCalendarExports($user, new NullOutput()); + $calendarCount = count($calendarExports); + + // 150B for top-level properties + $size = ($calendarCount * 150) / 1024; + + $componentCount = array_sum(array_map( + function (array $data): int { + /** @var VCalendar $vCalendar */ + $vCalendar = $data['vCalendar']; + return count($vCalendar->getComponents()); + }, + $calendarExports, + )); + + // 450B for each component (events, todos, alarms, etc.) + $size += ($componentCount * 450) / 1024; + + return (int)ceil($size); + } + + /** + * {@inheritDoc} + */ public function export(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void { $output->writeln('Exporting calendars into ' . CalendarMigrator::EXPORT_ROOT . '…'); diff --git a/apps/dav/lib/UserMigration/ContactsMigrator.php b/apps/dav/lib/UserMigration/ContactsMigrator.php index aed41e5c82f..ae1a61ce4f4 100644 --- a/apps/dav/lib/UserMigration/ContactsMigrator.php +++ b/apps/dav/lib/UserMigration/ContactsMigrator.php @@ -39,6 +39,7 @@ use OCP\IUser; use OCP\UserMigration\IExportDestination; use OCP\UserMigration\IImportSource; use OCP\UserMigration\IMigrator; +use OCP\UserMigration\ISizeEstimationMigrator; use OCP\UserMigration\TMigratorBasicVersionHandling; use Sabre\VObject\Component\VCard; use Sabre\VObject\Parser\Parser as VObjectParser; @@ -47,10 +48,11 @@ use Sabre\VObject\Splitter\VCard as VCardSplitter; use Sabre\VObject\UUIDUtil; use Safe\Exceptions\ArrayException; use Safe\Exceptions\StringsException; +use Symfony\Component\Console\Output\NullOutput; use Symfony\Component\Console\Output\OutputInterface; use Throwable; -class ContactsMigrator implements IMigrator { +class ContactsMigrator implements IMigrator, ISizeEstimationMigrator { use TMigratorBasicVersionHandling; @@ -196,6 +198,27 @@ class ContactsMigrator implements IMigrator { /** * {@inheritDoc} */ + public function getEstimatedExportSize(IUser $user): int { + $addressBookExports = $this->getAddressBookExports($user, new NullOutput()); + $addressBookCount = count($addressBookExports); + + // 50B for each metadata JSON + $size = ($addressBookCount * 50) / 1024; + + $contactsCount = array_sum(array_map( + fn (array $data): int => count($data['vCards']), + $addressBookExports, + )); + + // 350B for each contact + $size += ($contactsCount * 350) / 1024; + + return (int)ceil($size); + } + + /** + * {@inheritDoc} + */ public function export(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void { $output->writeln('Exporting contacts into ' . ContactsMigrator::PATH_ROOT . '…'); diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php index 3a5cf56409c..a6439ee6d2b 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -35,6 +35,7 @@ use DateTime; use DateTimeZone; use OCA\DAV\CalDAV\CalDavBackend; use OCA\DAV\CalDAV\Calendar; +use OCA\DAV\DAV\Sharing\Plugin as SharingPlugin; use OCA\DAV\Events\CalendarDeletedEvent; use OCP\IConfig; use OCP\IL10N; @@ -232,13 +233,13 @@ EOD; ->method('dispatchTyped'); $this->backend->createCalendarObject($calendarId, $uri, $calData); - // get all the cards + // get all the calendar objects $calendarObjects = $this->backend->getCalendarObjects($calendarId); $this->assertCount(1, $calendarObjects); $this->assertEquals($calendarId, $calendarObjects[0]['calendarid']); $this->assertArrayHasKey('classification', $calendarObjects[0]); - // get the cards + // get the calendar objects $calendarObject = $this->backend->getCalendarObject($calendarId, $uri); $this->assertNotNull($calendarObject); $this->assertArrayHasKey('id', $calendarObject); @@ -247,6 +248,7 @@ EOD; $this->assertArrayHasKey('etag', $calendarObject); $this->assertArrayHasKey('size', $calendarObject); $this->assertArrayHasKey('classification', $calendarObject); + $this->assertArrayHasKey('{' . SharingPlugin::NS_NEXTCLOUD . '}deleted-at', $calendarObject); $this->assertEquals($calData, $calendarObject['calendardata']); // update the card diff --git a/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php b/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php index 39fbf1c79ff..6242e8d0355 100644 --- a/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php +++ b/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php @@ -39,37 +39,39 @@ use OCP\IGroupManager; use OCP\IUser; use OCP\IUserManager; use OCP\IUserSession; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; use Test\TestCase; class ReminderServiceTest extends TestCase { - /** @var Backend|\PHPUnit\Framework\MockObject\MockObject */ + /** @var Backend|MockObject */ private $backend; - /** @var NotificationProviderManager|\PHPUnit\Framework\MockObject\MockObject */ + /** @var NotificationProviderManager|MockObject */ private $notificationProviderManager; - /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IUserManager|MockObject */ private $userManager; - /** @var IGroupManager|\PHPUnit\Framework\MockObject\MockObject*/ + /** @var IGroupManager|MockObject*/ private $groupManager; - /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */ - private $userSession; - - /** @var CalDavBackend|\PHPUnit\Framework\MockObject\MockObject */ + /** @var CalDavBackend|MockObject */ private $caldavBackend; - /** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject */ + /** @var ITimeFactory|MockObject */ private $timeFactory; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IConfig|MockObject */ private $config; /** @var ReminderService */ private $reminderService; + /** @var MockObject|LoggerInterface */ + private $logger; + public const CALENDAR_DATA = <<<EOD BEGIN:VCALENDAR PRODID:-//Nextcloud calendar v1.6.4 @@ -199,16 +201,20 @@ EOD; $this->caldavBackend = $this->createMock(CalDavBackend::class); $this->timeFactory = $this->createMock(ITimeFactory::class); $this->config = $this->createMock(IConfig::class); + $this->logger = $this->createMock(LoggerInterface::class); $this->caldavBackend->method('getShares')->willReturn([]); - $this->reminderService = new ReminderService($this->backend, + $this->reminderService = new ReminderService( + $this->backend, $this->notificationProviderManager, $this->userManager, $this->groupManager, $this->caldavBackend, $this->timeFactory, - $this->config); + $this->config, + $this->logger, + ); } public function testOnCalendarObjectDelete():void { diff --git a/apps/dav/tests/unit/Listener/ActivityUpdaterListenerTest.php b/apps/dav/tests/unit/Listener/ActivityUpdaterListenerTest.php new file mode 100644 index 00000000000..03c4046991c --- /dev/null +++ b/apps/dav/tests/unit/Listener/ActivityUpdaterListenerTest.php @@ -0,0 +1,104 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright 2022 Thomas Citharel <nextcloud@tcit.fr> + * + * @author Thomas Citharel <nextcloud@tcit.fr> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\DAV\Tests\Unit\Listener; + +use OCA\DAV\CalDAV\Activity\Backend as ActivityBackend; +use OCA\DAV\CalDAV\Activity\Provider\Event; +use OCA\DAV\DAV\Sharing\Plugin as SharingPlugin; +use OCA\DAV\Events\CalendarDeletedEvent; +use OCA\DAV\Events\CalendarObjectDeletedEvent; +use OCA\DAV\Listener\ActivityUpdaterListener; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; +use Test\TestCase; + +class ActivityUpdaterListenerTest extends TestCase { + + /** @var ActivityBackend|MockObject */ + private $activityBackend; + /** @var LoggerInterface|MockObject */ + private $logger; + /** @var ActivityUpdaterListener */ + private ActivityUpdaterListener $listener; + + protected function setUp(): void { + parent::setUp(); + + $this->activityBackend = $this->createMock(ActivityBackend::class); + $this->logger = $this->createMock(LoggerInterface::class); + + $this->listener = new ActivityUpdaterListener( + $this->activityBackend, + $this->logger + ); + } + + /** + * @dataProvider dataForTestHandleCalendarObjectDeletedEvent + */ + public function testHandleCalendarObjectDeletedEvent(int $calendarId, array $calendarData, array $shares, array $objectData, bool $createsActivity): void { + $event = new CalendarObjectDeletedEvent($calendarId, $calendarData, $shares, $objectData); + $this->logger->expects($this->once())->method('debug')->with( + $createsActivity ? "Activity generated for deleted calendar object in calendar $calendarId" : "Calendar object in calendar $calendarId was already in trashbin, skipping deletion activity" + ); + $this->activityBackend->expects($createsActivity ? $this->once() : $this->never())->method('onTouchCalendarObject')->with( + Event::SUBJECT_OBJECT_DELETE, + $calendarData, + $shares, + $objectData + ); + $this->listener->handle($event); + } + + public function dataForTestHandleCalendarObjectDeletedEvent(): array { + return [ + [1, [], [], [], true], + [1, [], [], ['{' . SharingPlugin::NS_NEXTCLOUD . '}deleted-at' => 120], false], + ]; + } + + /** + * @dataProvider dataForTestHandleCalendarDeletedEvent + */ + public function testHandleCalendarDeletedEvent(int $calendarId, array $calendarData, array $shares, bool $createsActivity): void { + $event = new CalendarDeletedEvent($calendarId, $calendarData, $shares); + $this->logger->expects($this->once())->method('debug')->with( + $createsActivity ? "Activity generated for deleted calendar $calendarId" : "Calendar $calendarId was already in trashbin, skipping deletion activity" + ); + $this->activityBackend->expects($createsActivity ? $this->once() : $this->never())->method('onCalendarDelete')->with( + $calendarData, + $shares + ); + $this->listener->handle($event); + } + + public function dataForTestHandleCalendarDeletedEvent(): array { + return [ + [1, [], [], true], + [1, ['{' . SharingPlugin::NS_NEXTCLOUD . '}deleted-at' => 120], [], false], + ]; + } +} diff --git a/apps/federatedfilesharing/l10n/pt_BR.js b/apps/federatedfilesharing/l10n/pt_BR.js index fe817540425..2c30443e2e4 100644 --- a/apps/federatedfilesharing/l10n/pt_BR.js +++ b/apps/federatedfilesharing/l10n/pt_BR.js @@ -44,6 +44,7 @@ OC.L10N.register( "Allow users on this server to receive group shares from other servers" : "Permitir que usuários deste servidor recebam compartilhamentos de grupos de outros servidores", "Search global and public address book for users" : "Procurar por usuários em catálogo de endereços global e público", "Allow users to publish their data to a global and public address book" : "Permitir que os usuários publiquem seus dados em um catálogo de endereços global e público", + "Unable to update federated files sharing config" : "Não é possível atualizar a configuração de compartilhamento de arquivos federados", "Federated Cloud" : "Nuvem Federada", "Open documentation" : "Abrir documentação", "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Você pode compartilhar com qualquer pessoa que use Nextcloud ou outros servidores compatíveis com o Open Cloud Mesh (OCM)! Basta colocar sua ID de nuvem federada na caixa de diálogo de compartilhamento. Algo como person@cloud.example.com", diff --git a/apps/federatedfilesharing/l10n/pt_BR.json b/apps/federatedfilesharing/l10n/pt_BR.json index d937ee0fad7..a2092cc4d75 100644 --- a/apps/federatedfilesharing/l10n/pt_BR.json +++ b/apps/federatedfilesharing/l10n/pt_BR.json @@ -42,6 +42,7 @@ "Allow users on this server to receive group shares from other servers" : "Permitir que usuários deste servidor recebam compartilhamentos de grupos de outros servidores", "Search global and public address book for users" : "Procurar por usuários em catálogo de endereços global e público", "Allow users to publish their data to a global and public address book" : "Permitir que os usuários publiquem seus dados em um catálogo de endereços global e público", + "Unable to update federated files sharing config" : "Não é possível atualizar a configuração de compartilhamento de arquivos federados", "Federated Cloud" : "Nuvem Federada", "Open documentation" : "Abrir documentação", "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Você pode compartilhar com qualquer pessoa que use Nextcloud ou outros servidores compatíveis com o Open Cloud Mesh (OCM)! Basta colocar sua ID de nuvem federada na caixa de diálogo de compartilhamento. Algo como person@cloud.example.com", diff --git a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php index 831b9b59b54..7d9b2486080 100644 --- a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php +++ b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php @@ -548,11 +548,7 @@ class FederatedShareProviderTest extends \Test\TestCase { $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); - $this->addressHandler->expects($this->at(0))->method('splitUserRemote') - ->willReturn(['user', 'server.com']); - - $this->addressHandler->expects($this->at(1))->method('splitUserRemote') - ->willReturn(['user2', 'server.com']); + $this->addressHandler->expects($this->never())->method('splitUserRemote'); $this->addressHandler->method('generateRemoteURL') ->willReturn('remoteurl.com'); diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 2086f2da55a..8b5647924fd 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -41,6 +41,8 @@ OC.L10N.register( "Details" : "Detalhes", "Please select tag(s) to add to the selection" : "Selecione a(s) etiquetas(s) para adicionar à seleção ", "Apply tag(s) to selection" : "Aplicar as etiqueta(s) a seleção", + "Select directory \"{dirName}\"" : "Selecione o diretório \"{dirName}\"", + "Select file \"{fileName}\"" : "Selecione o arquivo \"{fileName}\"", "Pending" : "Pendente", "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index 543d3e141d7..c6f41174687 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -39,6 +39,8 @@ "Details" : "Detalhes", "Please select tag(s) to add to the selection" : "Selecione a(s) etiquetas(s) para adicionar à seleção ", "Apply tag(s) to selection" : "Aplicar as etiqueta(s) a seleção", + "Select directory \"{dirName}\"" : "Selecione o diretório \"{dirName}\"", + "Select file \"{fileName}\"" : "Selecione o arquivo \"{fileName}\"", "Pending" : "Pendente", "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js index 8e9580a41a3..d66516edc33 100644 --- a/apps/files/l10n/ro.js +++ b/apps/files/l10n/ro.js @@ -131,6 +131,7 @@ OC.L10N.register( "Accept" : "Accept", "in %s" : "în %s", "File Management" : "Management fișiere", + "Change" : "Modificare", "Transfer" : "Transfer", "Tags" : "Etichete", "Cancel" : "Anulare", diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json index 63aa8d1bba6..c2eaa67fe5f 100644 --- a/apps/files/l10n/ro.json +++ b/apps/files/l10n/ro.json @@ -129,6 +129,7 @@ "Accept" : "Accept", "in %s" : "în %s", "File Management" : "Management fișiere", + "Change" : "Modificare", "Transfer" : "Transfer", "Tags" : "Etichete", "Cancel" : "Anulare", diff --git a/apps/files_sharing/src/components/SharePermissionsEditor.vue b/apps/files_sharing/src/components/SharePermissionsEditor.vue index 9c0a2378af8..1dfab4112b3 100644 --- a/apps/files_sharing/src/components/SharePermissionsEditor.vue +++ b/apps/files_sharing/src/components/SharePermissionsEditor.vue @@ -163,9 +163,10 @@ export default { case this.atomicPermissions.DELETE: return this.t('files_sharing', 'Delete') default: - return '' + return null } }) + .filter(permissionLabel => permissionLabel !== null) .join(', ') }, diff --git a/apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php b/apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php index dbc6267eb3a..9c0334aa2f3 100644 --- a/apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php +++ b/apps/files_trashbin/lib/UserMigration/TrashbinMigrator.php @@ -36,11 +36,12 @@ use OCP\IUser; use OCP\UserMigration\IExportDestination; use OCP\UserMigration\IImportSource; use OCP\UserMigration\IMigrator; +use OCP\UserMigration\ISizeEstimationMigrator; use OCP\UserMigration\TMigratorBasicVersionHandling; use OCP\UserMigration\UserMigrationException; use Symfony\Component\Console\Output\OutputInterface; -class TrashbinMigrator implements IMigrator { +class TrashbinMigrator implements IMigrator, ISizeEstimationMigrator { use TMigratorBasicVersionHandling; @@ -66,6 +67,23 @@ class TrashbinMigrator implements IMigrator { /** * {@inheritDoc} */ + public function getEstimatedExportSize(IUser $user): int { + $uid = $user->getUID(); + + try { + $trashbinFolder = $this->root->get('/'.$uid.'/files_trashbin'); + if (!$trashbinFolder instanceof Folder) { + return 0; + } + return (int)ceil($trashbinFolder->getSize() / 1024); + } catch (\Throwable $e) { + return 0; + } + } + + /** + * {@inheritDoc} + */ public function export(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void { $output->writeln('Exporting trashbin into ' . Application::APP_ID . '…'); diff --git a/apps/settings/l10n/eu.js b/apps/settings/l10n/eu.js index 819f5d59b2e..69a539c99e1 100644 --- a/apps/settings/l10n/eu.js +++ b/apps/settings/l10n/eu.js @@ -56,6 +56,7 @@ OC.L10N.register( "Couldn't remove app." : "Ezin izan da aplikazioa kendu.", "Couldn't update app." : "Ezin izan da aplikazioa eguneratu.", "Wrong password" : "Pasahitz okerra", + "Unable to change personal password" : "Ezin izan da pasahitz pertsonala aldatu", "Saved" : "Gordeta", "No user supplied" : "Ez da erabiltzailerik zehaztu", "Authentication error" : "Autentifikazio errorea", @@ -127,6 +128,7 @@ OC.L10N.register( "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Inportatutako erabiltzaile SSL ziurtagiriak egiaztatzen dituen atzeko planeko lana dago zain. Egiaztatu berriro geroago.", "There are some user 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." : "Badira inportatutako zenbait erabiltzaile SSL ziurtagiri, jada erabiltzen ez direnak Nextcloud 21-ekin. Komando lerroan inportatu daitezke \"occ security: certificates: import\" komandoaren bidez. Datuen direktorioaren barruan dituzten bideak behean agertzen dira.", "The old server-side-encryption format is enabled. We recommend disabling this." : "Zerbitzariaren aldeko enkriptatze formatu zaharra gaituta dago. Hau desgaitzea gomendatzen dugu.", + "Profile information" : "Profilaren informazioa", "Nextcloud settings" : "Nextcloud ezarpenak", "Administration privileges" : "Administrazio pribilegioak", "Here you can decide which group can access certain sections of the administration settings." : "Hemen administratzaile ezarpeneko hainbat sekziotan sartu daitezkeen taldeak erabaki ditzakezu.", @@ -163,6 +165,7 @@ OC.L10N.register( "Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Nabarmendutako aplikazioak, komunitateak eta komunitatean garatutakoak dira. Funtzionalitate orokorrak eskaintzen dituzte eta produkzioan erabiltzeko prest daude.", "Featured" : "Nabarmendua", "Update to {update}" : "Eguneratu {update} bertsiora", + "All apps are up-to-date." : "Aplikazio guztiak eguneratuta daude.", "Results from other categories" : "Beste kategoriatako emaitzak", "No apps found for your version" : "Ez dira aplikaziorik aurkitu zure bertsiorako", "Disable all" : "Desgaitu guztia", @@ -212,6 +215,9 @@ OC.L10N.register( "Copy" : "Kopiatu", "Could not copy app password. Please copy it manually." : "Ezin izan da aplikazioaren pasahitza kopiatu. Kopia ezazu eskuz, mesedez.", "Background job didn’t run yet!" : "Atzeko planoko lana ez da martxan jarri oraindik!", + "AJAX" : "AJAX", + "Webcron" : "Webcron", + "Cron (Recommended)" : "Cron (Gomendatuta)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Hau exekutatzeko PHP POSIX luzapena behar duzu. {linkstart}PHP dokumentazioa{linkend} ikusi informazio gehiagorako", "Profile" : "Profila", "Enable" : "Gaitu", @@ -317,6 +323,7 @@ OC.L10N.register( "Updates" : "Eguneraketak", "App bundles" : "Aplikazio sortak", "Featured apps" : "App aipagarriak", + "For the server to work properly, it" : "Zerbitzariak ondo funtziona dezan,", "Details" : "Xehetasunak", "Changelog" : "Aldaketak", "by {author}\n{license}" : "{autor}-(e)k egina\n{license}", diff --git a/apps/settings/l10n/eu.json b/apps/settings/l10n/eu.json index 91696673c18..95e686d9f57 100644 --- a/apps/settings/l10n/eu.json +++ b/apps/settings/l10n/eu.json @@ -54,6 +54,7 @@ "Couldn't remove app." : "Ezin izan da aplikazioa kendu.", "Couldn't update app." : "Ezin izan da aplikazioa eguneratu.", "Wrong password" : "Pasahitz okerra", + "Unable to change personal password" : "Ezin izan da pasahitz pertsonala aldatu", "Saved" : "Gordeta", "No user supplied" : "Ez da erabiltzailerik zehaztu", "Authentication error" : "Autentifikazio errorea", @@ -125,6 +126,7 @@ "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Inportatutako erabiltzaile SSL ziurtagiriak egiaztatzen dituen atzeko planeko lana dago zain. Egiaztatu berriro geroago.", "There are some user 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." : "Badira inportatutako zenbait erabiltzaile SSL ziurtagiri, jada erabiltzen ez direnak Nextcloud 21-ekin. Komando lerroan inportatu daitezke \"occ security: certificates: import\" komandoaren bidez. Datuen direktorioaren barruan dituzten bideak behean agertzen dira.", "The old server-side-encryption format is enabled. We recommend disabling this." : "Zerbitzariaren aldeko enkriptatze formatu zaharra gaituta dago. Hau desgaitzea gomendatzen dugu.", + "Profile information" : "Profilaren informazioa", "Nextcloud settings" : "Nextcloud ezarpenak", "Administration privileges" : "Administrazio pribilegioak", "Here you can decide which group can access certain sections of the administration settings." : "Hemen administratzaile ezarpeneko hainbat sekziotan sartu daitezkeen taldeak erabaki ditzakezu.", @@ -161,6 +163,7 @@ "Featured apps are developed by and within the community. They offer central functionality and are ready for production use." : "Nabarmendutako aplikazioak, komunitateak eta komunitatean garatutakoak dira. Funtzionalitate orokorrak eskaintzen dituzte eta produkzioan erabiltzeko prest daude.", "Featured" : "Nabarmendua", "Update to {update}" : "Eguneratu {update} bertsiora", + "All apps are up-to-date." : "Aplikazio guztiak eguneratuta daude.", "Results from other categories" : "Beste kategoriatako emaitzak", "No apps found for your version" : "Ez dira aplikaziorik aurkitu zure bertsiorako", "Disable all" : "Desgaitu guztia", @@ -210,6 +213,9 @@ "Copy" : "Kopiatu", "Could not copy app password. Please copy it manually." : "Ezin izan da aplikazioaren pasahitza kopiatu. Kopia ezazu eskuz, mesedez.", "Background job didn’t run yet!" : "Atzeko planoko lana ez da martxan jarri oraindik!", + "AJAX" : "AJAX", + "Webcron" : "Webcron", + "Cron (Recommended)" : "Cron (Gomendatuta)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Hau exekutatzeko PHP POSIX luzapena behar duzu. {linkstart}PHP dokumentazioa{linkend} ikusi informazio gehiagorako", "Profile" : "Profila", "Enable" : "Gaitu", @@ -315,6 +321,7 @@ "Updates" : "Eguneraketak", "App bundles" : "Aplikazio sortak", "Featured apps" : "App aipagarriak", + "For the server to work properly, it" : "Zerbitzariak ondo funtziona dezan,", "Details" : "Xehetasunak", "Changelog" : "Aldaketak", "by {author}\n{license}" : "{autor}-(e)k egina\n{license}", diff --git a/apps/settings/l10n/pt_BR.js b/apps/settings/l10n/pt_BR.js index d0ccfbfefd9..186ca6b345a 100644 --- a/apps/settings/l10n/pt_BR.js +++ b/apps/settings/l10n/pt_BR.js @@ -139,6 +139,9 @@ OC.L10N.register( "There are some user 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." : "Existem alguns certificados SSL importados pelo usuário presentes, que não são mais usados com o Nextcloud 21. Eles podem ser importados na linha de comando através do comando \"occ security:certificates:import\". Seus caminhos dentro do diretório de dados são mostrados abaixo.", "Invalid UUIDs of LDAP users or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "UUIDs inválidos de usuários ou grupos LDAP foram encontrados. Revise suas configurações de \"Substituir detecção de UUID\" na parte Expert da configuração LDAP e use \"occ ldap:update-uuid\" para atualizá-las.", "The old server-side-encryption format is enabled. We recommend disabling this." : "O antigo formato de criptografia do lado do servidor está ativado. Recomendamos desativar isso.", + "MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "A versão do MariaDB \"1%s\" está sendo usada. Nextcloud 21 e superior não suportam esta versão e requerem MariaDB 10.2 ou superior.", + "MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "A versão do MySQL \"1%s\" está sendo usada. Nextcloud 21 e superior não suportam esta versão e requerem MySQL 8.0 ou MariaDB 10.2 ou superior.", + "PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "A versão do PostgreSQL \"1%s\" está sendo usada. Nextcloud 21 e superior não suportam esta versão e requerem o PostgreSQL 9.6 ou superior.", "Profile information" : "Informação do Perfil", "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Foto do perfil, nome completo, e-mail, número de telefone, endereço, site, Twitter, organização, função, título, biografia e se seu perfil está ativado", "Nextcloud settings" : "Configurações Nextcloud", @@ -227,11 +230,18 @@ OC.L10N.register( "Copied!" : "Copiado!", "Copy" : "Copiar", "Could not copy app password. Please copy it manually." : "Não foi possível copiar a senha do aplicativo. Copie-a manualmente.", + "Last job execution ran {time}. Something seems wrong." : "A última execução do trabalho foi executada {time}. Algo parece errado.", + "Last job ran {relativeTime}." : "A última tarefa foi executada {relativeTime}.", "Background job didn’t run yet!" : "O job em segundo plano ainda não rodou!", + "AJAX" : "AJAX", "Execute one task with each page loaded. Use case: Single user instance." : "Execute uma tarefa com cada página carregada. Caso de uso: instância de usuário único.", + "Webcron" : "Webcron", "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 users depending on the usage)." : "cron.php é registrado em um serviço webcron para chamar cron.php a cada 5 minutos por HTTP. Caso de uso: instância muito pequena (1–5 usuários dependendo do uso).", + "Cron (Recommended)" : "Cron (Recomendado)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Para executar isso, você precisa da extensão PHP POSIX. Veja a {linkstart} documentação do PHP {linkend} para mais detalhes.", "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "Use o serviço cron do sistema para chamar o arquivo cron.php a cada 5 minutos. Recomendado para todas as instâncias.", + "The cron.php needs to be executed by the system user \"{user}\"." : "O cron.php precisa ser executado pelo usuário do sistema \"{user}\".", + "Unable to update background job mode" : "Não foi possível atualizar o modo de trabalho em segundo plano", "Profile" : "Perfil", "Enable or disable profile by default for new users." : "Habilite ou desabilite o perfil por padrão para novos usuários.", "Enable" : "Ativar", @@ -339,6 +349,7 @@ OC.L10N.register( "Updates" : "Atualizações", "App bundles" : "Pacotes de aplicativos", "Featured apps" : "Aplicativos em destaque", + "For the server to work properly, it" : "Para que o servidor funcione corretamente, isto", "Details" : "Detalhes", "Changelog" : "Changelog", "by {author}\n{license}" : "por {author}\n{license}", diff --git a/apps/settings/l10n/pt_BR.json b/apps/settings/l10n/pt_BR.json index a2f19143830..44abcc58626 100644 --- a/apps/settings/l10n/pt_BR.json +++ b/apps/settings/l10n/pt_BR.json @@ -137,6 +137,9 @@ "There are some user 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." : "Existem alguns certificados SSL importados pelo usuário presentes, que não são mais usados com o Nextcloud 21. Eles podem ser importados na linha de comando através do comando \"occ security:certificates:import\". Seus caminhos dentro do diretório de dados são mostrados abaixo.", "Invalid UUIDs of LDAP users or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "UUIDs inválidos de usuários ou grupos LDAP foram encontrados. Revise suas configurações de \"Substituir detecção de UUID\" na parte Expert da configuração LDAP e use \"occ ldap:update-uuid\" para atualizá-las.", "The old server-side-encryption format is enabled. We recommend disabling this." : "O antigo formato de criptografia do lado do servidor está ativado. Recomendamos desativar isso.", + "MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "A versão do MariaDB \"1%s\" está sendo usada. Nextcloud 21 e superior não suportam esta versão e requerem MariaDB 10.2 ou superior.", + "MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "A versão do MySQL \"1%s\" está sendo usada. Nextcloud 21 e superior não suportam esta versão e requerem MySQL 8.0 ou MariaDB 10.2 ou superior.", + "PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "A versão do PostgreSQL \"1%s\" está sendo usada. Nextcloud 21 e superior não suportam esta versão e requerem o PostgreSQL 9.6 ou superior.", "Profile information" : "Informação do Perfil", "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Foto do perfil, nome completo, e-mail, número de telefone, endereço, site, Twitter, organização, função, título, biografia e se seu perfil está ativado", "Nextcloud settings" : "Configurações Nextcloud", @@ -225,11 +228,18 @@ "Copied!" : "Copiado!", "Copy" : "Copiar", "Could not copy app password. Please copy it manually." : "Não foi possível copiar a senha do aplicativo. Copie-a manualmente.", + "Last job execution ran {time}. Something seems wrong." : "A última execução do trabalho foi executada {time}. Algo parece errado.", + "Last job ran {relativeTime}." : "A última tarefa foi executada {relativeTime}.", "Background job didn’t run yet!" : "O job em segundo plano ainda não rodou!", + "AJAX" : "AJAX", "Execute one task with each page loaded. Use case: Single user instance." : "Execute uma tarefa com cada página carregada. Caso de uso: instância de usuário único.", + "Webcron" : "Webcron", "cron.php is registered at a webcron service to call cron.php every 5 minutes over HTTP. Use case: Very small instance (1–5 users depending on the usage)." : "cron.php é registrado em um serviço webcron para chamar cron.php a cada 5 minutos por HTTP. Caso de uso: instância muito pequena (1–5 usuários dependendo do uso).", + "Cron (Recommended)" : "Cron (Recomendado)", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Para executar isso, você precisa da extensão PHP POSIX. Veja a {linkstart} documentação do PHP {linkend} para mais detalhes.", "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "Use o serviço cron do sistema para chamar o arquivo cron.php a cada 5 minutos. Recomendado para todas as instâncias.", + "The cron.php needs to be executed by the system user \"{user}\"." : "O cron.php precisa ser executado pelo usuário do sistema \"{user}\".", + "Unable to update background job mode" : "Não foi possível atualizar o modo de trabalho em segundo plano", "Profile" : "Perfil", "Enable or disable profile by default for new users." : "Habilite ou desabilite o perfil por padrão para novos usuários.", "Enable" : "Ativar", @@ -337,6 +347,7 @@ "Updates" : "Atualizações", "App bundles" : "Pacotes de aplicativos", "Featured apps" : "Aplicativos em destaque", + "For the server to work properly, it" : "Para que o servidor funcione corretamente, isto", "Details" : "Detalhes", "Changelog" : "Changelog", "by {author}\n{license}" : "por {author}\n{license}", diff --git a/apps/settings/l10n/ro.js b/apps/settings/l10n/ro.js index ea9e858cada..dacca317165 100644 --- a/apps/settings/l10n/ro.js +++ b/apps/settings/l10n/ro.js @@ -2,8 +2,13 @@ OC.L10N.register( "settings", { "Private" : "Privat", + "Only visible to people matched via phone number integration through Talk on mobile" : "Vizibil doar pentru persoanele care se potrivesc prin integrarea numărului de telefon prin Talk pe mobil", "Local" : "Local", - "Federated" : "Federated", + "Only visible to people on this instance and guests" : "Vizibil doar pentru persoanele din această instanță și pentru oaspeți", + "Federated" : "Federat", + "Only synchronize to trusted servers" : "Sincronizează doar cu serverele de încredere", + "Published" : "Publicat", + "Synchronize to trusted servers and the global and public address book" : "Sincronizarea cu serverele de încredere și cu cartea de adrese globală și publică", "Verify" : "Verifică", "Verifying …" : "Se verifică ...", "Unable to change password" : "Imposibil de schimbat parola", @@ -26,31 +31,44 @@ OC.L10N.register( "An administrator added {user} to group {group}" : "Un administrator a adăugat pe {user} în grupul {group} ", "{actor} removed you from group {group}" : "{actor} te-a eliminat din grupul {group}", "You removed {user} from group {group}" : "Ai eliminat {user} din grupul {group}", + "{actor} removed {user} from group {group}" : "{actor} a eliminat {user} din grupul {group}", "An administrator removed you from group {group}" : "Un administrator te-a eliminat din grupul {group}", "An administrator removed {user} from group {group}" : "Un administrator a eliminat {user} din groupul {group}", + "Your <strong>group memberships</strong> were modified" : "<strong>Apartenențele de grup</strong>ale dvs. au fost modificate", "{actor} changed your password" : "{actor} ți-a schimbat parola", "You changed your password" : "Ți-ai schimbat parola", "Your password was reset by an administrator" : "Parola dumneavoastră a fost resetată de un administrator", + "Your password was reset" : "Parola dvs. a fost resetată", "{actor} changed your email address" : "{actor} ți-a schimbat adresa de email", "You changed your email address" : "Ți-ai schimbat adresa de email", "Your email address was changed by an administrator" : "Adresa ta de email a fost modificată de un administrator", "You created app password \"{token}\"" : "Ai creat parola aplicației \"{token}\"", + "An administrator created app password \"{token}\"" : "Un administrator a creat parola aplicației \"{token}\"", "You deleted app password \"{token}\"" : "Ai șters parola aplicației \"{token}\"", "You renamed app password \"{token}\" to \"{newToken}\"" : "Ai redenumit parola aplicației \"{token}\" în \"{newToken}\"", + "You granted filesystem access to app password \"{token}\"" : "Ați acordat acces la sistemul de fișiere pentru parola aplicației \"{token}\"", + "You revoked filesystem access from app password \"{token}\"" : "Ați revocat accesul la sistemul de fișiere din aplicația parola \"{token}\"", "Security" : "Securitate", "You successfully logged in using two-factor authentication (%1$s)" : "Te-ai conectat cu succes utilizând autentificarea cu doi factori (%1$s)", "A login attempt using two-factor authentication failed (%1$s)" : "O încercare de autentificare utilizând autentificarea cu doi factori a eșuat (%1$s)", + "Remote wipe was started on %1$s" : "Ștergerea de la distanță a fost pornită pe %1$s", + "Remote wipe has finished on %1$s" : "Ștergerea de la distanță s-a încheiat pe %1$s", "Your <strong>password</strong> or <strong>email</strong> was modified" : "<strong>Parola </strong> sau <strong>mailul </strong>a fost modificat", "Couldn't remove app." : "Nu s-a putut înlătura aplicația.", "Couldn't update app." : "Aplicaţia nu s-a putut actualiza.", "Wrong password" : "Parolă greșită", + "Unable to change personal password" : "Nu se poate schimba parola personală", "Saved" : "Salvat", "No user supplied" : "Nu a fost furnizat niciun utilizator", "Authentication error" : "Eroare la autentificare", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Furnizează o parolă administrativă de recuperare, altfel toate datele utilizatorilor vor fi pierdute", "Wrong admin recovery password. Please check the password and try again." : "Parolă administrativă de recuperare greșită. Verifică parola și încearcă din nou.", + "Backend doesn't support password change, but the user's encryption key was updated." : "Backend-ul nu acceptă schimbarea parolei, dar cheia de criptare a utilizatorului a fost actualizată.", + "installing and updating apps via the App Store or Federated Cloud Sharing" : "instalarea și actualizarea aplicațiilor prin intermediul App Store sau Federated Cloud Sharing", "Federated Cloud Sharing" : "Partajare federalizată cloud", "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 utilizează o versiune %1$sneupdatată (%2$s). Vă rugăm să updatați sistemul de operare sau actualizați caracteristicile %3$scare nu funcționează în mod fiabil.", + "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." : "Nu s-a putut determina dacă versiunea TLS a cURL este depășită sau nu, deoarece s-a produs o eroare în timpul solicitării HTTPS la https://nextcloud.com. Vă rugăm să verificați fișierul jurnal nextcloud pentru mai multe detalii.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Modulul PHP OPcache nu este încărcat. Pentru o performanță mai bună, se recomandă să îl încărcați în instalarea PHP.", "Invalid SMTP password." : "Parolă SMTP invalidă.", "Email setting test" : "Test setări email", "Well done, %s!" : "Felicitări, %s!", @@ -81,31 +99,55 @@ OC.L10N.register( "Your username is: %s" : "Utilizatorul tău este: %s", "Set your password" : "Setează parola", "Install Client" : "Instalează client", + "Logged in user must be a subadmin" : "Utilizatorul logat trebuie să fie un subadmin", "Apps" : "Aplicații", "Settings" : "Setări", "Personal" : "Personal", "Administration" : "Administrare", "Additional settings" : "Setări adiționale", + "Admin privileges" : "Privilegii de administrator", + "Groupware" : "Articole de grup", + "Overview" : "Prezentare generală", "Basic settings" : "Setări de bază", "Sharing" : "Partajare", "Personal info" : "Informații personale", + "Mobile & desktop" : "Mobil și desktop", "Email server" : "Server de email", "Security & setup warnings" : "Alerte de securitate & configurare", "Background jobs" : "Proces de fundal", "Create" : "Creează", + "Change" : "Schimbă", "Delete" : "Șterge", + "Reshare" : "Redistribuiți", "Unlimited" : "Nelimitată", "Verifying" : "Se verifică", + "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Este în așteptare o sarcină de lucru în fundal care verifică dacă există certificate SSL importate de utilizator. Vă rugăm să reveniți mai târziu.", + "There are some user 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." : "Sunt prezente unele certificate SSL importate de utilizator, care nu mai sunt utilizate cu Nextcloud 21. Acestea pot fi importate în linia de comandă prin intermediul comenzii \"occ security:certificates:import\". Căile lor în interiorul directorului de date sunt prezentate mai jos.", + "Invalid UUIDs of LDAP users or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Au fost găsite UUID-uri nevalabile ale utilizatorilor sau grupurilor LDAP. Vă rugăm să revizuiți setările \"Override UUID detection\" din partea Expert a configurației LDAP și să utilizați \"occ ldap:update-uuid\" pentru a le actualiza.", + "The old server-side-encryption format is enabled. We recommend disabling this." : "Este activat vechiul format de criptare din partea serverului. Vă recomandăm să dezactivați acest lucru.", + "Profile information" : "Informații de profil", + "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Poza de profil, numele complet, adresa de e-mail, numărul de telefon, adresa, site-ul web, Twitter, organizația, rolul, titlul, biografia și dacă profilul dvs. este activat.", + "Nextcloud settings" : "Setări Nextcloud", + "Administration privileges" : "Privilegii de administrare", + "Here you can decide which group can access certain sections of the administration settings." : "Aici puteți decide ce grup poate accesa anumite secțiuni din setările de administrare.", "None" : "Niciuna", + "Unable to modify setting" : "Nu se poate modifica setarea", + "Two-Factor Authentication" : " Autentificare în doi pași", + "Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "Autentificarea cu doi factori poate fi impusă pentru toți utilizatorii și pentru grupuri specifice. Dacă aceștia nu au configurat un furnizor cu doi factori, nu se vor putea conecta la sistem.", "Enforce two-factor authentication" : "Forțează autentificarea cu doi factori", "Limit to groups" : "Limitează pentru grupuri", "Enforcement of two-factor authentication can be set for certain groups only." : "Forțarea autentificării cu doi factori poate fi setată doar pentru anumite grupuri.", + "Two-factor authentication is enforced for all members of the following groups." : "Autentificarea cu doi factori este impusă pentru toți membrii următoarelor grupuri.", + "Enforced groups" : "Grupuri obligate", + "Two-factor authentication is not enforced for members of the following groups." : "Autentificarea cu doi factori nu este impusă pentru membrii următoarelor grupuri.", + "Excluded groups" : "Grupuri excluse", "Save changes" : "Salvează modificările", "All" : "Toate ", "No results" : "Niciun rezultat", "Update to {version}" : "Actualizare la {version}", "Remove" : "Șterge", "Disable" : "Dezactivați", + "View in store" : "Vezi în magazin", "Visit website" : "Viziteaza pagina web", "Report a bug" : "Raportează un defect", "User documentation" : "Documentație utilizator", @@ -128,9 +170,18 @@ OC.L10N.register( "Device" : "Dispozitiv", "Last activity" : "Ultima activitate", "Devices & sessions" : "Dispozitive și sesiuni", + "Web, desktop and mobile clients currently logged in to your account." : "Clienții web, desktop și mobil conectați în prezent la contul dvs.", + "Do you really want to wipe your data from this device?" : "Chiar doriți să vă ștergeți datele de pe acest dispozitiv?", + "Confirm wipe" : "Confirmați ștergerea", + "Error while creating device token" : "Eroare la crearea jetonului de dispozitiv", + "Error while updating device token scope" : "Eroare la actualizarea domeniului de aplicare a jetonului de dispozitiv", + "Error while updating device token name" : "Eroare la actualizarea numelui token-ului dispozitivului", "Error while deleting the token" : "Eroare de ștergere token", + "Error while wiping the device with the token" : "Eroare la ștergerea dispozitivului cu token-ul", "App name" : "Numele aplicației", "Create new app password" : "Crează o nouă parolă pentru aplicație", + "Use the credentials below to configure your app or device." : "Utilizați acreditările de mai jos pentru a vă configura aplicația sau dispozitivul.", + "For security reasons this password will only be shown once." : "Din motive de securitate, această parolă va fi afișată doar o singură dată.", "Username" : "Nume utilizator", "Password" : "Parolă", "Done" : "Realizat", @@ -149,6 +200,12 @@ OC.L10N.register( "Email" : "Email", "Default language" : "Limba implicită", "Quota" : "Cotă", + "Add WebAuthn device" : "Adăugați dispozitivul WebAuthn", + "Name your device" : "Numiți dispozitivul dvs.", + "Adding your device …" : "Adăugarea dispozitivului dvs ...", + "Server error while trying to complete WebAuthn device registration" : "Eroare de server în timpul încercării de a finaliza înregistrarea dispozitivului WebAuthn", + "Unnamed device" : "Dispozitiv fără nume", + "Your browser does not support WebAuthn." : "Browserul dvs. nu acceptă WebAuthn.", "Your apps" : "Aplicațiile tale", "Disabled apps" : "Aplicații inactive", "Updates" : "Actualizări", @@ -210,6 +267,7 @@ OC.L10N.register( "Allow resharing" : "Permite repartajarea", "Allow sharing with groups" : "Permite partajarea cu grupuri", "Exclude groups from sharing" : "Exclude grupuri de la partajare", + "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "Această versiune comunitară a Nextcloud nu este suportată, iar notificările instantanee nu sunt disponibile.", "Profile picture" : "Imagine de profil", "Upload new" : "Încarcă una nouă", "Select from Files" : "Selectează din fișiere", diff --git a/apps/settings/l10n/ro.json b/apps/settings/l10n/ro.json index 7a00aef0bf0..fbb2481da0e 100644 --- a/apps/settings/l10n/ro.json +++ b/apps/settings/l10n/ro.json @@ -1,7 +1,12 @@ { "translations": { "Private" : "Privat", + "Only visible to people matched via phone number integration through Talk on mobile" : "Vizibil doar pentru persoanele care se potrivesc prin integrarea numărului de telefon prin Talk pe mobil", "Local" : "Local", - "Federated" : "Federated", + "Only visible to people on this instance and guests" : "Vizibil doar pentru persoanele din această instanță și pentru oaspeți", + "Federated" : "Federat", + "Only synchronize to trusted servers" : "Sincronizează doar cu serverele de încredere", + "Published" : "Publicat", + "Synchronize to trusted servers and the global and public address book" : "Sincronizarea cu serverele de încredere și cu cartea de adrese globală și publică", "Verify" : "Verifică", "Verifying …" : "Se verifică ...", "Unable to change password" : "Imposibil de schimbat parola", @@ -24,31 +29,44 @@ "An administrator added {user} to group {group}" : "Un administrator a adăugat pe {user} în grupul {group} ", "{actor} removed you from group {group}" : "{actor} te-a eliminat din grupul {group}", "You removed {user} from group {group}" : "Ai eliminat {user} din grupul {group}", + "{actor} removed {user} from group {group}" : "{actor} a eliminat {user} din grupul {group}", "An administrator removed you from group {group}" : "Un administrator te-a eliminat din grupul {group}", "An administrator removed {user} from group {group}" : "Un administrator a eliminat {user} din groupul {group}", + "Your <strong>group memberships</strong> were modified" : "<strong>Apartenențele de grup</strong>ale dvs. au fost modificate", "{actor} changed your password" : "{actor} ți-a schimbat parola", "You changed your password" : "Ți-ai schimbat parola", "Your password was reset by an administrator" : "Parola dumneavoastră a fost resetată de un administrator", + "Your password was reset" : "Parola dvs. a fost resetată", "{actor} changed your email address" : "{actor} ți-a schimbat adresa de email", "You changed your email address" : "Ți-ai schimbat adresa de email", "Your email address was changed by an administrator" : "Adresa ta de email a fost modificată de un administrator", "You created app password \"{token}\"" : "Ai creat parola aplicației \"{token}\"", + "An administrator created app password \"{token}\"" : "Un administrator a creat parola aplicației \"{token}\"", "You deleted app password \"{token}\"" : "Ai șters parola aplicației \"{token}\"", "You renamed app password \"{token}\" to \"{newToken}\"" : "Ai redenumit parola aplicației \"{token}\" în \"{newToken}\"", + "You granted filesystem access to app password \"{token}\"" : "Ați acordat acces la sistemul de fișiere pentru parola aplicației \"{token}\"", + "You revoked filesystem access from app password \"{token}\"" : "Ați revocat accesul la sistemul de fișiere din aplicația parola \"{token}\"", "Security" : "Securitate", "You successfully logged in using two-factor authentication (%1$s)" : "Te-ai conectat cu succes utilizând autentificarea cu doi factori (%1$s)", "A login attempt using two-factor authentication failed (%1$s)" : "O încercare de autentificare utilizând autentificarea cu doi factori a eșuat (%1$s)", + "Remote wipe was started on %1$s" : "Ștergerea de la distanță a fost pornită pe %1$s", + "Remote wipe has finished on %1$s" : "Ștergerea de la distanță s-a încheiat pe %1$s", "Your <strong>password</strong> or <strong>email</strong> was modified" : "<strong>Parola </strong> sau <strong>mailul </strong>a fost modificat", "Couldn't remove app." : "Nu s-a putut înlătura aplicația.", "Couldn't update app." : "Aplicaţia nu s-a putut actualiza.", "Wrong password" : "Parolă greșită", + "Unable to change personal password" : "Nu se poate schimba parola personală", "Saved" : "Salvat", "No user supplied" : "Nu a fost furnizat niciun utilizator", "Authentication error" : "Eroare la autentificare", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Furnizează o parolă administrativă de recuperare, altfel toate datele utilizatorilor vor fi pierdute", "Wrong admin recovery password. Please check the password and try again." : "Parolă administrativă de recuperare greșită. Verifică parola și încearcă din nou.", + "Backend doesn't support password change, but the user's encryption key was updated." : "Backend-ul nu acceptă schimbarea parolei, dar cheia de criptare a utilizatorului a fost actualizată.", + "installing and updating apps via the App Store or Federated Cloud Sharing" : "instalarea și actualizarea aplicațiilor prin intermediul App Store sau Federated Cloud Sharing", "Federated Cloud Sharing" : "Partajare federalizată cloud", "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 utilizează o versiune %1$sneupdatată (%2$s). Vă rugăm să updatați sistemul de operare sau actualizați caracteristicile %3$scare nu funcționează în mod fiabil.", + "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." : "Nu s-a putut determina dacă versiunea TLS a cURL este depășită sau nu, deoarece s-a produs o eroare în timpul solicitării HTTPS la https://nextcloud.com. Vă rugăm să verificați fișierul jurnal nextcloud pentru mai multe detalii.", + "The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Modulul PHP OPcache nu este încărcat. Pentru o performanță mai bună, se recomandă să îl încărcați în instalarea PHP.", "Invalid SMTP password." : "Parolă SMTP invalidă.", "Email setting test" : "Test setări email", "Well done, %s!" : "Felicitări, %s!", @@ -79,31 +97,55 @@ "Your username is: %s" : "Utilizatorul tău este: %s", "Set your password" : "Setează parola", "Install Client" : "Instalează client", + "Logged in user must be a subadmin" : "Utilizatorul logat trebuie să fie un subadmin", "Apps" : "Aplicații", "Settings" : "Setări", "Personal" : "Personal", "Administration" : "Administrare", "Additional settings" : "Setări adiționale", + "Admin privileges" : "Privilegii de administrator", + "Groupware" : "Articole de grup", + "Overview" : "Prezentare generală", "Basic settings" : "Setări de bază", "Sharing" : "Partajare", "Personal info" : "Informații personale", + "Mobile & desktop" : "Mobil și desktop", "Email server" : "Server de email", "Security & setup warnings" : "Alerte de securitate & configurare", "Background jobs" : "Proces de fundal", "Create" : "Creează", + "Change" : "Schimbă", "Delete" : "Șterge", + "Reshare" : "Redistribuiți", "Unlimited" : "Nelimitată", "Verifying" : "Se verifică", + "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Este în așteptare o sarcină de lucru în fundal care verifică dacă există certificate SSL importate de utilizator. Vă rugăm să reveniți mai târziu.", + "There are some user 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." : "Sunt prezente unele certificate SSL importate de utilizator, care nu mai sunt utilizate cu Nextcloud 21. Acestea pot fi importate în linia de comandă prin intermediul comenzii \"occ security:certificates:import\". Căile lor în interiorul directorului de date sunt prezentate mai jos.", + "Invalid UUIDs of LDAP users or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Au fost găsite UUID-uri nevalabile ale utilizatorilor sau grupurilor LDAP. Vă rugăm să revizuiți setările \"Override UUID detection\" din partea Expert a configurației LDAP și să utilizați \"occ ldap:update-uuid\" pentru a le actualiza.", + "The old server-side-encryption format is enabled. We recommend disabling this." : "Este activat vechiul format de criptare din partea serverului. Vă recomandăm să dezactivați acest lucru.", + "Profile information" : "Informații de profil", + "Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Poza de profil, numele complet, adresa de e-mail, numărul de telefon, adresa, site-ul web, Twitter, organizația, rolul, titlul, biografia și dacă profilul dvs. este activat.", + "Nextcloud settings" : "Setări Nextcloud", + "Administration privileges" : "Privilegii de administrare", + "Here you can decide which group can access certain sections of the administration settings." : "Aici puteți decide ce grup poate accesa anumite secțiuni din setările de administrare.", "None" : "Niciuna", + "Unable to modify setting" : "Nu se poate modifica setarea", + "Two-Factor Authentication" : " Autentificare în doi pași", + "Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "Autentificarea cu doi factori poate fi impusă pentru toți utilizatorii și pentru grupuri specifice. Dacă aceștia nu au configurat un furnizor cu doi factori, nu se vor putea conecta la sistem.", "Enforce two-factor authentication" : "Forțează autentificarea cu doi factori", "Limit to groups" : "Limitează pentru grupuri", "Enforcement of two-factor authentication can be set for certain groups only." : "Forțarea autentificării cu doi factori poate fi setată doar pentru anumite grupuri.", + "Two-factor authentication is enforced for all members of the following groups." : "Autentificarea cu doi factori este impusă pentru toți membrii următoarelor grupuri.", + "Enforced groups" : "Grupuri obligate", + "Two-factor authentication is not enforced for members of the following groups." : "Autentificarea cu doi factori nu este impusă pentru membrii următoarelor grupuri.", + "Excluded groups" : "Grupuri excluse", "Save changes" : "Salvează modificările", "All" : "Toate ", "No results" : "Niciun rezultat", "Update to {version}" : "Actualizare la {version}", "Remove" : "Șterge", "Disable" : "Dezactivați", + "View in store" : "Vezi în magazin", "Visit website" : "Viziteaza pagina web", "Report a bug" : "Raportează un defect", "User documentation" : "Documentație utilizator", @@ -126,9 +168,18 @@ "Device" : "Dispozitiv", "Last activity" : "Ultima activitate", "Devices & sessions" : "Dispozitive și sesiuni", + "Web, desktop and mobile clients currently logged in to your account." : "Clienții web, desktop și mobil conectați în prezent la contul dvs.", + "Do you really want to wipe your data from this device?" : "Chiar doriți să vă ștergeți datele de pe acest dispozitiv?", + "Confirm wipe" : "Confirmați ștergerea", + "Error while creating device token" : "Eroare la crearea jetonului de dispozitiv", + "Error while updating device token scope" : "Eroare la actualizarea domeniului de aplicare a jetonului de dispozitiv", + "Error while updating device token name" : "Eroare la actualizarea numelui token-ului dispozitivului", "Error while deleting the token" : "Eroare de ștergere token", + "Error while wiping the device with the token" : "Eroare la ștergerea dispozitivului cu token-ul", "App name" : "Numele aplicației", "Create new app password" : "Crează o nouă parolă pentru aplicație", + "Use the credentials below to configure your app or device." : "Utilizați acreditările de mai jos pentru a vă configura aplicația sau dispozitivul.", + "For security reasons this password will only be shown once." : "Din motive de securitate, această parolă va fi afișată doar o singură dată.", "Username" : "Nume utilizator", "Password" : "Parolă", "Done" : "Realizat", @@ -147,6 +198,12 @@ "Email" : "Email", "Default language" : "Limba implicită", "Quota" : "Cotă", + "Add WebAuthn device" : "Adăugați dispozitivul WebAuthn", + "Name your device" : "Numiți dispozitivul dvs.", + "Adding your device …" : "Adăugarea dispozitivului dvs ...", + "Server error while trying to complete WebAuthn device registration" : "Eroare de server în timpul încercării de a finaliza înregistrarea dispozitivului WebAuthn", + "Unnamed device" : "Dispozitiv fără nume", + "Your browser does not support WebAuthn." : "Browserul dvs. nu acceptă WebAuthn.", "Your apps" : "Aplicațiile tale", "Disabled apps" : "Aplicații inactive", "Updates" : "Actualizări", @@ -208,6 +265,7 @@ "Allow resharing" : "Permite repartajarea", "Allow sharing with groups" : "Permite partajarea cu grupuri", "Exclude groups from sharing" : "Exclude grupuri de la partajare", + "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "Această versiune comunitară a Nextcloud nu este suportată, iar notificările instantanee nu sunt disponibile.", "Profile picture" : "Imagine de profil", "Upload new" : "Încarcă una nouă", "Select from Files" : "Selectează din fișiere", diff --git a/apps/settings/lib/UserMigration/AccountMigrator.php b/apps/settings/lib/UserMigration/AccountMigrator.php index 7b60a101cee..4db28306eb1 100644 --- a/apps/settings/lib/UserMigration/AccountMigrator.php +++ b/apps/settings/lib/UserMigration/AccountMigrator.php @@ -37,11 +37,12 @@ use OCP\IUser; use OCP\UserMigration\IExportDestination; use OCP\UserMigration\IImportSource; use OCP\UserMigration\IMigrator; +use OCP\UserMigration\ISizeEstimationMigrator; use OCP\UserMigration\TMigratorBasicVersionHandling; use Symfony\Component\Console\Output\OutputInterface; use Throwable; -class AccountMigrator implements IMigrator { +class AccountMigrator implements IMigrator, ISizeEstimationMigrator { use TMigratorBasicVersionHandling; use TAccountsHelper; @@ -71,6 +72,25 @@ class AccountMigrator implements IMigrator { /** * {@inheritDoc} */ + public function getEstimatedExportSize(IUser $user): int { + $size = 100; // 100KiB for account JSON + + try { + $avatar = $this->avatarManager->getAvatar($user->getUID()); + if ($avatar->isCustomAvatar()) { + $avatarFile = $avatar->getFile(-1); + $size += $avatarFile->getSize() / 1024; + } + } catch (Throwable $e) { + // Skip avatar in size estimate on failure + } + + return (int)ceil($size); + } + + /** + * {@inheritDoc} + */ public function export(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void { $output->writeln('Exporting account information in ' . AccountMigrator::PATH_ACCOUNT_FILE . '…'); @@ -133,7 +153,7 @@ class AccountMigrator implements IMigrator { $output->writeln('Importing avatar from ' . $importPath . '…'); $stream = $importSource->getFileAsStream($importPath); - $image = new \OC_Image(); + $image = new \OCP\Image(); $image->loadFromFileHandle($stream); try { diff --git a/apps/settings/src/components/AuthToken.vue b/apps/settings/src/components/AuthToken.vue index e599be9c671..eb42e763b46 100644 --- a/apps/settings/src/components/AuthToken.vue +++ b/apps/settings/src/components/AuthToken.vue @@ -107,7 +107,7 @@ const userAgentMap = { iphone: / *CPU +iPhone +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */, ipad: /\(iPad; *CPU +OS +([0-9]+)_(?:[0-9_])+ +like +Mac +OS +X */, iosClient: /^Mozilla\/5\.0 \(iOS\) (?:ownCloud|Nextcloud)-iOS.*$/, - androidClient: /^Mozilla\/5\.0 \(Android\) ownCloud-android.*$/, + androidClient: /^Mozilla\/5\.0 \(Android\) (?:ownCloud|Nextcloud)-android.*$/, iosTalkClient: /^Mozilla\/5\.0 \(iOS\) Nextcloud-Talk.*$/, androidTalkClient: /^Mozilla\/5\.0 \(Android\) Nextcloud-Talk.*$/, // DAVx5/3.3.8-beta2-gplay (2021/01/02; dav4jvm; okhttp/4.9.0) Android/10 diff --git a/apps/sharebymail/l10n/pt_BR.js b/apps/sharebymail/l10n/pt_BR.js index 6678a76735a..4c718a1b7ca 100644 --- a/apps/sharebymail/l10n/pt_BR.js +++ b/apps/sharebymail/l10n/pt_BR.js @@ -50,6 +50,7 @@ OC.L10N.register( "Share provider which allows you to share files by mail" : "Provedor de compartilhamento que permite compartilhar arquivos por e-mail", "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de e-mail.", "Send password by mail" : "Enviar senha por e-mail", - "Reply to initiator" : "Responder ao iniciador" + "Reply to initiator" : "Responder ao iniciador", + "Unable to update share by mail config" : "Não foi possível atualizar o compartilhamento por configuração de e-mail" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/sharebymail/l10n/pt_BR.json b/apps/sharebymail/l10n/pt_BR.json index e8939087420..f5bca54f636 100644 --- a/apps/sharebymail/l10n/pt_BR.json +++ b/apps/sharebymail/l10n/pt_BR.json @@ -48,6 +48,7 @@ "Share provider which allows you to share files by mail" : "Provedor de compartilhamento que permite compartilhar arquivos por e-mail", "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de e-mail.", "Send password by mail" : "Enviar senha por e-mail", - "Reply to initiator" : "Responder ao iniciador" + "Reply to initiator" : "Responder ao iniciador", + "Unable to update share by mail config" : "Não foi possível atualizar o compartilhamento por configuração de e-mail" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/systemtags/l10n/pt_BR.js b/apps/systemtags/l10n/pt_BR.js index 16f5b112c03..68e34f7df3d 100644 --- a/apps/systemtags/l10n/pt_BR.js +++ b/apps/systemtags/l10n/pt_BR.js @@ -43,6 +43,8 @@ OC.L10N.register( "%s (invisible)" : "%s (invisível)", "<strong>System tags</strong> for a file have been modified" : "As <strong>etiquetas de sistema</strong> para um arquivo foram modificadas", "Tags" : "Etiquetas", + "All tagged %s …" : "Todos os %s marcados …", + "tagged %s" : "marcado %s", "Collaborative tags" : "Etiquetas colaborativas", "Collaborative tagging functionality which shares tags among users." : "Funcionalidade de marcação colaborativa que compartilha rótulos entre usuários.", "Collaborative tagging functionality which shares tags among users. 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.)" : "Funcionalidade de marcação colaborativa que compartilha rótulos entre usuários. Ótimo para equipes.\n\t(Se você for um provedor de uma instalação de multilocação, é aconselhável desativar isso, pois os rótulos são compartilhados.)", diff --git a/apps/systemtags/l10n/pt_BR.json b/apps/systemtags/l10n/pt_BR.json index 628ec51b083..2e198cf8cc0 100644 --- a/apps/systemtags/l10n/pt_BR.json +++ b/apps/systemtags/l10n/pt_BR.json @@ -41,6 +41,8 @@ "%s (invisible)" : "%s (invisível)", "<strong>System tags</strong> for a file have been modified" : "As <strong>etiquetas de sistema</strong> para um arquivo foram modificadas", "Tags" : "Etiquetas", + "All tagged %s …" : "Todos os %s marcados …", + "tagged %s" : "marcado %s", "Collaborative tags" : "Etiquetas colaborativas", "Collaborative tagging functionality which shares tags among users." : "Funcionalidade de marcação colaborativa que compartilha rótulos entre usuários.", "Collaborative tagging functionality which shares tags among users. 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.)" : "Funcionalidade de marcação colaborativa que compartilha rótulos entre usuários. Ótimo para equipes.\n\t(Se você for um provedor de uma instalação de multilocação, é aconselhável desativar isso, pois os rótulos são compartilhados.)", diff --git a/apps/theming/l10n/de.js b/apps/theming/l10n/de.js index eb3a7d22640..acc24cb91fe 100644 --- a/apps/theming/l10n/de.js +++ b/apps/theming/l10n/de.js @@ -32,6 +32,10 @@ OC.L10N.register( "Similar to the high contrast mode, but with dark colours." : "Ähnlich wie der Hochkontrastmodus, aber mit dunklen Farben", "Dark theme" : "Dunkles Design", "Enable dark theme" : "Dunkles Design aktivieren", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ein dunkles Design zur Entlastung Deiner Augen durch Verringerung der Gesamtleuchtkraft und -helligkeit.", + "System default theme" : "Design des Systemstandards", + "Enable the system default" : "Systemstandard aktivieren", + "Using the default system appearance." : "Das Erscheinungsbild des Systemstandards verwenden", "Dyslexia font" : "Legasthenie-Schriftart", "Enable dyslexia font" : "Legasthenie-Schriftart aktivieren", "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ist eine freie Schriftart, die entwickelt wurde, um einige der häufigsten Lesefehler, die durch Legasthenie verursacht werden, zu reduzieren.", @@ -46,6 +50,7 @@ OC.L10N.register( "Adjust the Nextcloud theme" : "Passe das Design von Nextcloud an", "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der unbeschränkte Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", "If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Wenn Du Fehler findest, melde sie bitte im {issuetracker}Problemverfolgungssystem{linkend}. Und wenn Du mithelfen willst, trete dem {designteam}Designteam{linkend} bei!", + "Theme selection is enforced" : "Designauswahl wird erzwungen", "Open documentation" : "Dokumentation öffnen", "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Das Ändern des Designs ermöglicht es auf einfache Weise das Aussehen Deiner Installation und Clients anzupassen. Die Änderungen wirken sich auf alle Benutzer aus.", "Name" : "Name", diff --git a/apps/theming/l10n/de.json b/apps/theming/l10n/de.json index ae9c00482d1..eb383fb4c37 100644 --- a/apps/theming/l10n/de.json +++ b/apps/theming/l10n/de.json @@ -30,6 +30,10 @@ "Similar to the high contrast mode, but with dark colours." : "Ähnlich wie der Hochkontrastmodus, aber mit dunklen Farben", "Dark theme" : "Dunkles Design", "Enable dark theme" : "Dunkles Design aktivieren", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ein dunkles Design zur Entlastung Deiner Augen durch Verringerung der Gesamtleuchtkraft und -helligkeit.", + "System default theme" : "Design des Systemstandards", + "Enable the system default" : "Systemstandard aktivieren", + "Using the default system appearance." : "Das Erscheinungsbild des Systemstandards verwenden", "Dyslexia font" : "Legasthenie-Schriftart", "Enable dyslexia font" : "Legasthenie-Schriftart aktivieren", "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ist eine freie Schriftart, die entwickelt wurde, um einige der häufigsten Lesefehler, die durch Legasthenie verursacht werden, zu reduzieren.", @@ -44,6 +48,7 @@ "Adjust the Nextcloud theme" : "Passe das Design von Nextcloud an", "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der unbeschränkte Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", "If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Wenn Du Fehler findest, melde sie bitte im {issuetracker}Problemverfolgungssystem{linkend}. Und wenn Du mithelfen willst, trete dem {designteam}Designteam{linkend} bei!", + "Theme selection is enforced" : "Designauswahl wird erzwungen", "Open documentation" : "Dokumentation öffnen", "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Das Ändern des Designs ermöglicht es auf einfache Weise das Aussehen Deiner Installation und Clients anzupassen. Die Änderungen wirken sich auf alle Benutzer aus.", "Name" : "Name", diff --git a/apps/theming/lib/Themes/DarkTheme.php b/apps/theming/lib/Themes/DarkTheme.php index f5463d94fc4..1241d1d42c3 100644 --- a/apps/theming/lib/Themes/DarkTheme.php +++ b/apps/theming/lib/Themes/DarkTheme.php @@ -71,8 +71,10 @@ class DarkTheme extends DefaultTheme implements ITheme { '--color-primary-hover' => $this->util->mix($this->primaryColor, $colorMainBackground, 60), '--color-primary-light' => $this->util->mix($this->primaryColor, $colorMainBackground, -80), - '--color-primary-element-hover' => $this->util->mix($this->util->elementColor($this->primaryColor), $colorMainBackground, 80), - '--color-primary-element-lighter' => $this->util->mix($this->util->elementColor($this->primaryColor), $colorMainBackground, -70), + '--color-primary-element' => $this->util->elementColor($this->primaryColor, false), + '--color-primary-element-hover' => $this->util->mix($this->util->elementColor($this->primaryColor, false), $colorMainBackground, 80), + '--color-primary-element-light' => $this->util->lighten($this->util->elementColor($this->primaryColor, false), 15), + '--color-primary-element-lighter' => $this->util->mix($this->util->elementColor($this->primaryColor, false), $colorMainBackground, -70), '--color-text-maxcontrast' => $this->util->darken($colorMainText, 30), '--color-text-light' => $this->util->darken($colorMainText, 10), diff --git a/apps/updatenotification/l10n/ro.js b/apps/updatenotification/l10n/ro.js index 465de73c9f4..1b7bcb020eb 100644 --- a/apps/updatenotification/l10n/ro.js +++ b/apps/updatenotification/l10n/ro.js @@ -2,13 +2,29 @@ OC.L10N.register( "updatenotification", { "{version} is available. Get more information on how to update." : "{version} este disponibil. Află mai multe informații despre cum să faci o actualizare.", - "Updated channel" : "Canal actualizat", - "Updater" : "Unealtă pentru actualizare", - "A new version is available: %s" : "O nouă versiune este disponibilă: %s", + "Channel updated" : "Canal actualizat", + "Web updater is disabled" : "Actualizatorul web este dezactivat", + "Update notifications" : "Notificări de actualizare", + "The update server could not be reached since %d days to check for new updates." : "Serverul de actualizare nu a mai putut fi contactat de %d zile pentru a verifica dacă există actualizări noi.", + "Please check the Nextcloud and server log files for errors." : "Vă rugăm să verificați dacă există erori în fișierele jurnal Nextcloud și în fișierele jurnal ale serverului.", + "Update to %1$s is available." : " Actualizarea la %1$s este disponibilă.", + "Update for %1$s to version %2$s is available." : "Actualizarea pentru %1$s la versiunea %2$s este disponibilă.", + "Update for {app} to version %s is available." : "Actualizarea pentru {app} la versiunea %s este disponibilă.", + "Update notification" : "Notificare de actualizare", + "Displays update notifications for Nextcloud and provides the SSO for the updater." : "Afișează notificările de actualizare pentru Nextcloud și oferă SSO pentru actualizator.", + "The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible." : "Versiunea pe care o executați nu mai este întreținută. Vă rugăm să vă asigurați că actualizați cât mai curând posibil la o versiune compatibilă.", + "Apps missing compatible version" : "Aplicații fără versiune compatibilă", + "View in store" : "Vezi în magazin", + "Apps with compatible version" : "Aplicații cu versiune compatibilă", + "Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!" : "Vă rugăm să rețineți că actualizatorul web nu este recomandat pentru mai mult de 100 de utilizatori! Vă rugăm să folosiți în schimb actualizatorul de linie de comandă!", "Open updater" : "Deschide unealta pentru actualizare", + "Download now" : "Descarcă acum", + "Please use the command line updater to update." : "Vă rugăm să utilizați programul de actualizare din linia de comandă pentru a efectua actualizarea.", + "What's new?" : "Ce este nou?", + "The update check is not yet finished. Please refresh the page." : "Verificarea actualizării nu este încă finalizată. Vă rugăm să reîmprospătați pagina.", "Your version is up to date." : "Versiunea curentă este la zi.", - "Checked on %s" : "Verificat la %s", "Update channel:" : "Canal pentru actualizări:", - "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Poți mereu să faci o actualizare către o versiune nouă / o versiune dintr-un canal experimental. Dar nu te poți niciodată întoarce la un canal de distribuție stabil." + "View changelog" : "Vezi changelog", + "Beta" : "Beta" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/updatenotification/l10n/ro.json b/apps/updatenotification/l10n/ro.json index 56a8c48d3bc..94823870c93 100644 --- a/apps/updatenotification/l10n/ro.json +++ b/apps/updatenotification/l10n/ro.json @@ -1,12 +1,28 @@ { "translations": { "{version} is available. Get more information on how to update." : "{version} este disponibil. Află mai multe informații despre cum să faci o actualizare.", - "Updated channel" : "Canal actualizat", - "Updater" : "Unealtă pentru actualizare", - "A new version is available: %s" : "O nouă versiune este disponibilă: %s", + "Channel updated" : "Canal actualizat", + "Web updater is disabled" : "Actualizatorul web este dezactivat", + "Update notifications" : "Notificări de actualizare", + "The update server could not be reached since %d days to check for new updates." : "Serverul de actualizare nu a mai putut fi contactat de %d zile pentru a verifica dacă există actualizări noi.", + "Please check the Nextcloud and server log files for errors." : "Vă rugăm să verificați dacă există erori în fișierele jurnal Nextcloud și în fișierele jurnal ale serverului.", + "Update to %1$s is available." : " Actualizarea la %1$s este disponibilă.", + "Update for %1$s to version %2$s is available." : "Actualizarea pentru %1$s la versiunea %2$s este disponibilă.", + "Update for {app} to version %s is available." : "Actualizarea pentru {app} la versiunea %s este disponibilă.", + "Update notification" : "Notificare de actualizare", + "Displays update notifications for Nextcloud and provides the SSO for the updater." : "Afișează notificările de actualizare pentru Nextcloud și oferă SSO pentru actualizator.", + "The version you are running is not maintained anymore. Please make sure to update to a supported version as soon as possible." : "Versiunea pe care o executați nu mai este întreținută. Vă rugăm să vă asigurați că actualizați cât mai curând posibil la o versiune compatibilă.", + "Apps missing compatible version" : "Aplicații fără versiune compatibilă", + "View in store" : "Vezi în magazin", + "Apps with compatible version" : "Aplicații cu versiune compatibilă", + "Please note that the web updater is not recommended with more than 100 users! Please use the command line updater instead!" : "Vă rugăm să rețineți că actualizatorul web nu este recomandat pentru mai mult de 100 de utilizatori! Vă rugăm să folosiți în schimb actualizatorul de linie de comandă!", "Open updater" : "Deschide unealta pentru actualizare", + "Download now" : "Descarcă acum", + "Please use the command line updater to update." : "Vă rugăm să utilizați programul de actualizare din linia de comandă pentru a efectua actualizarea.", + "What's new?" : "Ce este nou?", + "The update check is not yet finished. Please refresh the page." : "Verificarea actualizării nu este încă finalizată. Vă rugăm să reîmprospătați pagina.", "Your version is up to date." : "Versiunea curentă este la zi.", - "Checked on %s" : "Verificat la %s", "Update channel:" : "Canal pentru actualizări:", - "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Poți mereu să faci o actualizare către o versiune nouă / o versiune dintr-un canal experimental. Dar nu te poți niciodată întoarce la un canal de distribuție stabil." + "View changelog" : "Vezi changelog", + "Beta" : "Beta" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js index 7f54d83f77c..a5af53f7c3f 100644 --- a/apps/user_ldap/l10n/pt_BR.js +++ b/apps/user_ldap/l10n/pt_BR.js @@ -180,6 +180,7 @@ OC.L10N.register( "\"$home\" Placeholder Field" : "Campo Reservado \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home em uma configuração de armazenamento externo será substituído pelo valor do atributo especificado", "Internal Username" : "Nome de usuário interno", + "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." : "Por padrão, o nome de usuário interno será criado a partir do atributo UUID. Ele garante que o nome de usuário seja exclusivo e os caracteres não precisem ser convertidos. O nome de usuário interno tem a restrição de que apenas esses caracteres são permitidos: [a-zA-Z0-9_.@-]. Outros caracteres são substituídos por sua correspondência ASCII ou simplesmente omitidos. Em colisões, um número será adicionado/aumentado. O nome de usuário interno é usado para identificar um usuário internamente. Também é o nome padrão para a pasta inicial do usuário. Também faz parte de URLs remotos, por exemplo, para todos os serviços DAV. Com essa configuração, o comportamento padrão pode ser substituído. As alterações terão efeito apenas em usuários LDAP recém-mapeados (adicionados). Deixe-o vazio para o comportamento padrão.", "Internal Username Attribute:" : "Atributo Interno de Nome de Usuário:", "Override UUID detection" : "Substituir detecção UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por padrão, o atributo UUID é detectado automaticamente. O atributo UUID é usado para identificar corretamente os usuários e grupos LDAP. Além disso, o nome de usuário interno será criado com base no UUID, se não especificado acima. Você pode substituir a configuração e passar um atributo de sua escolha. Você deve certificar-se de que o atributo de sua escolha pode ser lido tanto por usuários quanto por grupos, e que seja único. Deixe-o em branco para o comportamento padrão. As alterações terão efeito apenas para usuários e grupos LDAP recém mapeados (adicionados).", diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json index cd9108716ca..059663be77f 100644 --- a/apps/user_ldap/l10n/pt_BR.json +++ b/apps/user_ldap/l10n/pt_BR.json @@ -178,6 +178,7 @@ "\"$home\" Placeholder Field" : "Campo Reservado \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home em uma configuração de armazenamento externo será substituído pelo valor do atributo especificado", "Internal Username" : "Nome de usuário interno", + "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." : "Por padrão, o nome de usuário interno será criado a partir do atributo UUID. Ele garante que o nome de usuário seja exclusivo e os caracteres não precisem ser convertidos. O nome de usuário interno tem a restrição de que apenas esses caracteres são permitidos: [a-zA-Z0-9_.@-]. Outros caracteres são substituídos por sua correspondência ASCII ou simplesmente omitidos. Em colisões, um número será adicionado/aumentado. O nome de usuário interno é usado para identificar um usuário internamente. Também é o nome padrão para a pasta inicial do usuário. Também faz parte de URLs remotos, por exemplo, para todos os serviços DAV. Com essa configuração, o comportamento padrão pode ser substituído. As alterações terão efeito apenas em usuários LDAP recém-mapeados (adicionados). Deixe-o vazio para o comportamento padrão.", "Internal Username Attribute:" : "Atributo Interno de Nome de Usuário:", "Override UUID detection" : "Substituir detecção UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por padrão, o atributo UUID é detectado automaticamente. O atributo UUID é usado para identificar corretamente os usuários e grupos LDAP. Além disso, o nome de usuário interno será criado com base no UUID, se não especificado acima. Você pode substituir a configuração e passar um atributo de sua escolha. Você deve certificar-se de que o atributo de sua escolha pode ser lido tanto por usuários quanto por grupos, e que seja único. Deixe-o em branco para o comportamento padrão. As alterações terão efeito apenas para usuários e grupos LDAP recém mapeados (adicionados).", diff --git a/apps/user_status/l10n/ro.js b/apps/user_status/l10n/ro.js index 444a7badebc..300cabab797 100644 --- a/apps/user_status/l10n/ro.js +++ b/apps/user_status/l10n/ro.js @@ -1,6 +1,15 @@ OC.L10N.register( "user_status", { + "Recent statuses" : "Statusuri recente", + "In a meeting" : "În cadrul unei întâlniri", + "Commuting" : "În deplasare", + "Out sick" : "Bolnav", + "Vacationing" : "În vacanță", + "Working remotely" : "Lucru la distanță", + "In a call" : "Într-un apel", + "User status" : "Statusul utilizatorului", + "View profile" : "Vezi profilul", "Clear status message after" : "Șterge mesajul de stare după", "What is your status?" : "Care este statusul dumneavoastră?", "Set status" : "Setează status", @@ -8,13 +17,19 @@ OC.L10N.register( "Status message" : "Mesaj de status", "Clear status message" : "Șterge mesajul de stare", "Set status message" : "Setează mesajul de status", + "There was an error saving the status" : "S-a produs o eroare la salvarea stării", + "There was an error clearing the status" : "S-a produs o eroare de ștergere a statutului", + "No recent status changes" : "Nu există modificări recente ale statutului", "Away" : "Plecat", "Do not disturb" : "Nu deranja", + "{status}, {timestamp}" : "{status}, {timestamp}", "Don't clear" : "Nu curăța", "Today" : "Azi", "This week" : "Săptămâna asta", "Online" : "Online", "Invisible" : "Invizibil", + "Offline" : "Offline", + "There was an error saving the new status" : "S-a produs o eroare de salvare a noului status", "30 minutes" : "30 minute", "1 hour" : "1 oră", "4 hours" : "4 ore", diff --git a/apps/user_status/l10n/ro.json b/apps/user_status/l10n/ro.json index 3b4c2630f74..d89a1f6a40c 100644 --- a/apps/user_status/l10n/ro.json +++ b/apps/user_status/l10n/ro.json @@ -1,4 +1,13 @@ { "translations": { + "Recent statuses" : "Statusuri recente", + "In a meeting" : "În cadrul unei întâlniri", + "Commuting" : "În deplasare", + "Out sick" : "Bolnav", + "Vacationing" : "În vacanță", + "Working remotely" : "Lucru la distanță", + "In a call" : "Într-un apel", + "User status" : "Statusul utilizatorului", + "View profile" : "Vezi profilul", "Clear status message after" : "Șterge mesajul de stare după", "What is your status?" : "Care este statusul dumneavoastră?", "Set status" : "Setează status", @@ -6,13 +15,19 @@ "Status message" : "Mesaj de status", "Clear status message" : "Șterge mesajul de stare", "Set status message" : "Setează mesajul de status", + "There was an error saving the status" : "S-a produs o eroare la salvarea stării", + "There was an error clearing the status" : "S-a produs o eroare de ștergere a statutului", + "No recent status changes" : "Nu există modificări recente ale statutului", "Away" : "Plecat", "Do not disturb" : "Nu deranja", + "{status}, {timestamp}" : "{status}, {timestamp}", "Don't clear" : "Nu curăța", "Today" : "Azi", "This week" : "Săptămâna asta", "Online" : "Online", "Invisible" : "Invizibil", + "Offline" : "Offline", + "There was an error saving the new status" : "S-a produs o eroare de salvare a noului status", "30 minutes" : "30 minute", "1 hour" : "1 oră", "4 hours" : "4 ore", diff --git a/apps/workflowengine/lib/Settings/ASettings.php b/apps/workflowengine/lib/Settings/ASettings.php index d35524727a8..f3cb8d76bba 100644 --- a/apps/workflowengine/lib/Settings/ASettings.php +++ b/apps/workflowengine/lib/Settings/ASettings.php @@ -37,6 +37,7 @@ use OCP\AppFramework\Services\IInitialState; use OCP\EventDispatcher\IEventDispatcher; use OCP\IConfig; use OCP\IL10N; +use OCP\IURLGenerator; use OCP\Settings\ISettings; use OCP\WorkflowEngine\Events\LoadSettingsScriptsEvent; use OCP\WorkflowEngine\ICheck; @@ -47,23 +48,13 @@ use OCP\WorkflowEngine\IOperation; use OCP\WorkflowEngine\ISpecificOperation; abstract class ASettings implements ISettings { - /** @var IL10N */ - private $l10n; - - /** @var string */ - private $appName; - - /** @var IEventDispatcher */ - private $eventDispatcher; - - /** @var Manager */ - protected $manager; - - /** @var IInitialState */ - private $initialStateService; - - /** @var IConfig */ - private $config; + private IL10N $l10n; + private string $appName; + private IEventDispatcher $eventDispatcher; + protected Manager $manager; + private IInitialState $initialStateService; + private IConfig $config; + private IURLGenerator $urlGenerator; public function __construct( string $appName, @@ -71,7 +62,8 @@ abstract class ASettings implements ISettings { IEventDispatcher $eventDispatcher, Manager $manager, IInitialState $initialStateService, - IConfig $config + IConfig $config, + IURLGenerator $urlGenerator ) { $this->appName = $appName; $this->l10n = $l; @@ -79,6 +71,7 @@ abstract class ASettings implements ISettings { $this->manager = $manager; $this->initialStateService = $initialStateService; $this->config = $config; + $this->urlGenerator = $urlGenerator; } abstract public function getScope(): int; @@ -122,6 +115,11 @@ abstract class ASettings implements ISettings { $this->config->getSystemValueBool('appstoreenabled', true) ); + $this->initialStateService->provideInitialState( + 'doc-url', + $this->urlGenerator->linkToDocs('admin-workflowengine') + ); + return new TemplateResponse(Application::APP_ID, 'settings', [], 'blank'); } diff --git a/apps/workflowengine/src/components/Workflow.vue b/apps/workflowengine/src/components/Workflow.vue index 9cdbf34018d..f009e1e8a90 100644 --- a/apps/workflowengine/src/components/Workflow.vue +++ b/apps/workflowengine/src/components/Workflow.vue @@ -1,7 +1,7 @@ <template> <div id="workflowengine"> - <div class="section"> - <h2>{{ t('workflowengine', 'Available flows') }}</h2> + <SettingsSection :title="t('workflowengine', 'Available flows')" + :doc-url="workflowDocUrl"> <p v-if="scope === 0" class="settings-hint"> <a href="https://nextcloud.com/developer/">{{ t('workflowengine', 'For details on how to write your own flow, check out the development documentation.') }}</a> @@ -39,7 +39,7 @@ <h2 v-else class="configured-flows"> {{ t('workflowengine', 'Your flows') }} </h2> - </div> + </SettingsSection> <transition-group v-if="rules.length > 0" name="slide"> <Rule v-for="rule in rules" :key="rule.id" :rule="rule" /> @@ -50,8 +50,10 @@ <script> import Rule from './Rule' import Operation from './Operation' +import SettingsSection from '@nextcloud/vue/dist/Components/SettingsSection' import { mapGetters, mapState } from 'vuex' import { generateUrl } from '@nextcloud/router' +import { loadState } from '@nextcloud/initial-state' const ACTION_LIMIT = 3 @@ -60,11 +62,13 @@ export default { components: { Operation, Rule, + SettingsSection, }, data() { return { showMoreOperations: false, appstoreUrl: generateUrl('settings/apps/workflow'), + workflowDocUrl: loadState('workflowengine', 'doc-url'), } }, computed: { |