aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/admin_audit/l10n/id.js4
-rw-r--r--apps/admin_audit/l10n/id.json4
-rw-r--r--apps/dav/appinfo/routes.php3
-rw-r--r--apps/dav/composer/composer/autoload_classmap.php2
-rw-r--r--apps/dav/composer/composer/autoload_static.php2
-rw-r--r--apps/dav/lib/Controller/ExampleContentController.php80
-rw-r--r--apps/dav/lib/Listener/UserEventsListener.php6
-rw-r--r--apps/dav/lib/Service/DefaultContactService.php77
-rw-r--r--apps/dav/lib/Service/ExampleContactService.php132
-rw-r--r--apps/dav/lib/Settings/ExampleContentSettings.php14
-rw-r--r--apps/dav/src/components/ExampleContactSettings.vue4
-rw-r--r--apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php8
-rw-r--r--apps/dav/tests/unit/Service/ExampleContactServiceTest.php (renamed from apps/dav/tests/unit/Service/DefaultContactServiceTest.php)85
-rw-r--r--apps/encryption/l10n/et_EE.js61
-rw-r--r--apps/encryption/l10n/et_EE.json61
-rw-r--r--apps/federatedfilesharing/l10n/et_EE.js4
-rw-r--r--apps/federatedfilesharing/l10n/et_EE.json4
-rw-r--r--apps/files/l10n/it.js1
-rw-r--r--apps/files/l10n/it.json1
-rw-r--r--apps/files/l10n/sw.js167
-rw-r--r--apps/files/l10n/sw.json167
-rw-r--r--apps/files/l10n/uk.js1
-rw-r--r--apps/files/l10n/uk.json1
-rw-r--r--apps/files/src/views/FilesList.vue7
-rw-r--r--apps/files_external/lib/Lib/Storage/SMB.php10
-rw-r--r--apps/files_sharing/l10n/cs.js2
-rw-r--r--apps/files_sharing/l10n/cs.json2
-rw-r--r--apps/files_sharing/l10n/it.js2
-rw-r--r--apps/files_sharing/l10n/it.json2
-rw-r--r--apps/files_sharing/l10n/sr.js2
-rw-r--r--apps/files_sharing/l10n/sr.json2
-rw-r--r--apps/files_sharing/l10n/uk.js2
-rw-r--r--apps/files_sharing/l10n/uk.json2
-rw-r--r--apps/files_sharing/src/components/SharingEntryLink.vue38
-rw-r--r--apps/files_trashbin/l10n/uk.js1
-rw-r--r--apps/files_trashbin/l10n/uk.json1
-rw-r--r--apps/provisioning_api/l10n/de.js6
-rw-r--r--apps/provisioning_api/l10n/de.json6
-rw-r--r--apps/settings/l10n/et_EE.js52
-rw-r--r--apps/settings/l10n/et_EE.json52
-rw-r--r--apps/settings/l10n/lv.js2
-rw-r--r--apps/settings/l10n/lv.json2
-rw-r--r--apps/sharebymail/l10n/et_EE.js6
-rw-r--r--apps/sharebymail/l10n/et_EE.json6
-rw-r--r--apps/user_ldap/ajax/deleteConfiguration.php4
-rw-r--r--apps/user_ldap/ajax/getNewServerConfigPrefix.php4
-rw-r--r--apps/user_ldap/lib/Command/Search.php3
-rw-r--r--apps/user_ldap/lib/Command/SetConfig.php4
-rw-r--r--apps/user_ldap/lib/Connection.php4
-rw-r--r--apps/user_ldap/lib/Helper.php96
-rw-r--r--apps/user_ldap/lib/Jobs/CleanUp.php2
-rw-r--r--apps/user_ldap/lib/Settings/Admin.php4
-rw-r--r--apps/user_ldap/tests/AccessTest.php3
-rw-r--r--apps/user_ldap/tests/HelperTest.php81
-rw-r--r--apps/user_ldap/tests/Integration/AbstractIntegrationTest.php3
-rw-r--r--apps/user_ldap/tests/LDAPProviderTest.php5
56 files changed, 899 insertions, 408 deletions
diff --git a/apps/admin_audit/l10n/id.js b/apps/admin_audit/l10n/id.js
index 441f1940069..144a85299f1 100644
--- a/apps/admin_audit/l10n/id.js
+++ b/apps/admin_audit/l10n/id.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"admin_audit",
{
- "Auditing / Logging" : "Pemeriksaan / Pencatatan",
- "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud seperti pencatatan akses berkas atau tindakan sensitif lainnya."
+ "Auditing / Logging" : "Pengauditan/Pencatatan",
+ "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud, misalnya pencatatan akses file atau tindakan sensitif lainnya."
},
"nplurals=1; plural=0;");
diff --git a/apps/admin_audit/l10n/id.json b/apps/admin_audit/l10n/id.json
index 91af029f895..868f7c94d32 100644
--- a/apps/admin_audit/l10n/id.json
+++ b/apps/admin_audit/l10n/id.json
@@ -1,5 +1,5 @@
{ "translations": {
- "Auditing / Logging" : "Pemeriksaan / Pencatatan",
- "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud seperti pencatatan akses berkas atau tindakan sensitif lainnya."
+ "Auditing / Logging" : "Pengauditan/Pencatatan",
+ "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud, misalnya pencatatan akses file atau tindakan sensitif lainnya."
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/dav/appinfo/routes.php b/apps/dav/appinfo/routes.php
index d0953add93f..91c1ba58ea2 100644
--- a/apps/dav/appinfo/routes.php
+++ b/apps/dav/appinfo/routes.php
@@ -11,9 +11,6 @@ return [
['name' => 'invitation_response#decline', 'url' => '/invitation/decline/{token}', 'verb' => 'GET'],
['name' => 'invitation_response#options', 'url' => '/invitation/moreOptions/{token}', 'verb' => 'GET'],
['name' => 'invitation_response#processMoreOptionsResult', 'url' => '/invitation/moreOptions/{token}', 'verb' => 'POST'],
- ['name' => 'example_content#getDefaultContact', 'url' => '/api/defaultcontact/contact', 'verb' => 'GET'],
- ['name' => 'example_content#setDefaultContact', 'url' => '/api/defaultcontact/contact', 'verb' => 'PUT'],
- ['name' => 'example_content#setEnableDefaultContact', 'url' => '/api/defaultcontact/config', 'verb' => 'PUT'],
],
'ocs' => [
['name' => 'direct#getUrl', 'url' => '/api/v1/direct', 'verb' => 'POST'],
diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php
index 312f30ca8c5..4c48f343c4c 100644
--- a/apps/dav/composer/composer/autoload_classmap.php
+++ b/apps/dav/composer/composer/autoload_classmap.php
@@ -366,7 +366,7 @@ return array(
'OCA\\DAV\\Server' => $baseDir . '/../lib/Server.php',
'OCA\\DAV\\ServerFactory' => $baseDir . '/../lib/ServerFactory.php',
'OCA\\DAV\\Service\\AbsenceService' => $baseDir . '/../lib/Service/AbsenceService.php',
- 'OCA\\DAV\\Service\\DefaultContactService' => $baseDir . '/../lib/Service/DefaultContactService.php',
+ 'OCA\\DAV\\Service\\ExampleContactService' => $baseDir . '/../lib/Service/ExampleContactService.php',
'OCA\\DAV\\Service\\ExampleEventService' => $baseDir . '/../lib/Service/ExampleEventService.php',
'OCA\\DAV\\Settings\\Admin\\SystemAddressBookSettings' => $baseDir . '/../lib/Settings/Admin/SystemAddressBookSettings.php',
'OCA\\DAV\\Settings\\AvailabilitySettings' => $baseDir . '/../lib/Settings/AvailabilitySettings.php',
diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php
index aeb354685bf..4d9166a2d5a 100644
--- a/apps/dav/composer/composer/autoload_static.php
+++ b/apps/dav/composer/composer/autoload_static.php
@@ -381,7 +381,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Server' => __DIR__ . '/..' . '/../lib/Server.php',
'OCA\\DAV\\ServerFactory' => __DIR__ . '/..' . '/../lib/ServerFactory.php',
'OCA\\DAV\\Service\\AbsenceService' => __DIR__ . '/..' . '/../lib/Service/AbsenceService.php',
- 'OCA\\DAV\\Service\\DefaultContactService' => __DIR__ . '/..' . '/../lib/Service/DefaultContactService.php',
+ 'OCA\\DAV\\Service\\ExampleContactService' => __DIR__ . '/..' . '/../lib/Service/ExampleContactService.php',
'OCA\\DAV\\Service\\ExampleEventService' => __DIR__ . '/..' . '/../lib/Service/ExampleEventService.php',
'OCA\\DAV\\Settings\\Admin\\SystemAddressBookSettings' => __DIR__ . '/..' . '/../lib/Settings/Admin/SystemAddressBookSettings.php',
'OCA\\DAV\\Settings\\AvailabilitySettings' => __DIR__ . '/..' . '/../lib/Settings/AvailabilitySettings.php',
diff --git a/apps/dav/lib/Controller/ExampleContentController.php b/apps/dav/lib/Controller/ExampleContentController.php
index 905fd392e6c..e20ee4b7f49 100644
--- a/apps/dav/lib/Controller/ExampleContentController.php
+++ b/apps/dav/lib/Controller/ExampleContentController.php
@@ -10,6 +10,7 @@ declare(strict_types=1);
namespace OCA\DAV\Controller;
use OCA\DAV\AppInfo\Application;
+use OCA\DAV\Service\ExampleContactService;
use OCA\DAV\Service\ExampleEventService;
use OCP\AppFramework\ApiController;
use OCP\AppFramework\Http;
@@ -17,103 +18,50 @@ use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\DataDownloadResponse;
use OCP\AppFramework\Http\JSONResponse;
-use OCP\Files\AppData\IAppDataFactory;
-use OCP\Files\IAppData;
-use OCP\Files\NotFoundException;
-use OCP\IAppConfig;
-use OCP\IConfig;
use OCP\IRequest;
use Psr\Log\LoggerInterface;
class ExampleContentController extends ApiController {
- private IAppData $appData;
-
public function __construct(
IRequest $request,
- private IConfig $config,
- private IAppConfig $appConfig,
- private IAppDataFactory $appDataFactory,
- private LoggerInterface $logger,
- private ExampleEventService $exampleEventService,
+ private readonly LoggerInterface $logger,
+ private readonly ExampleEventService $exampleEventService,
+ private readonly ExampleContactService $exampleContactService,
) {
parent::__construct(Application::APP_ID, $request);
- $this->appData = $this->appDataFactory->get('dav');
}
- public function setEnableDefaultContact($allow) {
- if ($allow === 'yes' && !$this->defaultContactExists()) {
+ #[FrontpageRoute(verb: 'PUT', url: '/api/defaultcontact/config')]
+ public function setEnableDefaultContact(bool $allow): JSONResponse {
+ if ($allow && !$this->exampleContactService->defaultContactExists()) {
try {
- $this->setCard();
+ $this->exampleContactService->setCard();
} catch (\Exception $e) {
$this->logger->error('Could not create default contact', ['exception' => $e]);
return new JSONResponse([], Http::STATUS_INTERNAL_SERVER_ERROR);
}
}
- $this->config->setAppValue(Application::APP_ID, 'enableDefaultContact', $allow);
+ $this->exampleContactService->setDefaultContactEnabled($allow);
return new JSONResponse([], Http::STATUS_OK);
}
#[NoCSRFRequired]
+ #[FrontpageRoute(verb: 'GET', url: '/api/defaultcontact/contact')]
public function getDefaultContact(): DataDownloadResponse {
- $cardData = $this->getCard()
+ $cardData = $this->exampleContactService->getCard()
?? file_get_contents(__DIR__ . '/../ExampleContentFiles/exampleContact.vcf');
return new DataDownloadResponse($cardData, 'example_contact.vcf', 'text/vcard');
}
+ #[FrontpageRoute(verb: 'PUT', url: '/api/defaultcontact/contact')]
public function setDefaultContact(?string $contactData = null) {
- if (!$this->config->getAppValue(Application::APP_ID, 'enableDefaultContact', 'yes')) {
+ if (!$this->exampleContactService->isDefaultContactEnabled()) {
return new JSONResponse([], Http::STATUS_FORBIDDEN);
}
- $this->setCard($contactData);
+ $this->exampleContactService->setCard($contactData);
return new JSONResponse([], Http::STATUS_OK);
}
- private function getCard(): ?string {
- try {
- $folder = $this->appData->getFolder('defaultContact');
- } catch (NotFoundException $e) {
- return null;
- }
-
- if (!$folder->fileExists('defaultContact.vcf')) {
- return null;
- }
-
- return $folder->getFile('defaultContact.vcf')->getContent();
- }
-
- private function setCard(?string $cardData = null) {
- try {
- $folder = $this->appData->getFolder('defaultContact');
- } catch (NotFoundException $e) {
- $folder = $this->appData->newFolder('defaultContact');
- }
-
- $isCustom = true;
- if (is_null($cardData)) {
- $cardData = file_get_contents(__DIR__ . '/../ExampleContentFiles/exampleContact.vcf');
- $isCustom = false;
- }
-
- if (!$cardData) {
- throw new \Exception('Could not read exampleContact.vcf');
- }
-
- $file = (!$folder->fileExists('defaultContact.vcf')) ? $folder->newFile('defaultContact.vcf') : $folder->getFile('defaultContact.vcf');
- $file->putContent($cardData);
-
- $this->appConfig->setValueBool(Application::APP_ID, 'hasCustomDefaultContact', $isCustom);
- }
-
- private function defaultContactExists(): bool {
- try {
- $folder = $this->appData->getFolder('defaultContact');
- } catch (NotFoundException $e) {
- return false;
- }
- return $folder->fileExists('defaultContact.vcf');
- }
-
#[FrontpageRoute(verb: 'POST', url: '/api/exampleEvent/enable')]
public function setCreateExampleEvent(bool $enable): JSONResponse {
$this->exampleEventService->setCreateExampleEvent($enable);
diff --git a/apps/dav/lib/Listener/UserEventsListener.php b/apps/dav/lib/Listener/UserEventsListener.php
index 67cf228515a..c876192d67f 100644
--- a/apps/dav/lib/Listener/UserEventsListener.php
+++ b/apps/dav/lib/Listener/UserEventsListener.php
@@ -12,7 +12,7 @@ namespace OCA\DAV\Listener;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\CardDAV\SyncService;
-use OCA\DAV\Service\DefaultContactService;
+use OCA\DAV\Service\ExampleContactService;
use OCA\DAV\Service\ExampleEventService;
use OCP\Accounts\UserUpdatedEvent;
use OCP\Defaults;
@@ -46,7 +46,7 @@ class UserEventsListener implements IEventListener {
private CalDavBackend $calDav,
private CardDavBackend $cardDav,
private Defaults $themingDefaults,
- private DefaultContactService $defaultContactService,
+ private ExampleContactService $exampleContactService,
private ExampleEventService $exampleEventService,
private LoggerInterface $logger,
) {
@@ -175,7 +175,7 @@ class UserEventsListener implements IEventListener {
}
}
if ($addressBookId) {
- $this->defaultContactService->createDefaultContact($addressBookId);
+ $this->exampleContactService->createDefaultContact($addressBookId);
}
}
}
diff --git a/apps/dav/lib/Service/DefaultContactService.php b/apps/dav/lib/Service/DefaultContactService.php
deleted file mode 100644
index 24e55ef7b69..00000000000
--- a/apps/dav/lib/Service/DefaultContactService.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/**
- * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-namespace OCA\DAV\Service;
-
-use OCA\DAV\AppInfo\Application;
-use OCA\DAV\CardDAV\CardDavBackend;
-use OCP\App\IAppManager;
-use OCP\Files\AppData\IAppDataFactory;
-use OCP\IAppConfig;
-use Psr\Log\LoggerInterface;
-use Symfony\Component\Uid\Uuid;
-
-class DefaultContactService {
- public function __construct(
- private CardDavBackend $cardDav,
- private IAppManager $appManager,
- private IAppDataFactory $appDataFactory,
- private IAppConfig $config,
- private LoggerInterface $logger,
- ) {
- }
-
- public function createDefaultContact(int $addressBookId): void {
- $enableDefaultContact = $this->config->getValueString(Application::APP_ID, 'enableDefaultContact', 'yes');
- if ($enableDefaultContact !== 'yes') {
- return;
- }
- $appData = $this->appDataFactory->get('dav');
- try {
- $folder = $appData->getFolder('defaultContact');
- $defaultContactFile = $folder->getFile('defaultContact.vcf');
- $data = $defaultContactFile->getContent();
- } catch (\Exception $e) {
- $this->logger->error('Couldn\'t get default contact file', ['exception' => $e]);
- return;
- }
-
- // Make sure the UID is unique
- $newUid = Uuid::v4()->toRfc4122();
- $newRev = date('Ymd\THis\Z');
- $vcard = \Sabre\VObject\Reader::read($data, \Sabre\VObject\Reader::OPTION_FORGIVING);
- if ($vcard->UID) {
- $vcard->UID->setValue($newUid);
- } else {
- $vcard->add('UID', $newUid);
- }
- if ($vcard->REV) {
- $vcard->REV->setValue($newRev);
- } else {
- $vcard->add('REV', $newRev);
- }
-
- // Level 3 means that the document is invalid
- // https://sabre.io/vobject/vcard/#validating-vcard
- $level3Warnings = array_filter($vcard->validate(), function ($warning) {
- return $warning['level'] === 3;
- });
-
- if (!empty($level3Warnings)) {
- $this->logger->error('Default contact is invalid', ['warnings' => $level3Warnings]);
- return;
- }
- try {
- $this->cardDav->createCard($addressBookId, 'default', $vcard->serialize(), false);
- } catch (\Exception $e) {
- $this->logger->error($e->getMessage(), ['exception' => $e]);
- }
-
- }
-}
diff --git a/apps/dav/lib/Service/ExampleContactService.php b/apps/dav/lib/Service/ExampleContactService.php
new file mode 100644
index 00000000000..6ed6c66cbb3
--- /dev/null
+++ b/apps/dav/lib/Service/ExampleContactService.php
@@ -0,0 +1,132 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\DAV\Service;
+
+use OCA\DAV\AppInfo\Application;
+use OCA\DAV\CardDAV\CardDavBackend;
+use OCP\AppFramework\Services\IAppConfig;
+use OCP\Files\AppData\IAppDataFactory;
+use OCP\Files\IAppData;
+use OCP\Files\NotFoundException;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Uid\Uuid;
+
+class ExampleContactService {
+ private readonly IAppData $appData;
+
+ public function __construct(
+ IAppDataFactory $appDataFactory,
+ private readonly IAppConfig $appConfig,
+ private readonly LoggerInterface $logger,
+ private readonly CardDavBackend $cardDav,
+ ) {
+ $this->appData = $appDataFactory->get(Application::APP_ID);
+ }
+
+ public function isDefaultContactEnabled(): bool {
+ return $this->appConfig->getAppValueBool('enableDefaultContact', true);
+ }
+
+ public function setDefaultContactEnabled(bool $value): void {
+ $this->appConfig->setAppValueBool('enableDefaultContact', $value);
+ }
+
+ public function getCard(): ?string {
+ try {
+ $folder = $this->appData->getFolder('defaultContact');
+ } catch (NotFoundException $e) {
+ return null;
+ }
+
+ if (!$folder->fileExists('defaultContact.vcf')) {
+ return null;
+ }
+
+ return $folder->getFile('defaultContact.vcf')->getContent();
+ }
+
+ public function setCard(?string $cardData = null) {
+ try {
+ $folder = $this->appData->getFolder('defaultContact');
+ } catch (NotFoundException $e) {
+ $folder = $this->appData->newFolder('defaultContact');
+ }
+
+ $isCustom = true;
+ if (is_null($cardData)) {
+ $cardData = file_get_contents(__DIR__ . '/../ExampleContentFiles/exampleContact.vcf');
+ $isCustom = false;
+ }
+
+ if (!$cardData) {
+ throw new \Exception('Could not read exampleContact.vcf');
+ }
+
+ $file = (!$folder->fileExists('defaultContact.vcf')) ? $folder->newFile('defaultContact.vcf') : $folder->getFile('defaultContact.vcf');
+ $file->putContent($cardData);
+
+ $this->appConfig->setAppValueBool('hasCustomDefaultContact', $isCustom);
+ }
+
+ public function defaultContactExists(): bool {
+ try {
+ $folder = $this->appData->getFolder('defaultContact');
+ } catch (NotFoundException $e) {
+ return false;
+ }
+ return $folder->fileExists('defaultContact.vcf');
+ }
+
+ public function createDefaultContact(int $addressBookId): void {
+ if (!$this->isDefaultContactEnabled()) {
+ return;
+ }
+
+ try {
+ $folder = $this->appData->getFolder('defaultContact');
+ $defaultContactFile = $folder->getFile('defaultContact.vcf');
+ $data = $defaultContactFile->getContent();
+ } catch (\Exception $e) {
+ $this->logger->error('Couldn\'t get default contact file', ['exception' => $e]);
+ return;
+ }
+
+ // Make sure the UID is unique
+ $newUid = Uuid::v4()->toRfc4122();
+ $newRev = date('Ymd\THis\Z');
+ $vcard = \Sabre\VObject\Reader::read($data, \Sabre\VObject\Reader::OPTION_FORGIVING);
+ if ($vcard->UID) {
+ $vcard->UID->setValue($newUid);
+ } else {
+ $vcard->add('UID', $newUid);
+ }
+ if ($vcard->REV) {
+ $vcard->REV->setValue($newRev);
+ } else {
+ $vcard->add('REV', $newRev);
+ }
+
+ // Level 3 means that the document is invalid
+ // https://sabre.io/vobject/vcard/#validating-vcard
+ $level3Warnings = array_filter($vcard->validate(), static function ($warning) {
+ return $warning['level'] === 3;
+ });
+
+ if (!empty($level3Warnings)) {
+ $this->logger->error('Default contact is invalid', ['warnings' => $level3Warnings]);
+ return;
+ }
+ try {
+ $this->cardDav->createCard($addressBookId, 'default', $vcard->serialize(), false);
+ } catch (\Exception $e) {
+ $this->logger->error($e->getMessage(), ['exception' => $e]);
+ }
+ }
+}
diff --git a/apps/dav/lib/Settings/ExampleContentSettings.php b/apps/dav/lib/Settings/ExampleContentSettings.php
index fef2d25b8d2..7b6f9b03a3a 100644
--- a/apps/dav/lib/Settings/ExampleContentSettings.php
+++ b/apps/dav/lib/Settings/ExampleContentSettings.php
@@ -9,21 +9,21 @@ declare(strict_types=1);
namespace OCA\DAV\Settings;
use OCA\DAV\AppInfo\Application;
+use OCA\DAV\Service\ExampleContactService;
use OCA\DAV\Service\ExampleEventService;
use OCP\App\IAppManager;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\AppFramework\Services\IAppConfig;
use OCP\AppFramework\Services\IInitialState;
-use OCP\IAppConfig;
-use OCP\IConfig;
use OCP\Settings\ISettings;
class ExampleContentSettings implements ISettings {
public function __construct(
- private readonly IConfig $config,
private readonly IAppConfig $appConfig,
private readonly IInitialState $initialState,
private readonly IAppManager $appManager,
private readonly ExampleEventService $exampleEventService,
+ private readonly ExampleContactService $exampleContactService,
) {
}
@@ -43,11 +43,13 @@ class ExampleContentSettings implements ISettings {
}
if ($contactsEnabled) {
- $enableDefaultContact = $this->config->getAppValue(Application::APP_ID, 'enableDefaultContact', 'yes');
- $this->initialState->provideInitialState('enableDefaultContact', $enableDefaultContact);
+ $this->initialState->provideInitialState(
+ 'enableDefaultContact',
+ $this->exampleContactService->isDefaultContactEnabled(),
+ );
$this->initialState->provideInitialState(
'hasCustomDefaultContact',
- $this->appConfig->getValueBool(Application::APP_ID, 'hasCustomDefaultContact'),
+ $this->appConfig->getAppValueBool('hasCustomDefaultContact'),
);
}
diff --git a/apps/dav/src/components/ExampleContactSettings.vue b/apps/dav/src/components/ExampleContactSettings.vue
index 0e34c7a12da..cdfdc130189 100644
--- a/apps/dav/src/components/ExampleContactSettings.vue
+++ b/apps/dav/src/components/ExampleContactSettings.vue
@@ -63,7 +63,7 @@ import IconCheck from '@mdi/svg/svg/check.svg?raw'
import logger from '../service/logger.js'
import ExampleContentDownloadButton from './ExampleContentDownloadButton.vue'
-const enableDefaultContact = loadState('dav', 'enableDefaultContact') === 'yes'
+const enableDefaultContact = loadState('dav', 'enableDefaultContact')
const hasCustomDefaultContact = loadState('dav', 'hasCustomDefaultContact')
export default {
@@ -106,7 +106,7 @@ export default {
methods: {
updateEnableDefaultContact() {
axios.put(generateUrl('apps/dav/api/defaultcontact/config'), {
- allow: this.enableDefaultContact ? 'no' : 'yes',
+ allow: !this.enableDefaultContact,
}).then(() => {
this.enableDefaultContact = !this.enableDefaultContact
}).catch(() => {
diff --git a/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php b/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php
index f03343af008..40d2fb62431 100644
--- a/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php
+++ b/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php
@@ -14,7 +14,7 @@ use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\CardDAV\SyncService;
use OCA\DAV\Listener\UserEventsListener;
-use OCA\DAV\Service\DefaultContactService;
+use OCA\DAV\Service\ExampleContactService;
use OCA\DAV\Service\ExampleEventService;
use OCP\Defaults;
use OCP\IUser;
@@ -29,7 +29,7 @@ class UserEventsListenerTest extends TestCase {
private CalDavBackend&MockObject $calDavBackend;
private CardDavBackend&MockObject $cardDavBackend;
private Defaults&MockObject $defaults;
- private DefaultContactService&MockObject $defaultContactService;
+ private ExampleContactService&MockObject $exampleContactService;
private ExampleEventService&MockObject $exampleEventService;
private LoggerInterface&MockObject $logger;
@@ -43,7 +43,7 @@ class UserEventsListenerTest extends TestCase {
$this->calDavBackend = $this->createMock(CalDavBackend::class);
$this->cardDavBackend = $this->createMock(CardDavBackend::class);
$this->defaults = $this->createMock(Defaults::class);
- $this->defaultContactService = $this->createMock(DefaultContactService::class);
+ $this->exampleContactService = $this->createMock(ExampleContactService::class);
$this->exampleEventService = $this->createMock(ExampleEventService::class);
$this->logger = $this->createMock(LoggerInterface::class);
@@ -53,7 +53,7 @@ class UserEventsListenerTest extends TestCase {
$this->calDavBackend,
$this->cardDavBackend,
$this->defaults,
- $this->defaultContactService,
+ $this->exampleContactService,
$this->exampleEventService,
$this->logger,
);
diff --git a/apps/dav/tests/unit/Service/DefaultContactServiceTest.php b/apps/dav/tests/unit/Service/ExampleContactServiceTest.php
index 3bd8c9cb6f6..4c8d900ae86 100644
--- a/apps/dav/tests/unit/Service/DefaultContactServiceTest.php
+++ b/apps/dav/tests/unit/Service/ExampleContactServiceTest.php
@@ -10,56 +10,60 @@ declare(strict_types=1);
namespace OCA\DAV\Tests\unit\Service;
use OCA\DAV\CardDAV\CardDavBackend;
-use OCA\DAV\Service\DefaultContactService;
+use OCA\DAV\Service\ExampleContactService;
use OCP\App\IAppManager;
+use OCP\AppFramework\Services\IAppConfig;
use OCP\Files\AppData\IAppDataFactory;
use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\Files\SimpleFS\ISimpleFolder;
-use OCP\IAppConfig;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Symfony\Component\Uid\Uuid;
use Test\TestCase;
-class DefaultContactServiceTest extends TestCase {
- protected DefaultContactService $service;
+class ExampleContactServiceTest extends TestCase {
+ protected ExampleContactService $service;
protected CardDavBackend&MockObject $cardDav;
protected IAppManager&MockObject $appManager;
protected IAppDataFactory&MockObject $appDataFactory;
protected LoggerInterface&MockObject $logger;
- protected IAppConfig&MockObject $config;
+ protected IAppConfig&MockObject $appConfig;
+ protected IAppData&MockObject $appData;
protected function setUp(): void {
parent::setUp();
$this->cardDav = $this->createMock(CardDavBackend::class);
- $this->appManager = $this->createMock(IAppManager::class);
$this->appDataFactory = $this->createMock(IAppDataFactory::class);
$this->logger = $this->createMock(LoggerInterface::class);
- $this->config = $this->createMock(IAppConfig::class);
+ $this->appConfig = $this->createMock(IAppConfig::class);
- $this->service = new DefaultContactService(
- $this->cardDav,
- $this->appManager,
+ $this->appData = $this->createMock(IAppData::class);
+ $this->appDataFactory->method('get')
+ ->with('dav')
+ ->willReturn($this->appData);
+
+ $this->service = new ExampleContactService(
$this->appDataFactory,
- $this->config,
+ $this->appConfig,
$this->logger,
+ $this->cardDav,
);
}
public function testCreateDefaultContactWithInvalidCard(): void {
// Invalid vCard missing required FN property
$vcardContent = "BEGIN:VCARD\nVERSION:3.0\nEND:VCARD";
- $this->config->method('getValueString')->willReturn('yes');
- $appData = $this->createMock(IAppData::class);
+ $this->appConfig->method('getAppValueBool')
+ ->with('enableDefaultContact', true)
+ ->willReturn(true);
$folder = $this->createMock(ISimpleFolder::class);
$file = $this->createMock(ISimpleFile::class);
$file->method('getContent')->willReturn($vcardContent);
$folder->method('getFile')->willReturn($file);
- $appData->method('getFolder')->willReturn($folder);
- $this->appDataFactory->method('get')->willReturn($appData);
+ $this->appData->method('getFolder')->willReturn($folder);
$this->logger->expects($this->once())
->method('error')
@@ -76,14 +80,14 @@ class DefaultContactServiceTest extends TestCase {
$originalRev = '20200101T000000Z';
$vcardContent = "BEGIN:VCARD\nVERSION:3.0\nFN:Test User\nUID:$originalUid\nREV:$originalRev\nEND:VCARD";
- $this->config->method('getValueString')->willReturn('yes');
- $appData = $this->createMock(IAppData::class);
+ $this->appConfig->method('getAppValueBool')
+ ->with('enableDefaultContact', true)
+ ->willReturn(true);
$folder = $this->createMock(ISimpleFolder::class);
$file = $this->createMock(ISimpleFile::class);
$file->method('getContent')->willReturn($vcardContent);
$folder->method('getFile')->willReturn($file);
- $appData->method('getFolder')->willReturn($folder);
- $this->appDataFactory->method('get')->willReturn($appData);
+ $this->appData->method('getFolder')->willReturn($folder);
$capturedCardData = null;
$this->cardDav->expects($this->once())
@@ -107,10 +111,10 @@ class DefaultContactServiceTest extends TestCase {
}
public function testDefaultContactFileDoesNotExist(): void {
- $appData = $this->createMock(IAppData::class);
- $this->config->method('getValueString')->willReturn('yes');
- $appData->method('getFolder')->willThrowException(new NotFoundException());
- $this->appDataFactory->method('get')->willReturn($appData);
+ $this->appConfig->method('getAppValueBool')
+ ->with('enableDefaultContact', true)
+ ->willReturn(true);
+ $this->appData->method('getFolder')->willThrowException(new NotFoundException());
$this->cardDav->expects($this->never())
->method('createCard');
@@ -121,14 +125,14 @@ class DefaultContactServiceTest extends TestCase {
public function testUidAndRevAreAddedIfMissing(): void {
$vcardContent = "BEGIN:VCARD\nVERSION:3.0\nFN:Test User\nEND:VCARD";
- $this->config->method('getValueString')->willReturn('yes');
- $appData = $this->createMock(IAppData::class);
+ $this->appConfig->method('getAppValueBool')
+ ->with('enableDefaultContact', true)
+ ->willReturn(true);
$folder = $this->createMock(ISimpleFolder::class);
$file = $this->createMock(ISimpleFile::class);
$file->method('getContent')->willReturn($vcardContent);
$folder->method('getFile')->willReturn($file);
- $appData->method('getFolder')->willReturn($folder);
- $this->appDataFactory->method('get')->willReturn($appData);
+ $this->appData->method('getFolder')->willReturn($folder);
$capturedCardData = 'new-card-data';
@@ -154,7 +158,9 @@ class DefaultContactServiceTest extends TestCase {
}
public function testDefaultContactIsNotCreatedIfEnabled(): void {
- $this->config->method('getValueString')->willReturn('no');
+ $this->appConfig->method('getAppValueBool')
+ ->with('enableDefaultContact', true)
+ ->willReturn(false);
$this->logger->expects($this->never())
->method('error');
$this->cardDav->expects($this->never())
@@ -162,4 +168,27 @@ class DefaultContactServiceTest extends TestCase {
$this->service->createDefaultContact(123);
}
+
+ public static function provideDefaultContactEnableData(): array {
+ return [[true], [false]];
+ }
+
+ /** @dataProvider provideDefaultContactEnableData */
+ public function testIsDefaultContactEnabled(bool $enabled): void {
+ $this->appConfig->expects(self::once())
+ ->method('getAppValueBool')
+ ->with('enableDefaultContact', true)
+ ->willReturn($enabled);
+
+ $this->assertEquals($enabled, $this->service->isDefaultContactEnabled());
+ }
+
+ /** @dataProvider provideDefaultContactEnableData */
+ public function testSetDefaultContactEnabled(bool $enabled): void {
+ $this->appConfig->expects(self::once())
+ ->method('setAppValueBool')
+ ->with('enableDefaultContact', $enabled);
+
+ $this->service->setDefaultContactEnabled($enabled);
+ }
}
diff --git a/apps/encryption/l10n/et_EE.js b/apps/encryption/l10n/et_EE.js
index 1dd886792e6..70de2cc0c46 100644
--- a/apps/encryption/l10n/et_EE.js
+++ b/apps/encryption/l10n/et_EE.js
@@ -1,46 +1,55 @@
OC.L10N.register(
"encryption",
{
- "Missing recovery key password" : "Muuda taastevõtme parool",
- "Please repeat the recovery key password" : "Palun korda uut taastevõtme parooli",
- "Repeated recovery key password does not match the provided recovery key password" : "Lahtritesse sisestatud taastevõtme paroolid ei kattu",
+ "Missing recovery key password" : "Muuda taastevõtme salasõna",
+ "Please repeat the recovery key password" : "Palun korda uut taastevõtme salasõna",
+ "Repeated recovery key password does not match the provided recovery key password" : "Sisestatud taastevõtme salasõna ei kattu",
"Recovery key successfully enabled" : "Taastevõtme lubamine õnnestus",
- "Could not enable recovery key. Please check your recovery key password!" : "Ei suutnud lubada taastevõtit. Palun kontrolli oma taastevõtme parooli!",
+ "Could not enable recovery key. Please check your recovery key password!" : "Ei suutnud taastevõtit kasutusele võtta. Palun kontrolli oma taastevõtme salasõna!",
"Recovery key successfully disabled" : "Taastevõtme keelamine õnnestus",
- "Could not disable recovery key. Please check your recovery key password!" : "Ei suuda keelata taastevõtit. Palun kontrolli oma taastevõtme parooli!",
+ "Could not disable recovery key. Please check your recovery key password!" : "Ei suutnud taastevõtme kasutamist lõpetada. Palun kontrolli oma taastevõtme salasõna!",
"Missing parameters" : "Parameetrid puuduvad",
"Please provide the old recovery password" : "Palun sisesta vana taastevõtme salasõna",
"Please provide a new recovery password" : "Palun sisesta uus taastevõtme salasõna",
- "Please repeat the new recovery password" : "Palun korda uut taastevõtme parooli",
- "Password successfully changed." : "Parool edukalt vahetatud.",
- "Could not change the password. Maybe the old password was not correct." : "Ei suutnud vahetada parooli. Võib-olla on vana parool valesti sisestatud.",
+ "Please repeat the new recovery password" : "Palun korda uut taastevõtme salasõna",
+ "Password successfully changed." : "Salasõna vahetamine õnnestus.",
+ "Could not change the password. Maybe the old password was not correct." : "Ei suutnud muuta salasõna. Võib-olla on vana salasõna valesti sisestatud.",
"Recovery Key disabled" : "Taastevõti on välja lülitatud",
"Recovery Key enabled" : "Taastevõti on sisse lülitatud",
- "Could not update the private key password." : "Ei suutnud uuendada privaatse võtme parooli.",
- "The old password was not correct, please try again." : "Vana parool polnud õige, palun proovi uuesti.",
- "The current log-in password was not correct, please try again." : "Praeguse sisselogimise parool polnud õige, palun proovi uuesti.",
- "Private key password successfully updated." : "Privaatse võtme parool edukalt uuendatud.",
+ "Could not update the private key password." : "Ei suutnud uuendada privaatvõtme salasõna.",
+ "The old password was not correct, please try again." : "Vana salasõna polnud õige, palun proovi uuesti.",
+ "The current log-in password was not correct, please try again." : "Sisselogimise senine salasõna polnud õige, palun proovi uuesti.",
+ "Private key password successfully updated." : "Privaatvõtme salasõna uuendamine õnnestus.",
+ "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Krüptimisrakenduse vigane privaatvõti. Taastamaks ligipääsu krüptitud failidele palun uuenda oma isiklikest seadistustest privaatvõtme salasõna.",
"Bad Signature" : "Vigane allkiri",
"Missing Signature" : "Allkiri puudub",
+ "one-time password for server-side-encryption" : "ühekordne salasõna serveripoolse krüptimise jaoks",
"Encryption password" : "Krüptimise salasõna",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Serveri peakasutaja lülitas sisse serveripoolse krüptimise. Sinu failid on krüptitud salasõnaga <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Serveri peakasutaja lülitas sisse serveripoolse krüptimise. Sinu failid on krüptitud salasõnaga „%s“.",
+ "Default encryption module" : "Vaikimisi krüptimismoodul",
+ "Default encryption module for server-side encryption" : "Vaikimisi krüptimismoodul serveripoolse krüptimise jaoks",
+ "Encrypt the home storage" : "Krüpti ka sisemine andmeruum",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Selle valiku kasutamisel krüptitakse failid sisemises ja välises andmeruumis. Vastasel juhul vaid välises andmeruumis.",
"Enable recovery key" : "Luba taastevõtme kasutamine",
"Disable recovery key" : "Keela taastevõtme kasutamine",
- "Recovery key password" : "Taastevõtme parool",
- "Repeat recovery key password" : "Korda taastevõtme parooli",
- "Change recovery key password:" : "Muuda taastevõtme parooli:",
- "Old recovery key password" : "Vana taastevõtme parool",
- "New recovery key password" : "Uus taastevõtme parool",
- "Repeat new recovery key password" : "Korda uut taastevõtme parooli",
- "Change Password" : "Muuda parooli",
- "Your private key password no longer matches your log-in password." : "Sinu provaatvõtme parool ei kattu enam sinu sisselogimise parooliga.",
- "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme parooliks oma praegune sisselogimise parool.",
- "Old log-in password" : "Vana sisselogimise parool",
- "Current log-in password" : "Praegune sisselogimise parool",
- "Update Private Key Password" : "Uuenda privaatse võtme parooli",
- "Enable password recovery:" : "Luba parooli taaste:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab taastada ligipääsu krüpteeritud failidele kui parooli kaotuse puhul",
+ "The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Taastevõti on täiendav krüptovõti, mida kasutatakse failide krüptimisel. Kui peaksid põhilise salasõna unustama, siis saad seda failide taastamisel kasutada. Salvesta ta turvaliselt digitaalsesse salasõnalaekasse või vana kooli seifi.",
+ "Recovery key password" : "Taastevõtme salasõna",
+ "Repeat recovery key password" : "Korda taastevõtme salasõna",
+ "Change recovery key password:" : "Muuda taastevõtme salasõna:",
+ "Old recovery key password" : "Vana taastevõtme salasõna",
+ "New recovery key password" : "Uus taastevõtme salasõna",
+ "Repeat new recovery key password" : "Korda uut taastevõtme salasõna",
+ "Change Password" : "Muuda salasõna",
+ "Basic encryption module" : "Lihtkrüptimise moodul",
+ "Your private key password no longer matches your log-in password." : "Sinu privaatvõtme salasõna ei kattu enam sinu sisselogimise salasõna.",
+ "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme salasõnaks oma praegune sisselogimise salasõna.",
+ "If you do not remember your old password you can ask your administrator to recover your files." : "Kui sa ei mäleta oma vana salasõna, siis palu oma süsteemihalduril taastada ligipääs failidele.",
+ "Old log-in password" : "Sisselogimise vana salasõna",
+ "Current log-in password" : "Sisselogimise praegune salasõna",
+ "Update Private Key Password" : "Uuenda privaatvõtme salasõna",
+ "Enable password recovery:" : "Luba salasõna taastamine:",
+ "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab salasõna kaotamise korral taastada ligipääsu krüptitud failidele",
"Enabled" : "Sisse lülitatud",
"Disabled" : "Välja lülitatud"
},
diff --git a/apps/encryption/l10n/et_EE.json b/apps/encryption/l10n/et_EE.json
index 1f1cad621d0..bd7a9d32858 100644
--- a/apps/encryption/l10n/et_EE.json
+++ b/apps/encryption/l10n/et_EE.json
@@ -1,44 +1,53 @@
{ "translations": {
- "Missing recovery key password" : "Muuda taastevõtme parool",
- "Please repeat the recovery key password" : "Palun korda uut taastevõtme parooli",
- "Repeated recovery key password does not match the provided recovery key password" : "Lahtritesse sisestatud taastevõtme paroolid ei kattu",
+ "Missing recovery key password" : "Muuda taastevõtme salasõna",
+ "Please repeat the recovery key password" : "Palun korda uut taastevõtme salasõna",
+ "Repeated recovery key password does not match the provided recovery key password" : "Sisestatud taastevõtme salasõna ei kattu",
"Recovery key successfully enabled" : "Taastevõtme lubamine õnnestus",
- "Could not enable recovery key. Please check your recovery key password!" : "Ei suutnud lubada taastevõtit. Palun kontrolli oma taastevõtme parooli!",
+ "Could not enable recovery key. Please check your recovery key password!" : "Ei suutnud taastevõtit kasutusele võtta. Palun kontrolli oma taastevõtme salasõna!",
"Recovery key successfully disabled" : "Taastevõtme keelamine õnnestus",
- "Could not disable recovery key. Please check your recovery key password!" : "Ei suuda keelata taastevõtit. Palun kontrolli oma taastevõtme parooli!",
+ "Could not disable recovery key. Please check your recovery key password!" : "Ei suutnud taastevõtme kasutamist lõpetada. Palun kontrolli oma taastevõtme salasõna!",
"Missing parameters" : "Parameetrid puuduvad",
"Please provide the old recovery password" : "Palun sisesta vana taastevõtme salasõna",
"Please provide a new recovery password" : "Palun sisesta uus taastevõtme salasõna",
- "Please repeat the new recovery password" : "Palun korda uut taastevõtme parooli",
- "Password successfully changed." : "Parool edukalt vahetatud.",
- "Could not change the password. Maybe the old password was not correct." : "Ei suutnud vahetada parooli. Võib-olla on vana parool valesti sisestatud.",
+ "Please repeat the new recovery password" : "Palun korda uut taastevõtme salasõna",
+ "Password successfully changed." : "Salasõna vahetamine õnnestus.",
+ "Could not change the password. Maybe the old password was not correct." : "Ei suutnud muuta salasõna. Võib-olla on vana salasõna valesti sisestatud.",
"Recovery Key disabled" : "Taastevõti on välja lülitatud",
"Recovery Key enabled" : "Taastevõti on sisse lülitatud",
- "Could not update the private key password." : "Ei suutnud uuendada privaatse võtme parooli.",
- "The old password was not correct, please try again." : "Vana parool polnud õige, palun proovi uuesti.",
- "The current log-in password was not correct, please try again." : "Praeguse sisselogimise parool polnud õige, palun proovi uuesti.",
- "Private key password successfully updated." : "Privaatse võtme parool edukalt uuendatud.",
+ "Could not update the private key password." : "Ei suutnud uuendada privaatvõtme salasõna.",
+ "The old password was not correct, please try again." : "Vana salasõna polnud õige, palun proovi uuesti.",
+ "The current log-in password was not correct, please try again." : "Sisselogimise senine salasõna polnud õige, palun proovi uuesti.",
+ "Private key password successfully updated." : "Privaatvõtme salasõna uuendamine õnnestus.",
+ "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Krüptimisrakenduse vigane privaatvõti. Taastamaks ligipääsu krüptitud failidele palun uuenda oma isiklikest seadistustest privaatvõtme salasõna.",
"Bad Signature" : "Vigane allkiri",
"Missing Signature" : "Allkiri puudub",
+ "one-time password for server-side-encryption" : "ühekordne salasõna serveripoolse krüptimise jaoks",
"Encryption password" : "Krüptimise salasõna",
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Serveri peakasutaja lülitas sisse serveripoolse krüptimise. Sinu failid on krüptitud salasõnaga <strong>%s</strong>.",
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Serveri peakasutaja lülitas sisse serveripoolse krüptimise. Sinu failid on krüptitud salasõnaga „%s“.",
+ "Default encryption module" : "Vaikimisi krüptimismoodul",
+ "Default encryption module for server-side encryption" : "Vaikimisi krüptimismoodul serveripoolse krüptimise jaoks",
+ "Encrypt the home storage" : "Krüpti ka sisemine andmeruum",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Selle valiku kasutamisel krüptitakse failid sisemises ja välises andmeruumis. Vastasel juhul vaid välises andmeruumis.",
"Enable recovery key" : "Luba taastevõtme kasutamine",
"Disable recovery key" : "Keela taastevõtme kasutamine",
- "Recovery key password" : "Taastevõtme parool",
- "Repeat recovery key password" : "Korda taastevõtme parooli",
- "Change recovery key password:" : "Muuda taastevõtme parooli:",
- "Old recovery key password" : "Vana taastevõtme parool",
- "New recovery key password" : "Uus taastevõtme parool",
- "Repeat new recovery key password" : "Korda uut taastevõtme parooli",
- "Change Password" : "Muuda parooli",
- "Your private key password no longer matches your log-in password." : "Sinu provaatvõtme parool ei kattu enam sinu sisselogimise parooliga.",
- "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme parooliks oma praegune sisselogimise parool.",
- "Old log-in password" : "Vana sisselogimise parool",
- "Current log-in password" : "Praegune sisselogimise parool",
- "Update Private Key Password" : "Uuenda privaatse võtme parooli",
- "Enable password recovery:" : "Luba parooli taaste:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab taastada ligipääsu krüpteeritud failidele kui parooli kaotuse puhul",
+ "The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Taastevõti on täiendav krüptovõti, mida kasutatakse failide krüptimisel. Kui peaksid põhilise salasõna unustama, siis saad seda failide taastamisel kasutada. Salvesta ta turvaliselt digitaalsesse salasõnalaekasse või vana kooli seifi.",
+ "Recovery key password" : "Taastevõtme salasõna",
+ "Repeat recovery key password" : "Korda taastevõtme salasõna",
+ "Change recovery key password:" : "Muuda taastevõtme salasõna:",
+ "Old recovery key password" : "Vana taastevõtme salasõna",
+ "New recovery key password" : "Uus taastevõtme salasõna",
+ "Repeat new recovery key password" : "Korda uut taastevõtme salasõna",
+ "Change Password" : "Muuda salasõna",
+ "Basic encryption module" : "Lihtkrüptimise moodul",
+ "Your private key password no longer matches your log-in password." : "Sinu privaatvõtme salasõna ei kattu enam sinu sisselogimise salasõna.",
+ "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme salasõnaks oma praegune sisselogimise salasõna.",
+ "If you do not remember your old password you can ask your administrator to recover your files." : "Kui sa ei mäleta oma vana salasõna, siis palu oma süsteemihalduril taastada ligipääs failidele.",
+ "Old log-in password" : "Sisselogimise vana salasõna",
+ "Current log-in password" : "Sisselogimise praegune salasõna",
+ "Update Private Key Password" : "Uuenda privaatvõtme salasõna",
+ "Enable password recovery:" : "Luba salasõna taastamine:",
+ "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab salasõna kaotamise korral taastada ligipääsu krüptitud failidele",
"Enabled" : "Sisse lülitatud",
"Disabled" : "Välja lülitatud"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/federatedfilesharing/l10n/et_EE.js b/apps/federatedfilesharing/l10n/et_EE.js
index cc498be6c35..a8d5b5bf547 100644
--- a/apps/federatedfilesharing/l10n/et_EE.js
+++ b/apps/federatedfilesharing/l10n/et_EE.js
@@ -4,7 +4,7 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Vigane liitpilve ID",
"Server to server sharing is not enabled on this server" : "Serveritevaheline jagamine ei ole selle pilves aktiiveeritud",
"Couldn't establish a federated share." : "Liitjagamist ei õnnestunud luua",
- "Couldn't establish a federated share, maybe the password was wrong." : "Liitjagamist ei õnnestunud luua, ehk oli parool vale.",
+ "Couldn't establish a federated share, maybe the password was wrong." : "Liitjagamist ei õnnestunud luua, vast oli salasõna vale.",
"Federated Share request sent, you will receive an invitation. Check your notifications." : "Liitjagamise päring edastatud, sulle saadetakse kutse. Kontrolli oma teateid.",
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Liitjagamist ei saanud luua, näib, et liitmiseks mõeldud server on liiga vana (Nextcloud <= 9).",
"It is not allowed to send federated group shares from this server." : "Sellest serverist ei ole lubatud liitrühma jagamisi saata.",
@@ -65,7 +65,7 @@ OC.L10N.register(
"Add remote share" : "Lisa kaugjagamine",
"Remote share" : "Kaugjagamine",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Soovid lisada kaugjagamise {name} asukohast {owner}@{remote}?",
- "Remote share password" : "Kaugjagamise parool",
+ "Remote share password" : "Kaugjagamise salasõna",
"Incoming share could not be processed" : "Sissetulevat kausta ei saanud töödelda"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/et_EE.json b/apps/federatedfilesharing/l10n/et_EE.json
index 81dd979414c..894a5a54dcc 100644
--- a/apps/federatedfilesharing/l10n/et_EE.json
+++ b/apps/federatedfilesharing/l10n/et_EE.json
@@ -2,7 +2,7 @@
"Invalid Federated Cloud ID" : "Vigane liitpilve ID",
"Server to server sharing is not enabled on this server" : "Serveritevaheline jagamine ei ole selle pilves aktiiveeritud",
"Couldn't establish a federated share." : "Liitjagamist ei õnnestunud luua",
- "Couldn't establish a federated share, maybe the password was wrong." : "Liitjagamist ei õnnestunud luua, ehk oli parool vale.",
+ "Couldn't establish a federated share, maybe the password was wrong." : "Liitjagamist ei õnnestunud luua, vast oli salasõna vale.",
"Federated Share request sent, you will receive an invitation. Check your notifications." : "Liitjagamise päring edastatud, sulle saadetakse kutse. Kontrolli oma teateid.",
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Liitjagamist ei saanud luua, näib, et liitmiseks mõeldud server on liiga vana (Nextcloud <= 9).",
"It is not allowed to send federated group shares from this server." : "Sellest serverist ei ole lubatud liitrühma jagamisi saata.",
@@ -63,7 +63,7 @@
"Add remote share" : "Lisa kaugjagamine",
"Remote share" : "Kaugjagamine",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Soovid lisada kaugjagamise {name} asukohast {owner}@{remote}?",
- "Remote share password" : "Kaugjagamise parool",
+ "Remote share password" : "Kaugjagamise salasõna",
"Incoming share could not be processed" : "Sissetulevat kausta ei saanud töödelda"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index 0a366f2031f..e212852abaa 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -455,6 +455,7 @@ OC.L10N.register(
"New text file.txt" : "Nuovo file di testo.txt",
"%1$s (renamed)" : "%1$s (rinominato)",
"renamed file" : "file rinominato",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
"{count} files could not be converted" : "{count} file non possono essere convertiti",
"{count} files successfully converted" : "{count} file convertiti con successo"
},
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index 5ceaf0f95c9..c75a3e590ae 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -453,6 +453,7 @@
"New text file.txt" : "Nuovo file di testo.txt",
"%1$s (renamed)" : "%1$s (rinominato)",
"renamed file" : "file rinominato",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
"{count} files could not be converted" : "{count} file non possono essere convertiti",
"{count} files successfully converted" : "{count} file convertiti con successo"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
diff --git a/apps/files/l10n/sw.js b/apps/files/l10n/sw.js
index 966124e25f0..4cbe3219c2f 100644
--- a/apps/files/l10n/sw.js
+++ b/apps/files/l10n/sw.js
@@ -5,7 +5,7 @@ OC.L10N.register(
"Removed from favorites" : "Imeondolewa kutoka vipendwa",
"You added {file} to your favorites" : "Umeongeza {file}kwa vipendwa vyako",
"You removed {file} from your favorites" : "Umeondoa {file}kwenye vipendwa vyako",
- "Favorites" : "Vipendwa",
+ "Favorites" : "Vinavyopendwa",
"File changes" : "Mabadiliko ya faili",
"Created by {user}" : "Imetengenezwa na {user}",
"Changed by {user}" : "Imebadilishwa na {user}",
@@ -124,6 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Vichwa vya safu wima vilivyo na vifungo vinaweza kupangwa.\n ",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Orodha hii haijatolewa kikamilifu kwa sababu za utendaji. Faili zitatolewa unapopitia orodha.",
"File not found" : "Faili halipatikani",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} iliyochaguliwa"],
"{usedQuotaByte} used" : "{usedQuotaByte}imetumika",
"{used} of {quota} used" : "{used} ya {quota}imetumika",
"{relative}% used" : "{relative}% imetumika",
@@ -232,9 +233,30 @@ OC.L10N.register(
"Remove from favorites" : "Ondoa kutoka katika pendwa",
"Add to favorites" : "Ongeza kwenye pendwa",
"Tags" : "Maoni",
+ "Blank" : "Mabano",
+ "Unable to create new file from template" : "Imeshindwa kutengeneza faili jipya kutoka kwenye sampuli/kiolezo",
+ "Pick a template for {name}" : "Chagua sampuli/kiolezo kwa {name}",
+ "Create a new file with the selected template" : "Tengeneza faili jipya na kiolezo/sampuli iliyochaguliwa",
"Creating file" : "Inatengeneza faili",
"Save as {displayName}" : "Hifadhi kama {displayName}",
"Save as …" : "Hifadhi kama",
+ "Converting files …" : "Inageuza mafaili",
+ "Failed to convert files: {message}" : "Imeshindwa kugeuza faili {message}",
+ "All files failed to be converted" : "Faili zote zimeshindwa kugeuzwa",
+ "One file could not be converted: {message}" : "Faili moja isingeweza kugeuzwa {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n faili zisingeweza kugeuzwa"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n faili zimegeuzwa kikamilifu"],
+ "Files successfully converted" : "Faili zimegeuzwa kikamilifu",
+ "Failed to convert files" : "Imeshindwa kugeuza faili",
+ "Converting file …" : "Inageuza faili",
+ "File successfully converted" : "Faili imegeuzwa kikamilifu",
+ "Failed to convert file: {message}" : "Imeshindwa kugeuza faili {message}",
+ "Failed to convert file" : "Imeshindwa kugeuza faili",
+ "Deletion cancelled" : "Ufutaji umesitishwa",
+ "Leave this share" : "Ondoa ushirikishaji huu",
+ "Leave these shares" : "Ondoa shiriki hizi",
+ "Disconnect storage" : "Achanisha uhifadhi",
+ "Disconnect storages" : "Achanisha hifadhi",
"Delete permanently" : "Futa moja kwa moja",
"Delete and unshare" : "Futa na usishirikishe",
"Delete file" : "Futa faili",
@@ -251,49 +273,190 @@ OC.L10N.register(
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Huwezi kuhamisha faili/folda kwenye yenyewe au kwenye folda yenyewe",
"(copy)" : "(nakili)",
"(copy %n)" : "(nakili %n)",
+ "Move cancelled" : "Uhamishaji umeghairishwa",
+ "A file or folder with that name already exists in this folder" : "Faili au kisanduku chenye jina hilo tayari kipo katika kisanduku hiki",
+ "The files are locked" : "Faili zimezuiliwa",
+ "The file does not exist anymore" : "Faili halipo tena",
+ "Choose destination" : "Chagua eneo lengwa",
"Copy to {target}" : "Nakili kwenda {target}",
"Copy" : "Nakili",
"Move to {target}" : "Hamishia {target}",
"Move" : "Hamisha",
+ "Move or copy operation failed" : "Operesheni ya kuhamisha au kunakili imeshindikana",
"Move or copy" : "Hamisha au nakili",
+ "Cancelled move or copy of \"{filename}\"." : "Imesitisha uhamishaji au unakili wa \"{filename}\"",
+ "Cancelled move or copy operation" : "Imesitisha operesheni ya uhamishaji au unakili",
"Open folder {displayName}" : "Fungua kisanduku {displayName}",
"Open in Files" : "Fungua ndani ya faili",
"Open locally" : "Fungua kikawaida",
"Failed to redirect to client" : "Imeshindwa kuielekeza kwa mteja",
"Open file locally" : "Fungua faili kikawaida",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Sasa faili inapaswa kufunguliwa kwenye kifaa chako. Ikiwa sivyo, tafadhali hakikisha kuwa umesakinisha programu ya eneo-kazi.",
+ "Retry and close" : "Jaribu upya kisha funga",
"Open online" : "Fungua mtandaoni",
"Rename" : "Ipe jina jipya",
"Open details" : "Fungua maelezo",
+ "View in folder" : "Angalia ndani ya kisanduku",
"Today" : "Leo",
"Last 7 days" : "Siku 7 zilizopita",
"Last 30 days" : "Siku 30 zilizopita",
"This year ({year})" : "Mwaka huu {year}",
"Last year ({year})" : "Mwaka uliopita {year}",
"Documents" : "Nyaraka",
+ "Spreadsheets" : "Lahajedwali",
"Presentations" : "Uwasilishaji",
"PDFs" : "PDFs",
"Folders" : "Visanduku",
"Audio" : "Sauti",
+ "Photos and images" : "Picha na taswira",
"Videos" : "Picha mjongeo",
+ "New folder creation cancelled" : "Utengenezaji wa kisanduku kipya umesitishwa",
+ "Created new folder \"{name}\"" : "Imetengeneza kisanduku kipya \"{name}\"",
+ "Unable to initialize the templates directory" : "Haikuweza kuanzisha saraka ya violezo",
+ "Create templates folder" : "Imetengeneza kisanduku cha violezo",
+ "Templates" : "Violezo",
+ "New template folder" : "Kisanduku kipya cha violezo",
"In folder" : "Ndani ya kisanduku",
"Search in folder: {folder}" : "Tafuta katika kisanduku {folder}",
+ "One of the dropped files could not be processed" : "Moja ya faili zilizodondoshwa isingeweza kuchakatwa",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Kivinjari chako hakitumii API ya mfumo wa faili. Orodha hazitapakiwa\n ",
"No files to upload" : "Hakuna faili la kupakia",
+ "Unable to create the directory {directory}" : "Haiwezi kutengeneza orodha {directory}",
+ "Some files could not be uploaded" : "Faili kadhaa zisingeweza kupakiwa",
+ "Files uploaded successfully" : "Faili zimepakiwa kikamilifu",
"No files to process" : "Hakuna faili la kuchakata",
+ "Some files could not be copied" : "Faili baadhi zisingeweza kunakiliwa",
+ "Some files could not be moved" : "Faili baadhi zisingeweza kuhamishwa",
"Files copied successfully" : "Faili limenakiliwa kikamilifu",
"Files moved successfully" : "Faili limeondolewa kikamilifu",
+ "Conflicts resolution skipped" : "Utatuzi wa migogoro ulirukwa",
"Upload cancelled" : "Upakiaji umesitishwa",
+ "This operation is forbidden" : "Opereshini hii imezuiwa",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Orodha haipatikani, tafadhali angalia uingiaji au wasiliana na msimamizi",
+ "Storage is temporarily not available" : "Uhifadhi haupo kwa muda",
"Unexpected error: {error}" : "Hitilafu isiyotarajiwa {error}",
+ "_%n file_::_%n files_" : ["%n file","%n faili"],
+ "_%n folder_::_%n folders_" : ["%n folder","%n visanduku/vikasha"],
+ "_%n hidden_::_%n hidden_" : ["%n hidden","%n imefichwa"],
+ "Filename must not be empty." : "Jina la faili halipaswi kuwa tupu",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" hairuhusiwi ndani ya jina la faili",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ni jina la akiba na haliruhusiwi kwa majina ya faili",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" si aina ya faili inayoruhusiwa",
+ "Filenames must not end with \"{extension}\"." : "Majina ya faili hayapaswi kuishia na \"{extension}\"",
+ "List of favorite files and folders." : "Orodha ya faili na visanduku vinanyopendwa",
+ "No favorites yet" : "Bado hakuna vinavyopendwa",
+ "Files and folders you mark as favorite will show up here" : "Faili na visunduku ulivyoweka alama kama vipendwa vitaonekana hapa",
+ "All files" : "Faili zote",
+ "List of your files and folders." : "Orodha ya faili na vikasha vyako",
+ "All folders" : "Vikasha vyote",
+ "Personal files" : "Faili binafsi",
+ "List of your files and folders that are not shared." : "Orodha ya faili na vikasha ambavyo havijashirikishwa",
+ "No personal files found" : "Hakuna faili binafsi zilizopatikana",
+ "Files that are not shared will show up here." : "Faili ambazo hazija shirikishwa zitaonekana hapa",
+ "Recent" : "Hivi karibuni",
+ "List of recently modified files and folders." : "Orodha ya faili na vikasha vilivyoboreshwa hivi karibuni",
+ "No recently modified files" : "Hakuna faili zilizoboreshwa hivi karibuni",
+ "Files and folders you recently modified will show up here." : "Faili na vikasha ulivyoboresha hivi karibuni vitaonekana hapa",
+ "No entries found in this folder" : "Hakuna maingizo yaliyopatikana katika kasha hili",
+ "Select all" : "Chagua zote",
+ "Upload too large" : "Upakiaji mkubwa mno",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Faili unazojaribu kupakia zinazidi ukubwa wa juu zaidi wa upakiaji wa faili kwenye seva hii.",
+ "File could not be found" : "Faili isingeweza kupatikana",
"Download" : "Pakua",
+ "Show list view" : "Onesha mwonekeno wa orodha",
+ "Show grid view" : "Onesha mwonekano wa mstariramani",
"Close" : "Funga",
+ "Could not create folder \"{dir}\"" : "Isingeweza kutengeneza kasha \"{dir}\"",
+ "This will stop your current uploads." : "Hii itasimamisha ukakiaji wako wa sasa",
+ "Upload cancelled." : "Upakiaji umesitishwa ",
+ "Processing files …" : "Faili zinazochakatwa",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Haiwezi kupakia {filename} kama ilivyo orodha au ina baiti 0",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Hakuna nafasi ya kutosha, unapakia {size1} lakini imesalia {size2} pekee",
+ "Target folder \"{dir}\" does not exist any more" : "Kasha lengwa \"{dir}\" halipatikani tena",
+ "An unknown error has occurred" : "Hitilafu isiyojulikana imetokea",
+ "File could not be uploaded" : "Faili isingeweza kupakia",
"Uploading …" : "Inapakia",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Inapakia... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} ya {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Upakiaji wa kipengele hicho hauwezeshwi",
+ "Error when assembling chunks, status code {status}" : "Hitilafu wakakti wa kukusanya vipande, nambari ya hali {status}",
+ "Choose target folder" : "Chagua kasha lililolengwa",
+ "Set reminder" : "Weka ukumbusho",
+ "Edit locally" : "Hariri kikawaida",
"Open" : "Fungua",
+ "Could not load info for file \"{file}\"" : "Isingeweza kupakia taarifa kwa faili \"{file}\"",
"Details" : "Maelezo ya kina",
+ "Please select tag(s) to add to the selection" : "Tafadhali chagua lebo za kuongeza kwenye uteuzi",
+ "Apply tag(s) to selection" : "Omba lebo kwenye uteuzi",
+ "Select directory \"{dirName}\"" : "Teua orodha \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Teua faili \"{fileName}\"",
+ "Unable to determine date" : "Haiwezi kuamua tarehe",
+ "Could not move \"{file}\", target exists" : "Haikuweza kuhamisha \"{file}\" lengo lililopo",
+ "Could not move \"{file}\"" : "Haiwezi kuhamisha \"{file}\"",
"copy" : "Nakili",
+ "Could not copy \"{file}\", target exists" : "Haiwezi kunakili \"{file}\" lengo lililopo",
"Could not copy \"{file}\"" : "Haikuweza kunakili {file}",
+ "Copied {origin} inside {destination}" : "Imenakili {origin} ndani ya {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Imenakili {origin} na {nbfiles} faili zingine ndani ya {destination}",
+ "{newName} already exists" : "{newName} lipo tayari",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Haikuweza kuita jina jipya \"{fileName}\", halipo tena",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jina \"{targetName}\" tayari linatumika katika kisanduku \"{dir}\". Tafadhali chagua jina tofauti",
+ "Could not rename \"{fileName}\"" : "Haikuweza kuita jina jipya \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Haikuweza kutengeneza faili \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Haikuweza kuteengeneza faili \"{file}\" kwa sababu lipo tayari",
+ "Could not create folder \"{dir}\" because it already exists" : "Haikuweza kutengeneza kisanduku \"{dir}\" kwa sababu kipo tayari",
+ "Could not fetch file details \"{file}\"" : "Haikuleta maelezo ya faili \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Hitilafu kufuta faili \"{fileName}\"",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Hakuna matokeo ya utafutaji ndani ya masanduku mengine {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ingiza wahusika zaidi ya wawili kutafuta ndani ya masanduku mengine",
+ "{dirs} and {files}" : "{dirs} na {files}",
+ "_including %n hidden_::_including %n hidden_" : ["including %n hidden","inajumuisha %n iliyofichwa"],
+ "You do not have permission to upload or create files here" : "Huna ruhusa ya kupakia au kutengeneza faili hapa",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Inapakia faili %n"],
"New" : "Mpya",
+ "New file/folder menu" : "Faili mpya/ menyu ya kisanduku",
+ "Select file range" : "Chagua safu ya faili",
+ "{used}%" : "{used} %",
"{used} used" : "{used}imetumika",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ni jina la faili lisilo halali",
+ "File name cannot be empty." : "Jina la faili haliwezi kawa tupu",
+ "\"/\" is not allowed inside a file name." : "\"/\" hairuhusiwi ndani ya jina la faili",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" si aina ya faili iliyoruhusiwa",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Uhifadhi wa {owner} umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Kundi la vikasha \"{mountPoint}\" limejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Uhifadhi wa nje \"{mountPoint}\" umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Uhifadhi wako umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Uhafidhi wa {owner} unakaribia kujaa ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Kundi la vikasha \"{mountPoint}linakaribia kujaa ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Uhifadhi wa nje \"{mountPoint}\" unakaribia kujaa ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Uhafadhi wako unakaribia kujaa ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","linganisha \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Kiungo cha moja kwa moja kilinakiliwa (hufanya kazi tu kwa watu wanaoweza kufikia faili/kikasha hiki)",
+ "Path" : "Njia",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n baiti"],
+ "Favored" : "Imependelewa",
+ "Favor" : "Upendeleo",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Nakili kiungo cha moja kwa moja (inafanya kazi tu kwa watu wanaoweza kufikia faili/folda hii)",
"Upload file" : "Pakia faili",
"Not favored" : "Haikupendwa",
- "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao."
+ "An error occurred while trying to update the tags" : "Hitilafu imetokea wakati ikijaribu kusasisha lebo",
+ "Upload (max. %s)" : "Pakia (kiwango cha juu. %s)",
+ "Submitting fields…" : "Inawasilisha migunda",
+ "Filter filenames…" : "Chuja majina ya faili",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","Visandiku {folderCount} "],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","Faili {fileCount} "],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","Faili 1 na {folderCount} makasha"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} faili na kasha 1"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} faili na {folderCount}makasha",
+ "Personal Files" : "Faili binafsi",
+ "Text file" : "Faili ya maandishi",
+ "New text file.txt" : "Faili mpya ya maandishi.txt",
+ "%1$s (renamed)" : "%1$s (iliyopew jina jipya)",
+ "renamed file" : "Faili iliyopewa jina jipya",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao.",
+ "{count} files could not be converted" : "{count} files could not be converted",
+ "{count} files successfully converted" : "{count} files successfully converted"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/sw.json b/apps/files/l10n/sw.json
index e6b7997e086..3142db10ae0 100644
--- a/apps/files/l10n/sw.json
+++ b/apps/files/l10n/sw.json
@@ -3,7 +3,7 @@
"Removed from favorites" : "Imeondolewa kutoka vipendwa",
"You added {file} to your favorites" : "Umeongeza {file}kwa vipendwa vyako",
"You removed {file} from your favorites" : "Umeondoa {file}kwenye vipendwa vyako",
- "Favorites" : "Vipendwa",
+ "Favorites" : "Vinavyopendwa",
"File changes" : "Mabadiliko ya faili",
"Created by {user}" : "Imetengenezwa na {user}",
"Changed by {user}" : "Imebadilishwa na {user}",
@@ -122,6 +122,7 @@
"Column headers with buttons are sortable." : "Vichwa vya safu wima vilivyo na vifungo vinaweza kupangwa.\n ",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Orodha hii haijatolewa kikamilifu kwa sababu za utendaji. Faili zitatolewa unapopitia orodha.",
"File not found" : "Faili halipatikani",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} iliyochaguliwa"],
"{usedQuotaByte} used" : "{usedQuotaByte}imetumika",
"{used} of {quota} used" : "{used} ya {quota}imetumika",
"{relative}% used" : "{relative}% imetumika",
@@ -230,9 +231,30 @@
"Remove from favorites" : "Ondoa kutoka katika pendwa",
"Add to favorites" : "Ongeza kwenye pendwa",
"Tags" : "Maoni",
+ "Blank" : "Mabano",
+ "Unable to create new file from template" : "Imeshindwa kutengeneza faili jipya kutoka kwenye sampuli/kiolezo",
+ "Pick a template for {name}" : "Chagua sampuli/kiolezo kwa {name}",
+ "Create a new file with the selected template" : "Tengeneza faili jipya na kiolezo/sampuli iliyochaguliwa",
"Creating file" : "Inatengeneza faili",
"Save as {displayName}" : "Hifadhi kama {displayName}",
"Save as …" : "Hifadhi kama",
+ "Converting files …" : "Inageuza mafaili",
+ "Failed to convert files: {message}" : "Imeshindwa kugeuza faili {message}",
+ "All files failed to be converted" : "Faili zote zimeshindwa kugeuzwa",
+ "One file could not be converted: {message}" : "Faili moja isingeweza kugeuzwa {message}",
+ "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n faili zisingeweza kugeuzwa"],
+ "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n faili zimegeuzwa kikamilifu"],
+ "Files successfully converted" : "Faili zimegeuzwa kikamilifu",
+ "Failed to convert files" : "Imeshindwa kugeuza faili",
+ "Converting file …" : "Inageuza faili",
+ "File successfully converted" : "Faili imegeuzwa kikamilifu",
+ "Failed to convert file: {message}" : "Imeshindwa kugeuza faili {message}",
+ "Failed to convert file" : "Imeshindwa kugeuza faili",
+ "Deletion cancelled" : "Ufutaji umesitishwa",
+ "Leave this share" : "Ondoa ushirikishaji huu",
+ "Leave these shares" : "Ondoa shiriki hizi",
+ "Disconnect storage" : "Achanisha uhifadhi",
+ "Disconnect storages" : "Achanisha hifadhi",
"Delete permanently" : "Futa moja kwa moja",
"Delete and unshare" : "Futa na usishirikishe",
"Delete file" : "Futa faili",
@@ -249,49 +271,190 @@
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Huwezi kuhamisha faili/folda kwenye yenyewe au kwenye folda yenyewe",
"(copy)" : "(nakili)",
"(copy %n)" : "(nakili %n)",
+ "Move cancelled" : "Uhamishaji umeghairishwa",
+ "A file or folder with that name already exists in this folder" : "Faili au kisanduku chenye jina hilo tayari kipo katika kisanduku hiki",
+ "The files are locked" : "Faili zimezuiliwa",
+ "The file does not exist anymore" : "Faili halipo tena",
+ "Choose destination" : "Chagua eneo lengwa",
"Copy to {target}" : "Nakili kwenda {target}",
"Copy" : "Nakili",
"Move to {target}" : "Hamishia {target}",
"Move" : "Hamisha",
+ "Move or copy operation failed" : "Operesheni ya kuhamisha au kunakili imeshindikana",
"Move or copy" : "Hamisha au nakili",
+ "Cancelled move or copy of \"{filename}\"." : "Imesitisha uhamishaji au unakili wa \"{filename}\"",
+ "Cancelled move or copy operation" : "Imesitisha operesheni ya uhamishaji au unakili",
"Open folder {displayName}" : "Fungua kisanduku {displayName}",
"Open in Files" : "Fungua ndani ya faili",
"Open locally" : "Fungua kikawaida",
"Failed to redirect to client" : "Imeshindwa kuielekeza kwa mteja",
"Open file locally" : "Fungua faili kikawaida",
+ "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Sasa faili inapaswa kufunguliwa kwenye kifaa chako. Ikiwa sivyo, tafadhali hakikisha kuwa umesakinisha programu ya eneo-kazi.",
+ "Retry and close" : "Jaribu upya kisha funga",
"Open online" : "Fungua mtandaoni",
"Rename" : "Ipe jina jipya",
"Open details" : "Fungua maelezo",
+ "View in folder" : "Angalia ndani ya kisanduku",
"Today" : "Leo",
"Last 7 days" : "Siku 7 zilizopita",
"Last 30 days" : "Siku 30 zilizopita",
"This year ({year})" : "Mwaka huu {year}",
"Last year ({year})" : "Mwaka uliopita {year}",
"Documents" : "Nyaraka",
+ "Spreadsheets" : "Lahajedwali",
"Presentations" : "Uwasilishaji",
"PDFs" : "PDFs",
"Folders" : "Visanduku",
"Audio" : "Sauti",
+ "Photos and images" : "Picha na taswira",
"Videos" : "Picha mjongeo",
+ "New folder creation cancelled" : "Utengenezaji wa kisanduku kipya umesitishwa",
+ "Created new folder \"{name}\"" : "Imetengeneza kisanduku kipya \"{name}\"",
+ "Unable to initialize the templates directory" : "Haikuweza kuanzisha saraka ya violezo",
+ "Create templates folder" : "Imetengeneza kisanduku cha violezo",
+ "Templates" : "Violezo",
+ "New template folder" : "Kisanduku kipya cha violezo",
"In folder" : "Ndani ya kisanduku",
"Search in folder: {folder}" : "Tafuta katika kisanduku {folder}",
+ "One of the dropped files could not be processed" : "Moja ya faili zilizodondoshwa isingeweza kuchakatwa",
+ "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Kivinjari chako hakitumii API ya mfumo wa faili. Orodha hazitapakiwa\n ",
"No files to upload" : "Hakuna faili la kupakia",
+ "Unable to create the directory {directory}" : "Haiwezi kutengeneza orodha {directory}",
+ "Some files could not be uploaded" : "Faili kadhaa zisingeweza kupakiwa",
+ "Files uploaded successfully" : "Faili zimepakiwa kikamilifu",
"No files to process" : "Hakuna faili la kuchakata",
+ "Some files could not be copied" : "Faili baadhi zisingeweza kunakiliwa",
+ "Some files could not be moved" : "Faili baadhi zisingeweza kuhamishwa",
"Files copied successfully" : "Faili limenakiliwa kikamilifu",
"Files moved successfully" : "Faili limeondolewa kikamilifu",
+ "Conflicts resolution skipped" : "Utatuzi wa migogoro ulirukwa",
"Upload cancelled" : "Upakiaji umesitishwa",
+ "This operation is forbidden" : "Opereshini hii imezuiwa",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Orodha haipatikani, tafadhali angalia uingiaji au wasiliana na msimamizi",
+ "Storage is temporarily not available" : "Uhifadhi haupo kwa muda",
"Unexpected error: {error}" : "Hitilafu isiyotarajiwa {error}",
+ "_%n file_::_%n files_" : ["%n file","%n faili"],
+ "_%n folder_::_%n folders_" : ["%n folder","%n visanduku/vikasha"],
+ "_%n hidden_::_%n hidden_" : ["%n hidden","%n imefichwa"],
+ "Filename must not be empty." : "Jina la faili halipaswi kuwa tupu",
+ "\"{char}\" is not allowed inside a filename." : "\"{char}\" hairuhusiwi ndani ya jina la faili",
+ "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ni jina la akiba na haliruhusiwi kwa majina ya faili",
+ "\"{extension}\" is not an allowed filetype." : "\"{extension}\" si aina ya faili inayoruhusiwa",
+ "Filenames must not end with \"{extension}\"." : "Majina ya faili hayapaswi kuishia na \"{extension}\"",
+ "List of favorite files and folders." : "Orodha ya faili na visanduku vinanyopendwa",
+ "No favorites yet" : "Bado hakuna vinavyopendwa",
+ "Files and folders you mark as favorite will show up here" : "Faili na visunduku ulivyoweka alama kama vipendwa vitaonekana hapa",
+ "All files" : "Faili zote",
+ "List of your files and folders." : "Orodha ya faili na vikasha vyako",
+ "All folders" : "Vikasha vyote",
+ "Personal files" : "Faili binafsi",
+ "List of your files and folders that are not shared." : "Orodha ya faili na vikasha ambavyo havijashirikishwa",
+ "No personal files found" : "Hakuna faili binafsi zilizopatikana",
+ "Files that are not shared will show up here." : "Faili ambazo hazija shirikishwa zitaonekana hapa",
+ "Recent" : "Hivi karibuni",
+ "List of recently modified files and folders." : "Orodha ya faili na vikasha vilivyoboreshwa hivi karibuni",
+ "No recently modified files" : "Hakuna faili zilizoboreshwa hivi karibuni",
+ "Files and folders you recently modified will show up here." : "Faili na vikasha ulivyoboresha hivi karibuni vitaonekana hapa",
+ "No entries found in this folder" : "Hakuna maingizo yaliyopatikana katika kasha hili",
+ "Select all" : "Chagua zote",
+ "Upload too large" : "Upakiaji mkubwa mno",
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Faili unazojaribu kupakia zinazidi ukubwa wa juu zaidi wa upakiaji wa faili kwenye seva hii.",
+ "File could not be found" : "Faili isingeweza kupatikana",
"Download" : "Pakua",
+ "Show list view" : "Onesha mwonekeno wa orodha",
+ "Show grid view" : "Onesha mwonekano wa mstariramani",
"Close" : "Funga",
+ "Could not create folder \"{dir}\"" : "Isingeweza kutengeneza kasha \"{dir}\"",
+ "This will stop your current uploads." : "Hii itasimamisha ukakiaji wako wa sasa",
+ "Upload cancelled." : "Upakiaji umesitishwa ",
+ "Processing files …" : "Faili zinazochakatwa",
+ "…" : "...",
+ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Haiwezi kupakia {filename} kama ilivyo orodha au ina baiti 0",
+ "Not enough free space, you are uploading {size1} but only {size2} is left" : "Hakuna nafasi ya kutosha, unapakia {size1} lakini imesalia {size2} pekee",
+ "Target folder \"{dir}\" does not exist any more" : "Kasha lengwa \"{dir}\" halipatikani tena",
+ "An unknown error has occurred" : "Hitilafu isiyojulikana imetokea",
+ "File could not be uploaded" : "Faili isingeweza kupakia",
"Uploading …" : "Inapakia",
+ "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber}/{total})",
+ "Uploading … ({currentNumber}/{total})" : "Inapakia... ({currentNumber}/{total})",
+ "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} ya {totalSize} ({bitrate})",
+ "Uploading that item is not supported" : "Upakiaji wa kipengele hicho hauwezeshwi",
+ "Error when assembling chunks, status code {status}" : "Hitilafu wakakti wa kukusanya vipande, nambari ya hali {status}",
+ "Choose target folder" : "Chagua kasha lililolengwa",
+ "Set reminder" : "Weka ukumbusho",
+ "Edit locally" : "Hariri kikawaida",
"Open" : "Fungua",
+ "Could not load info for file \"{file}\"" : "Isingeweza kupakia taarifa kwa faili \"{file}\"",
"Details" : "Maelezo ya kina",
+ "Please select tag(s) to add to the selection" : "Tafadhali chagua lebo za kuongeza kwenye uteuzi",
+ "Apply tag(s) to selection" : "Omba lebo kwenye uteuzi",
+ "Select directory \"{dirName}\"" : "Teua orodha \"{dirName}\"",
+ "Select file \"{fileName}\"" : "Teua faili \"{fileName}\"",
+ "Unable to determine date" : "Haiwezi kuamua tarehe",
+ "Could not move \"{file}\", target exists" : "Haikuweza kuhamisha \"{file}\" lengo lililopo",
+ "Could not move \"{file}\"" : "Haiwezi kuhamisha \"{file}\"",
"copy" : "Nakili",
+ "Could not copy \"{file}\", target exists" : "Haiwezi kunakili \"{file}\" lengo lililopo",
"Could not copy \"{file}\"" : "Haikuweza kunakili {file}",
+ "Copied {origin} inside {destination}" : "Imenakili {origin} ndani ya {destination}",
+ "Copied {origin} and {nbfiles} other files inside {destination}" : "Imenakili {origin} na {nbfiles} faili zingine ndani ya {destination}",
+ "{newName} already exists" : "{newName} lipo tayari",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Haikuweza kuita jina jipya \"{fileName}\", halipo tena",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jina \"{targetName}\" tayari linatumika katika kisanduku \"{dir}\". Tafadhali chagua jina tofauti",
+ "Could not rename \"{fileName}\"" : "Haikuweza kuita jina jipya \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Haikuweza kutengeneza faili \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Haikuweza kuteengeneza faili \"{file}\" kwa sababu lipo tayari",
+ "Could not create folder \"{dir}\" because it already exists" : "Haikuweza kutengeneza kisanduku \"{dir}\" kwa sababu kipo tayari",
+ "Could not fetch file details \"{file}\"" : "Haikuleta maelezo ya faili \"{file}\"",
+ "Error deleting file \"{fileName}\"." : "Hitilafu kufuta faili \"{fileName}\"",
+ "No search results in other folders for {tag}{filter}{endtag}" : "Hakuna matokeo ya utafutaji ndani ya masanduku mengine {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Ingiza wahusika zaidi ya wawili kutafuta ndani ya masanduku mengine",
+ "{dirs} and {files}" : "{dirs} na {files}",
+ "_including %n hidden_::_including %n hidden_" : ["including %n hidden","inajumuisha %n iliyofichwa"],
+ "You do not have permission to upload or create files here" : "Huna ruhusa ya kupakia au kutengeneza faili hapa",
+ "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Inapakia faili %n"],
"New" : "Mpya",
+ "New file/folder menu" : "Faili mpya/ menyu ya kisanduku",
+ "Select file range" : "Chagua safu ya faili",
+ "{used}%" : "{used} %",
"{used} used" : "{used}imetumika",
+ "\"{name}\" is an invalid file name." : "\"{name}\" ni jina la faili lisilo halali",
+ "File name cannot be empty." : "Jina la faili haliwezi kawa tupu",
+ "\"/\" is not allowed inside a file name." : "\"/\" hairuhusiwi ndani ya jina la faili",
+ "\"{name}\" is not an allowed filetype" : "\"{name}\" si aina ya faili iliyoruhusiwa",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Uhifadhi wa {owner} umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Kundi la vikasha \"{mountPoint}\" limejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Uhifadhi wa nje \"{mountPoint}\" umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Uhifadhi wako umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Uhafidhi wa {owner} unakaribia kujaa ({usedSpacePercent}%)",
+ "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Kundi la vikasha \"{mountPoint}linakaribia kujaa ({usedSpacePercent}%)",
+ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Uhifadhi wa nje \"{mountPoint}\" unakaribia kujaa ({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)." : "Uhafadhi wako unakaribia kujaa ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","linganisha \"{filter}\""],
+ "Direct link was copied (only works for people who have access to this file/folder)" : "Kiungo cha moja kwa moja kilinakiliwa (hufanya kazi tu kwa watu wanaoweza kufikia faili/kikasha hiki)",
+ "Path" : "Njia",
+ "_%n byte_::_%n bytes_" : ["%n byte","%n baiti"],
+ "Favored" : "Imependelewa",
+ "Favor" : "Upendeleo",
+ "Copy direct link (only works for people who have access to this file/folder)" : "Nakili kiungo cha moja kwa moja (inafanya kazi tu kwa watu wanaoweza kufikia faili/folda hii)",
"Upload file" : "Pakia faili",
"Not favored" : "Haikupendwa",
- "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao."
+ "An error occurred while trying to update the tags" : "Hitilafu imetokea wakati ikijaribu kusasisha lebo",
+ "Upload (max. %s)" : "Pakia (kiwango cha juu. %s)",
+ "Submitting fields…" : "Inawasilisha migunda",
+ "Filter filenames…" : "Chuja majina ya faili",
+ "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","Visandiku {folderCount} "],
+ "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","Faili {fileCount} "],
+ "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","Faili 1 na {folderCount} makasha"],
+ "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} faili na kasha 1"],
+ "{fileCount} files and {folderCount} folders" : "{fileCount} faili na {folderCount}makasha",
+ "Personal Files" : "Faili binafsi",
+ "Text file" : "Faili ya maandishi",
+ "New text file.txt" : "Faili mpya ya maandishi.txt",
+ "%1$s (renamed)" : "%1$s (iliyopew jina jipya)",
+ "renamed file" : "Faili iliyopewa jina jipya",
+ "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao.",
+ "{count} files could not be converted" : "{count} files could not be converted",
+ "{count} files successfully converted" : "{count} files successfully converted"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index 8ad29f48c28..f471afe54e7 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -124,6 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Назви стовпців з кнопками можна впорядковувати",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Список не подається повністю з міркувань обчислювальних потужностей. Файли показуватимуться під час прокручування списку.",
"File not found" : "Файл не знайдено",
+ "_{count} selected_::_{count} selected_" : ["Вибрано {count}","Вибрано {count}","Вибрано {count} ","Вибрано {count} "],
"{usedQuotaByte} used" : "{usedQuotaByte} використано",
"{used} of {quota} used" : "Використано {used} із {quota}",
"{relative}% used" : "{relative}% використано",
diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json
index c124ca30b1b..f44dd661ca8 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -122,6 +122,7 @@
"Column headers with buttons are sortable." : "Назви стовпців з кнопками можна впорядковувати",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Список не подається повністю з міркувань обчислювальних потужностей. Файли показуватимуться під час прокручування списку.",
"File not found" : "Файл не знайдено",
+ "_{count} selected_::_{count} selected_" : ["Вибрано {count}","Вибрано {count}","Вибрано {count} ","Вибрано {count} "],
"{usedQuotaByte} used" : "{usedQuotaByte} використано",
"{used} of {quota} used" : "Використано {used} із {quota}",
"{relative}% used" : "{relative}% використано",
diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue
index b335737c4dd..60791a2b527 100644
--- a/apps/files/src/views/FilesList.vue
+++ b/apps/files/src/views/FilesList.vue
@@ -483,13 +483,6 @@ export default defineComponent({
watch: {
/**
- * Update the window title to match the page heading
- */
- pageHeading() {
- document.title = `${this.pageHeading} - ${getCapabilities().theming?.name ?? 'Nextcloud'}`
- },
-
- /**
* Handle rendering the custom empty view
* @param show The current state if the custom empty view should be rendered
*/
diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php
index fc1f9b9ecd1..fe5f3adb25e 100644
--- a/apps/files_external/lib/Lib/Storage/SMB.php
+++ b/apps/files_external/lib/Lib/Storage/SMB.php
@@ -198,7 +198,7 @@ class SMB extends Common implements INotifyStorage {
try {
$acls = $file->getAcls();
} catch (Exception $e) {
- $this->logger->error('Error while getting file acls', ['exception' => $e]);
+ $this->logger->warning('Error while getting file acls', ['exception' => $e]);
return null;
}
foreach ($acls as $user => $acl) {
@@ -426,6 +426,7 @@ class SMB extends Common implements INotifyStorage {
case 'r':
case 'rb':
if (!$this->file_exists($path)) {
+ $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', file doesn\'t exist.');
return false;
}
return $this->share->read($fullPath);
@@ -453,11 +454,13 @@ class SMB extends Common implements INotifyStorage {
}
if ($this->file_exists($path)) {
if (!$this->isUpdatable($path)) {
+ $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', file not updatable.');
return false;
}
$tmpFile = $this->getCachedFile($path);
} else {
if (!$this->isCreatable(dirname($path))) {
+ $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', parent directory not writable.');
return false;
}
$tmpFile = \OCP\Server::get(ITempManager::class)->getTemporaryFile($ext);
@@ -472,13 +475,16 @@ class SMB extends Common implements INotifyStorage {
}
return false;
} catch (NotFoundException $e) {
+ $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', not found.', ['exception' => $e]);
return false;
} catch (ForbiddenException $e) {
+ $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', forbidden.', ['exception' => $e]);
return false;
} catch (OutOfSpaceException $e) {
+ $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', out of space.', ['exception' => $e]);
throw new EntityTooLargeException('not enough available space to create file', 0, $e);
} catch (ConnectException $e) {
- $this->logger->error('Error while opening file', ['exception' => $e]);
+ $this->logger->error('Error while opening file ' . $path . ' on ' . $this->getId(), ['exception' => $e]);
throw new StorageNotAvailableException($e->getMessage(), (int)$e->getCode(), $e);
}
}
diff --git a/apps/files_sharing/l10n/cs.js b/apps/files_sharing/l10n/cs.js
index f216d185224..8753dc54d64 100644
--- a/apps/files_sharing/l10n/cs.js
+++ b/apps/files_sharing/l10n/cs.js
@@ -185,6 +185,7 @@ OC.L10N.register(
"Set default folder for accepted shares" : "Nastavit výchozí složku pro přijatá sdílení",
"Reset" : "Vrátit na výchozí hodnoty",
"Reset folder to system default" : "Resetovat složku na systémovou výchozí",
+ "Share expiration: {date}" : "Skončení platnosti sdílení: {date}",
"Share Expiration" : "Skončení platnosti sdílení",
"group" : "skupina",
"conversation" : "konverzace",
@@ -309,6 +310,7 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Sdílení, která nejsou součástí interních nebo externích sdílení. Toto mohou být sdílení z aplikací nebo jiných zdrojů.",
"Share with accounts, teams, federated cloud IDs" : "Nasdílejte účtům, týmům, identifikátorům v rámci federovaného cloudu",
"Share with accounts and teams" : "Nasdílet účtům a týmům",
+ "Federated cloud ID" : "Identifikátor v rámci federovaného cloudu",
"Email, federated cloud ID" : "E-mail, identif. federovaného cloudu",
"Unable to load the shares list" : "Nedaří se načíst seznam sdílení",
"Expires {relativetime}" : "Platnost končí {relativetime}",
diff --git a/apps/files_sharing/l10n/cs.json b/apps/files_sharing/l10n/cs.json
index de776d1f283..50059aea129 100644
--- a/apps/files_sharing/l10n/cs.json
+++ b/apps/files_sharing/l10n/cs.json
@@ -183,6 +183,7 @@
"Set default folder for accepted shares" : "Nastavit výchozí složku pro přijatá sdílení",
"Reset" : "Vrátit na výchozí hodnoty",
"Reset folder to system default" : "Resetovat složku na systémovou výchozí",
+ "Share expiration: {date}" : "Skončení platnosti sdílení: {date}",
"Share Expiration" : "Skončení platnosti sdílení",
"group" : "skupina",
"conversation" : "konverzace",
@@ -307,6 +308,7 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Sdílení, která nejsou součástí interních nebo externích sdílení. Toto mohou být sdílení z aplikací nebo jiných zdrojů.",
"Share with accounts, teams, federated cloud IDs" : "Nasdílejte účtům, týmům, identifikátorům v rámci federovaného cloudu",
"Share with accounts and teams" : "Nasdílet účtům a týmům",
+ "Federated cloud ID" : "Identifikátor v rámci federovaného cloudu",
"Email, federated cloud ID" : "E-mail, identif. federovaného cloudu",
"Unable to load the shares list" : "Nedaří se načíst seznam sdílení",
"Expires {relativetime}" : "Platnost končí {relativetime}",
diff --git a/apps/files_sharing/l10n/it.js b/apps/files_sharing/l10n/it.js
index be78bc7fce6..ade501b3d13 100644
--- a/apps/files_sharing/l10n/it.js
+++ b/apps/files_sharing/l10n/it.js
@@ -185,6 +185,7 @@ OC.L10N.register(
"Set default folder for accepted shares" : "Imposta cartella predefinita per condivisioni accettate",
"Reset" : "Ripristina",
"Reset folder to system default" : "Ripristina la cartella alla predefinita di sistema",
+ "Share expiration: {date}" : "Scadenza condivisione: {date}",
"Share Expiration" : "Scadenza Condivisione",
"group" : "gruppo",
"conversation" : "conversazione",
@@ -309,6 +310,7 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Condivisioni che non fanno parte delle condivisioni interne o esterne. Possono essere condivisioni da app o altre fonti.",
"Share with accounts, teams, federated cloud IDs" : "Condividi con account, team, ID cloud federati",
"Share with accounts and teams" : "Condividi con account e team",
+ "Federated cloud ID" : "ID cloud federato",
"Email, federated cloud ID" : "E-mail, ID cloud federato",
"Unable to load the shares list" : "Impossibile caricare l'elenco delle condivisioni",
"Expires {relativetime}" : "Scade il {relativetime}",
diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json
index 3ac41b2d53d..f87b0a5cd74 100644
--- a/apps/files_sharing/l10n/it.json
+++ b/apps/files_sharing/l10n/it.json
@@ -183,6 +183,7 @@
"Set default folder for accepted shares" : "Imposta cartella predefinita per condivisioni accettate",
"Reset" : "Ripristina",
"Reset folder to system default" : "Ripristina la cartella alla predefinita di sistema",
+ "Share expiration: {date}" : "Scadenza condivisione: {date}",
"Share Expiration" : "Scadenza Condivisione",
"group" : "gruppo",
"conversation" : "conversazione",
@@ -307,6 +308,7 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Condivisioni che non fanno parte delle condivisioni interne o esterne. Possono essere condivisioni da app o altre fonti.",
"Share with accounts, teams, federated cloud IDs" : "Condividi con account, team, ID cloud federati",
"Share with accounts and teams" : "Condividi con account e team",
+ "Federated cloud ID" : "ID cloud federato",
"Email, federated cloud ID" : "E-mail, ID cloud federato",
"Unable to load the shares list" : "Impossibile caricare l'elenco delle condivisioni",
"Expires {relativetime}" : "Scade il {relativetime}",
diff --git a/apps/files_sharing/l10n/sr.js b/apps/files_sharing/l10n/sr.js
index 6fe45426dc5..413fccb634c 100644
--- a/apps/files_sharing/l10n/sr.js
+++ b/apps/files_sharing/l10n/sr.js
@@ -185,6 +185,7 @@ OC.L10N.register(
"Set default folder for accepted shares" : "Подесите подразумевани фолдер за прихваћена дељења",
"Reset" : "Ресетуј",
"Reset folder to system default" : "Vratite fasciklu na podrazumevane vrednosti sistema",
+ "Share expiration: {date}" : "Дељење истиче: {date} ",
"Share Expiration" : "Истицање дељења",
"group" : "група",
"conversation" : "разговор",
@@ -309,6 +310,7 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Дељења која нису део интерних или спољних дељења. Ово могу бити дељења из апликација или осталих извора.",
"Share with accounts, teams, federated cloud IDs" : "Дели са налозима, тимовима, ID-јевима здруженог облака",
"Share with accounts and teams" : "Дељење са налозима и тимовима",
+ "Federated cloud ID" : "ИД Здруженог облака",
"Email, federated cloud ID" : "И-мејл, ID здруженог облака",
"Unable to load the shares list" : "Неуспело учитавање листе дељења",
"Expires {relativetime}" : "Истиче {relativetime}",
diff --git a/apps/files_sharing/l10n/sr.json b/apps/files_sharing/l10n/sr.json
index 5a3ea2dadd3..a9bd75ab333 100644
--- a/apps/files_sharing/l10n/sr.json
+++ b/apps/files_sharing/l10n/sr.json
@@ -183,6 +183,7 @@
"Set default folder for accepted shares" : "Подесите подразумевани фолдер за прихваћена дељења",
"Reset" : "Ресетуј",
"Reset folder to system default" : "Vratite fasciklu na podrazumevane vrednosti sistema",
+ "Share expiration: {date}" : "Дељење истиче: {date} ",
"Share Expiration" : "Истицање дељења",
"group" : "група",
"conversation" : "разговор",
@@ -307,6 +308,7 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Дељења која нису део интерних или спољних дељења. Ово могу бити дељења из апликација или осталих извора.",
"Share with accounts, teams, federated cloud IDs" : "Дели са налозима, тимовима, ID-јевима здруженог облака",
"Share with accounts and teams" : "Дељење са налозима и тимовима",
+ "Federated cloud ID" : "ИД Здруженог облака",
"Email, federated cloud ID" : "И-мејл, ID здруженог облака",
"Unable to load the shares list" : "Неуспело учитавање листе дељења",
"Expires {relativetime}" : "Истиче {relativetime}",
diff --git a/apps/files_sharing/l10n/uk.js b/apps/files_sharing/l10n/uk.js
index 3cde1e83f93..f1d8ed89a22 100644
--- a/apps/files_sharing/l10n/uk.js
+++ b/apps/files_sharing/l10n/uk.js
@@ -184,6 +184,7 @@ OC.L10N.register(
"Set default folder for accepted shares" : "Встановити типовий каталог для прийнятих спільних ресурсів",
"Reset" : "Скидання",
"Reset folder to system default" : "Відновити типові системні налаштування для каталогу",
+ "Share expiration: {date}" : "У спільному доступі до: {date}",
"Share Expiration" : "Термін дії спільного ресурсу:",
"group" : "група",
"conversation" : "розмова",
@@ -308,6 +309,7 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Спільні ресурси, що не є ані внутрішніми, ані зовнішніми спільними ресурсами, наприклад, спільні ресурси, створені застосунками чи іншими ресурсами.",
"Share with accounts, teams, federated cloud IDs" : "Поділитися з користувачами, командами, об'єднаними хмарами",
"Share with accounts and teams" : "Поділитися з користувачами або командами",
+ "Federated cloud ID" : "Ідентифікатор об'єднаної хмари",
"Email, federated cloud ID" : "Ел. пошта, ID об'єднаної хмари",
"Unable to load the shares list" : "Не вдалося завантажити список спільних ресурсів",
"Expires {relativetime}" : "Термін дії закінчується {relativetime}",
diff --git a/apps/files_sharing/l10n/uk.json b/apps/files_sharing/l10n/uk.json
index 742fc80c355..395814ab6f4 100644
--- a/apps/files_sharing/l10n/uk.json
+++ b/apps/files_sharing/l10n/uk.json
@@ -182,6 +182,7 @@
"Set default folder for accepted shares" : "Встановити типовий каталог для прийнятих спільних ресурсів",
"Reset" : "Скидання",
"Reset folder to system default" : "Відновити типові системні налаштування для каталогу",
+ "Share expiration: {date}" : "У спільному доступі до: {date}",
"Share Expiration" : "Термін дії спільного ресурсу:",
"group" : "група",
"conversation" : "розмова",
@@ -306,6 +307,7 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Спільні ресурси, що не є ані внутрішніми, ані зовнішніми спільними ресурсами, наприклад, спільні ресурси, створені застосунками чи іншими ресурсами.",
"Share with accounts, teams, federated cloud IDs" : "Поділитися з користувачами, командами, об'єднаними хмарами",
"Share with accounts and teams" : "Поділитися з користувачами або командами",
+ "Federated cloud ID" : "Ідентифікатор об'єднаної хмари",
"Email, federated cloud ID" : "Ел. пошта, ID об'єднаної хмари",
"Unable to load the shares list" : "Не вдалося завантажити список спільних ресурсів",
"Expires {relativetime}" : "Термін дії закінчується {relativetime}",
diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue
index 781626a1ec9..702b876306f 100644
--- a/apps/files_sharing/src/components/SharingEntryLink.vue
+++ b/apps/files_sharing/src/components/SharingEntryLink.vue
@@ -223,13 +223,14 @@
</template>
<script>
+import { showError, showSuccess } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
+import { t } from '@nextcloud/l10n'
+import moment from '@nextcloud/moment'
import { generateUrl, getBaseUrl } from '@nextcloud/router'
-import { showError, showSuccess } from '@nextcloud/dialogs'
import { ShareType } from '@nextcloud/sharing'
-import VueQrcode from '@chenfengyuan/vue-qrcode'
-import moment from '@nextcloud/moment'
+import VueQrcode from '@chenfengyuan/vue-qrcode'
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
import NcActionCheckbox from '@nextcloud/vue/components/NcActionCheckbox'
import NcActionInput from '@nextcloud/vue/components/NcActionInput'
@@ -258,7 +259,7 @@ import GeneratePassword from '../utils/GeneratePassword.ts'
import Share from '../models/Share.ts'
import SharesMixin from '../mixins/SharesMixin.js'
import ShareDetails from '../mixins/ShareDetails.js'
-import { getLoggerBuilder } from '@nextcloud/logger'
+import logger from '../services/logger.ts'
export default {
name: 'SharingEntryLink',
@@ -313,10 +314,6 @@ export default {
ExternalLegacyLinkActions: OCA.Sharing.ExternalLinkActions.state,
ExternalShareActions: OCA.Sharing.ExternalShareActions.state,
- logger: getLoggerBuilder()
- .setApp('files_sharing')
- .detectUser()
- .build(),
// tracks whether modal should be opened or not
showQRCode: false,
@@ -330,6 +327,8 @@ export default {
* @return {string}
*/
title() {
+ const l10nOptions = { escape: false /* no escape as this string is already escaped by Vue */ }
+
// if we have a valid existing share (not pending)
if (this.share && this.share.id) {
if (!this.isShareOwner && this.share.ownerDisplayName) {
@@ -337,26 +336,26 @@ export default {
return t('files_sharing', '{shareWith} by {initiator}', {
shareWith: this.share.shareWith,
initiator: this.share.ownerDisplayName,
- })
+ }, l10nOptions)
}
return t('files_sharing', 'Shared via link by {initiator}', {
initiator: this.share.ownerDisplayName,
- })
+ }, l10nOptions)
}
if (this.share.label && this.share.label.trim() !== '') {
if (this.isEmailShareType) {
if (this.isFileRequest) {
return t('files_sharing', 'File request ({label})', {
label: this.share.label.trim(),
- })
+ }, l10nOptions)
}
return t('files_sharing', 'Mail share ({label})', {
label: this.share.label.trim(),
- })
+ }, l10nOptions)
}
return t('files_sharing', 'Share link ({label})', {
label: this.share.label.trim(),
- })
+ }, l10nOptions)
}
if (this.isEmailShareType) {
if (!this.share.shareWith || this.share.shareWith.trim() === '') {
@@ -391,6 +390,7 @@ export default {
}
return null
},
+
passwordExpirationTime() {
if (this.share.passwordExpirationTime === null) {
return null
@@ -613,7 +613,7 @@ export default {
* @param {boolean} shareReviewComplete if the share was reviewed
*/
async onNewLinkShare(shareReviewComplete = false) {
- this.logger.debug('onNewLinkShare called (with this.share)', this.share)
+ logger.debug('onNewLinkShare called (with this.share)', this.share)
// do not run again if already loading
if (this.loading) {
return
@@ -628,7 +628,7 @@ export default {
shareDefaults.expiration = this.formatDateToString(this.config.defaultExpirationDate)
}
- this.logger.debug('Missing required properties?', this.enforcedPropertiesMissing)
+ logger.debug('Missing required properties?', this.enforcedPropertiesMissing)
// Do not push yet if we need a password or an expiration date: show pending menu
// A share would require a review for example is default expiration date is set but not enforced, this allows
// the user to review the share and remove the expiration date if they don't want it
@@ -636,7 +636,7 @@ export default {
this.pending = true
this.shareCreationComplete = false
- this.logger.info('Share policy requires a review or has mandated properties (password, expirationDate)...')
+ logger.info('Share policy requires a review or has mandated properties (password, expirationDate)...')
// ELSE, show the pending popovermenu
// if password default or enforced, pre-fill with random one
@@ -664,13 +664,13 @@ export default {
// if the share is valid, create it on the server
if (this.checkShare(this.share)) {
try {
- this.logger.info('Sending existing share to server', this.share)
+ logger.info('Sending existing share to server', this.share)
await this.pushNewLinkShare(this.share, true)
this.shareCreationComplete = true
- this.logger.info('Share created on server', this.share)
+ logger.info('Share created on server', this.share)
} catch (e) {
this.pending = false
- this.logger.error('Error creating share', e)
+ logger.error('Error creating share', e)
return false
}
return true
diff --git a/apps/files_trashbin/l10n/uk.js b/apps/files_trashbin/l10n/uk.js
index c5c8319afb1..43f6a021a09 100644
--- a/apps/files_trashbin/l10n/uk.js
+++ b/apps/files_trashbin/l10n/uk.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"Original location" : "Звідки вилучено",
"Deleted by" : "Ким вилучено",
"Deleted" : "Вилучено",
+ "few seconds ago" : "кілька секунд тому",
"A long time ago" : "Давно",
"Unknown" : "Невідомо",
"All files" : "Усі файли",
diff --git a/apps/files_trashbin/l10n/uk.json b/apps/files_trashbin/l10n/uk.json
index 3c4160893a2..dcef4ac3b36 100644
--- a/apps/files_trashbin/l10n/uk.json
+++ b/apps/files_trashbin/l10n/uk.json
@@ -13,6 +13,7 @@
"Original location" : "Звідки вилучено",
"Deleted by" : "Ким вилучено",
"Deleted" : "Вилучено",
+ "few seconds ago" : "кілька секунд тому",
"A long time ago" : "Давно",
"Unknown" : "Невідомо",
"All files" : "Усі файли",
diff --git a/apps/provisioning_api/l10n/de.js b/apps/provisioning_api/l10n/de.js
index e407741f9d5..155d7f9c848 100644
--- a/apps/provisioning_api/l10n/de.js
+++ b/apps/provisioning_api/l10n/de.js
@@ -29,11 +29,11 @@ OC.L10N.register(
"Email address not available" : "E-Mail-Adresse nicht verfügbar",
"Sending email failed" : "Senden der E-Mail ist fehlgeschlagen",
"Email confirmation" : "E-Mail-Bestätigung",
- "To enable the email address %s please click the button below." : "Um die E-Mail-Adresse %s zu bestätigen, klicke bitte auf die untenstehende Schaltfläche.",
+ "To enable the email address %s please click the button below." : "Um die E-Mailadresse %s zu bestätigen, auf die untenstehende Schaltfläche klicken.",
"Confirm" : "Bestätigen",
"Email was already removed from account and cannot be confirmed anymore." : "Diese E-Mail-Adresse wurde bereits aus dem Konto entfernt und kann nicht mehr bestätigt werden.",
- "Could not verify mail because the token is expired." : "Die E-Mail konnte nicht verifiziert werden, da die Frist des Tokens abgelaufen ist.",
- "Could not verify mail because the token is invalid." : "Die E-Mail konnte nicht verifiziert werden, da der Token ungültig ist.",
+ "Could not verify mail because the token is expired." : "Die E-Mailadresse konnte nicht verifiziert werden, da das Token abgelaufen ist.",
+ "Could not verify mail because the token is invalid." : "Die E-Mailadresse konnte nicht verifiziert werden, da der Token ungültig ist.",
"An unexpected error occurred. Please contact your admin." : "Es ist ein unerwarteter Fehler aufgetreten, bitte kontaktiere deine Administration.",
"Email confirmation successful" : "Die E-Mail Bestätigung war erfolgreich.",
"Provisioning API" : "Bereitstellungs-API",
diff --git a/apps/provisioning_api/l10n/de.json b/apps/provisioning_api/l10n/de.json
index 36249979fa4..0fa532f48cd 100644
--- a/apps/provisioning_api/l10n/de.json
+++ b/apps/provisioning_api/l10n/de.json
@@ -27,11 +27,11 @@
"Email address not available" : "E-Mail-Adresse nicht verfügbar",
"Sending email failed" : "Senden der E-Mail ist fehlgeschlagen",
"Email confirmation" : "E-Mail-Bestätigung",
- "To enable the email address %s please click the button below." : "Um die E-Mail-Adresse %s zu bestätigen, klicke bitte auf die untenstehende Schaltfläche.",
+ "To enable the email address %s please click the button below." : "Um die E-Mailadresse %s zu bestätigen, auf die untenstehende Schaltfläche klicken.",
"Confirm" : "Bestätigen",
"Email was already removed from account and cannot be confirmed anymore." : "Diese E-Mail-Adresse wurde bereits aus dem Konto entfernt und kann nicht mehr bestätigt werden.",
- "Could not verify mail because the token is expired." : "Die E-Mail konnte nicht verifiziert werden, da die Frist des Tokens abgelaufen ist.",
- "Could not verify mail because the token is invalid." : "Die E-Mail konnte nicht verifiziert werden, da der Token ungültig ist.",
+ "Could not verify mail because the token is expired." : "Die E-Mailadresse konnte nicht verifiziert werden, da das Token abgelaufen ist.",
+ "Could not verify mail because the token is invalid." : "Die E-Mailadresse konnte nicht verifiziert werden, da der Token ungültig ist.",
"An unexpected error occurred. Please contact your admin." : "Es ist ein unerwarteter Fehler aufgetreten, bitte kontaktiere deine Administration.",
"Email confirmation successful" : "Die E-Mail Bestätigung war erfolgreich.",
"Provisioning API" : "Bereitstellungs-API",
diff --git a/apps/settings/l10n/et_EE.js b/apps/settings/l10n/et_EE.js
index e7fe29f42dd..82324a67341 100644
--- a/apps/settings/l10n/et_EE.js
+++ b/apps/settings/l10n/et_EE.js
@@ -33,8 +33,8 @@ OC.L10N.register(
"Your <strong>group memberships</strong> were modified" : "Sinu <strong>grupide liikmelisus</strong> on muutunud",
"{actor} changed your password" : "{actor} muutis sinu salasõna",
"You changed your password" : "Sa muutsid oma salasõna",
- "Your password was reset by an administrator" : "Administraator lähtestas sinu parooli",
- "Your password was reset" : "Sinu parool lähtestati",
+ "Your password was reset by an administrator" : "Peakasutaja lähtestas sinu salasõna",
+ "Your password was reset" : "Sinu salasõna on lähtestatud",
"{actor} changed your email address" : "{actor} muutis sinu e-posti aadressi",
"You changed your email address" : "Sa muutsid oma e-posti aadressi",
"Your email address was changed by an administrator" : "Administraator muutis sinu e-posti aadressi",
@@ -49,7 +49,7 @@ OC.L10N.register(
"A login attempt using two-factor authentication failed (%1$s)" : "Sisselogimiskatse kaheastmelise autentimisega ebaõnnestus (%1$s)",
"Remote wipe was started on %1$s" : "Kaugkustutamine algas: %1$s",
"Remote wipe has finished on %1$s" : "Kaugkustutamine lõppes: %1$s",
- "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sinu <strong>parooli</strong> või <strong>e-posti aadressi</strong> muudeti",
+ "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sinu <strong>salasõna</strong> või <strong>e-posti aadress</strong> on muudetud",
"Settings" : "Seaded",
"Could not remove app." : "Rakenduse eemaldamine ei õnnestunud.",
"Could not update app." : "Rakenduse uuendamine ei õnnestunud.",
@@ -65,7 +65,7 @@ OC.L10N.register(
"Administrator documentation" : "Administraatori dokumentatsioon",
"User documentation" : "Kasutaja dokumentatsioon",
"Nextcloud help overview" : "Nextcloudi abiteabe ülevaade",
- "Invalid SMTP password." : "Vale SMTP parool.",
+ "Invalid SMTP password." : "Vale SMTP salasõna.",
"Email setting test" : "E-posti sätete kontroll",
"Well done, %s!" : "Hästi tehtud, %s!",
"If you received this email, the email configuration seems to be correct." : "Kui said selle kirja, näib e-posti seadistus õige.",
@@ -83,12 +83,13 @@ OC.L10N.register(
"Unable to set invalid website" : "Vigase veebisaidi lisamine pole võimalik",
"Some account data was invalid" : "Osa kasutajakonto andmeid olid vigased",
"In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "Selleks, et tuvastada, et tegemist tõesti on sinu X-i / Twitteri kasutajakontoga, palun postita oma kontole järgnev säuts (palun kontrolli, et sinna ei satuks reavahetusi):",
- "%1$s changed your password on %2$s." : "%1$s muutis su parooli %2$s.",
- "Your password on %s was changed." : "Sinu %s parool muudeti.",
- "Your password on %s was reset by an administrator." : "Administraator lähtestas sinu %s parooli.",
+ "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Sinu veebisaidi õigsuse kontrolliks palun salvesta järgnev sisu oma saiti asukohta „.well-known/CloudIdVerificationCode.txt“ (ning kontrolli, et järgnev tekst on seal failis ühel real):",
+ "%1$s changed your password on %2$s." : "%1$s muutis sinu salasõna teenuses %2$s.",
+ "Your password on %s was changed." : "Sinu %s salasõna on muudetud.",
+ "Your password on %s was reset by an administrator." : "Peakasutaja lähtestas sinu %s salasõna.",
"Your password on %s was reset." : "Sinu salasõna „%s“ sai lähtestatud.",
- "Password for %1$s changed on %2$s" : "%1$s parool muudetud %2$s",
- "Password changed for %s" : "%s parool muudetud",
+ "Password for %1$s changed on %2$s" : "%1$s salasõna teenuses %2$s on muutunud",
+ "Password changed for %s" : "%s salasõna on muudetud",
"If you did not request this, please contact an administrator." : "Kui sa pole seda taotlenud, võta ühendust administraatoriga.",
"Your email address on %s was changed." : "Sinu %s e-posti aadressi muudeti.",
"Your email address on %s was changed by an administrator." : "Administraator muutis sinu %s e-posti aadressi.",
@@ -100,7 +101,7 @@ OC.L10N.register(
"Welcome aboard %s" : "Tere tulemast %s",
"Welcome to your %s account, you can add, protect, and share your data." : "Tere tulemast oma %s kontole. Sa saad lisada, kaitsta ja jagada oma andmeid.",
"Your Login is: %s" : "Sinu kasutajanimi on: %s",
- "Set your password" : "Määra oma parool",
+ "Set your password" : "Sisesta oma salasõna",
"Go to %s" : "Mine %s",
"Install Client" : "Paigalda kliendiprogramm",
"Logged in account must be a sub admin" : "Sisselogitud kasutajakonto peab olema peakasutajate alamgrupi liige",
@@ -121,17 +122,22 @@ OC.L10N.register(
"Mobile & desktop" : "Mobiil ja töölaud",
"Email server" : "E-kirjade server",
"Mail Providers" : "E-posti teenusepakkujad",
- "User's email account" : "Kasutaja e-postikonto",
- "System email account" : "Süsteemi e-posti konto",
+ "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Lisaks järgnevale üldisele valikule on võimalik ka isikliku e-postiikonto kasutamine. Hetkel toimib see võimalus vaid Nextcloudi kalendrikutsete puhul ning eelduseks on Nextcloud Mail 4.1 või suurem ning seal seadistatud e-postikonto vastab kasutaja e-postiaadressile Nextcloudi profiilis.",
+ "Send emails using" : "E-kirjade saatmisel on kasutusel",
+ "User's email account" : "Kasutaja seadistatud e-postikonto",
+ "System email account" : "Süsteemis seadistatud e-postikonto",
"Security & setup checks" : "Turva- ja paigalduse kontrollid",
"Background jobs" : "Taustal toimivad haldustoimingud",
"Unlimited" : "Piiramatult",
"Verifying" : "Kontrollin",
- "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside filtreerimine",
- "Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside filtreerimine pole kasutusel.",
+ "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside vahemikus",
+ "Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside vahemikud pole seadistatud.",
"Configuration key \"%1$s\" expects an array (%2$s found). Admin IP range validation will not be applied." : "Seadistuste võtmes „%1$s“ peab olema kirjas massiiv ( aga leidsime „%2$s“). Süsteemihalduseks lubatud IP-aadresside filtreerimine hetkel ei toimi.",
"Configuration key \"%1$s\" contains invalid IP range(s): \"%2$s\"" : "Seadistuste võtmes „%1$s“ on vigane IP-aadressi(de) vahemik: „%2$s“",
"Admin IP filtering is correctly configured." : "Süsteemihalduseks lubatud IP-aadresside filtreerimine on korrektselt seadistatud.",
+ "App directories owner" : "Rakenduste kausta omanik",
+ "Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Mõnede rakenduste kaustade omanik erinev kogu Nextcloudi serveri omanikust. Nii võib juhtuda, kui rakendused on paigaldatud käsitsi. Palun kontrolli järgnevate rakenduste kaustade omanikke:\n%s",
+ "App directories have the correct owner \"%s\"" : "Rakenduste kaustadel on korrektne omanik: „%s“",
"Your remote address could not be determined." : "Sinu kaugaadressi tuvastamine ei õnnestunud.",
"No altered files" : "Muudetud faile pole",
"Database missing primary keys" : "Andmebaasis on puudu primaarvõtmed",
@@ -141,6 +147,7 @@ OC.L10N.register(
"Mail delivery is disabled by instance config \"%s\"." : "Selles serveris piirab e-kirjade edasisaatmist seadistus „%s“.",
"Email test was successfully sent" : "Testkirja saatmine õnnestus",
"Your \"trusted_proxies\" setting is not correctly set, it should be an array." : "Serveri „trusted_proxies“ seadistus pole korrektne - seal peab leiduma massiiv, aga hetkel on midagi muud.",
+ "This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Sellel serveril puudub toimiv internetiühendus: mitmete otspunktidega ei ole leitavad. See tähendab, et mõned funktsionaalsused, nagu näiteks väliste andmehoidlate ühendamine, uuenduste teavitused või kolmandate osapoolte rakenduste paigaldamine ei tööta. Ligipääs failidele eemalt ning teavistuste saatmine e-kirjaga ei pruugi samuti toimida. Kui soovid kasutada täielikku funktsionaalsust, siis palun taga toimiv internetiühendus.",
"Old server-side-encryption" : "Vana serveripoolne krüptimine",
"Disabled" : "Keelatud",
"The old server-side-encryption format is enabled. We recommend disabling this." : "Vana serveripoolse krüptimise vorming on kasutusel. Mes soovitame, et lülitad selle välja.",
@@ -208,8 +215,8 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "Luba kasutajatel jagada kasutajatega ainult oma grupi piires",
"Allow users to share via link and emails" : "Luba kasutajatel lingiga ja e-postiga jagamist",
"Allow public uploads" : "Luba avalikud üleslaadimised",
- "Always ask for a password" : "Alati küsi parooli",
- "Enforce password protection" : "Jõusta paroolikaitse",
+ "Always ask for a password" : "Alati küsi salasõna",
+ "Enforce password protection" : "Jõusta salasõnakaitse",
"Exclude groups from password requirements" : "Välista grupid salasõnareeglitest",
"Exclude groups from creating link shares" : "Välista grupid jagamislinkide loomisest",
"Limit sharing based on groups" : "Piira jagamist gruppide alusel",
@@ -217,9 +224,11 @@ OC.L10N.register(
"Exclude some groups from sharing" : "Välista mõned grupid jagamisest",
"Limit sharing to some groups" : "Piira jagamist mõnede gruppidega",
"Groups excluded from sharing" : "Jagamisest välistatud grupid",
+ "Set default expiration date for internal shares" : "Jagamisel selle serveri piires kasuta vaikimisi aegumist",
"Enforce expiration date" : "Sunnitud aegumise kuupäev",
"Default expiration time of new shares in days" : "Uue jaosmeedia vaikimisi aegumine päevades",
"Expire shares after x days" : "Jaosmeedia aegub x päeva möödudes",
+ "Set default expiration date for shares to other servers" : "Jagamisel teistesse serveritesse kasuta vaikimisi aegumist",
"Enforce expiration date for remote shares" : "Määra lingi kaugserverid asuva jaosmeedia vaikimisi aegumiskuupäev ",
"Default expiration time of remote shares in days" : "Kaugserveris asuva jaosmeedia vaikimisi aegumine päevades",
"Expire remote shares after x days" : "Jaosmeedia aegub x päeva möödudes",
@@ -229,6 +238,7 @@ OC.L10N.register(
"Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Kuva avaliku lingiga üleslaadimise lehel lahtiütluste tekst (vaid siis, kui failide loend on peidetud)",
"Disclaimer text" : "Vastutusest lahtiütluse tekst",
"This text will be shown on the public link upload page when the file list is hidden." : "Seda teksti näidatakse avaliku lingiga üleslaadimise lehel kui failide loend on peidetud.",
+ "Default share permissions" : "Vaikimisi õigusel jagamisel",
"Two-Factor Authentication" : "Kaheastmeline autentimine",
"Two-factor authentication can be enforced for all accounts and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "Kaheastmelist autentimist on võimalik teha kohustuslikuks kas kõikidele kasutajakontodele või konkreetsete gruppide kaupa. Kui kaheastmelise autentimise kohustuslikkus on määratud, kuid on kasutajal seadistamata, siis ta ei saa siia serverisse sisse logida.",
"Enforce two-factor authentication" : "Tee kaheastmeline autentimine kohustuslikuks",
@@ -349,7 +359,7 @@ OC.L10N.register(
"Web, desktop and mobile clients currently logged in to your account." : "Sinu kontole hetkel sisse loginud veebi-, töölaua-, ja mobiilsed kliendid.",
"Error while creating device token" : "Tõrge seadme märke loomisel",
"App name" : "Rakenduse nimi",
- "Create new app password" : "Loo uus rakenduse parool",
+ "Create new app password" : "Loo uus rakenduse salasõna",
"App password copied!" : "Rakenduse salasõna on kopeeritud!",
"Copy app password" : "Kopeeri rakenduse salasõna",
"Login name copied!" : "Kasutajanimi on koeeritud!",
@@ -529,6 +539,7 @@ OC.L10N.register(
"Set account as admin for" : "Määra kasutajakonto peakasutajaks siin:",
"Select account quota" : "Määra kasutajakonto kvoot",
"Set the language" : "Vali keel",
+ "Toggle account actions menu" : "Lülita kasutajakonto tegevuste menüü sisse/välja",
"Done" : "Valmis",
"Edit" : "Muuda",
"Account management settings" : "Kasutajakontode halduse seadistused",
@@ -560,8 +571,13 @@ OC.L10N.register(
"No devices configured." : "Ühtegi seadet pole seadistatud.",
"The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:",
"Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.",
- "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saate jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.",
+ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saad jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.",
"You need to enable the File sharing App." : "Sa pead kasutusele võtma Failijagamise rakenduse.",
+ "App Store" : "Rakendustepood",
+ "Loading app list" : "Laadin rakenduste loendit",
+ "Loading categories" : "Laadin kategooriaid",
+ "Developer documentation ↗" : "Dokumentatsioon arendajatele ↗",
+ "Version {version}, {license}-licensed" : "Versioon {version}, avaldatud {license} litsentsi alusel",
"Version {version}" : "Versioon {version}",
"All accounts" : "Kõik kasutajakontod",
"Admins" : "Haldurid",
diff --git a/apps/settings/l10n/et_EE.json b/apps/settings/l10n/et_EE.json
index a27534910f2..d23ba11a232 100644
--- a/apps/settings/l10n/et_EE.json
+++ b/apps/settings/l10n/et_EE.json
@@ -31,8 +31,8 @@
"Your <strong>group memberships</strong> were modified" : "Sinu <strong>grupide liikmelisus</strong> on muutunud",
"{actor} changed your password" : "{actor} muutis sinu salasõna",
"You changed your password" : "Sa muutsid oma salasõna",
- "Your password was reset by an administrator" : "Administraator lähtestas sinu parooli",
- "Your password was reset" : "Sinu parool lähtestati",
+ "Your password was reset by an administrator" : "Peakasutaja lähtestas sinu salasõna",
+ "Your password was reset" : "Sinu salasõna on lähtestatud",
"{actor} changed your email address" : "{actor} muutis sinu e-posti aadressi",
"You changed your email address" : "Sa muutsid oma e-posti aadressi",
"Your email address was changed by an administrator" : "Administraator muutis sinu e-posti aadressi",
@@ -47,7 +47,7 @@
"A login attempt using two-factor authentication failed (%1$s)" : "Sisselogimiskatse kaheastmelise autentimisega ebaõnnestus (%1$s)",
"Remote wipe was started on %1$s" : "Kaugkustutamine algas: %1$s",
"Remote wipe has finished on %1$s" : "Kaugkustutamine lõppes: %1$s",
- "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sinu <strong>parooli</strong> või <strong>e-posti aadressi</strong> muudeti",
+ "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sinu <strong>salasõna</strong> või <strong>e-posti aadress</strong> on muudetud",
"Settings" : "Seaded",
"Could not remove app." : "Rakenduse eemaldamine ei õnnestunud.",
"Could not update app." : "Rakenduse uuendamine ei õnnestunud.",
@@ -63,7 +63,7 @@
"Administrator documentation" : "Administraatori dokumentatsioon",
"User documentation" : "Kasutaja dokumentatsioon",
"Nextcloud help overview" : "Nextcloudi abiteabe ülevaade",
- "Invalid SMTP password." : "Vale SMTP parool.",
+ "Invalid SMTP password." : "Vale SMTP salasõna.",
"Email setting test" : "E-posti sätete kontroll",
"Well done, %s!" : "Hästi tehtud, %s!",
"If you received this email, the email configuration seems to be correct." : "Kui said selle kirja, näib e-posti seadistus õige.",
@@ -81,12 +81,13 @@
"Unable to set invalid website" : "Vigase veebisaidi lisamine pole võimalik",
"Some account data was invalid" : "Osa kasutajakonto andmeid olid vigased",
"In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "Selleks, et tuvastada, et tegemist tõesti on sinu X-i / Twitteri kasutajakontoga, palun postita oma kontole järgnev säuts (palun kontrolli, et sinna ei satuks reavahetusi):",
- "%1$s changed your password on %2$s." : "%1$s muutis su parooli %2$s.",
- "Your password on %s was changed." : "Sinu %s parool muudeti.",
- "Your password on %s was reset by an administrator." : "Administraator lähtestas sinu %s parooli.",
+ "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Sinu veebisaidi õigsuse kontrolliks palun salvesta järgnev sisu oma saiti asukohta „.well-known/CloudIdVerificationCode.txt“ (ning kontrolli, et järgnev tekst on seal failis ühel real):",
+ "%1$s changed your password on %2$s." : "%1$s muutis sinu salasõna teenuses %2$s.",
+ "Your password on %s was changed." : "Sinu %s salasõna on muudetud.",
+ "Your password on %s was reset by an administrator." : "Peakasutaja lähtestas sinu %s salasõna.",
"Your password on %s was reset." : "Sinu salasõna „%s“ sai lähtestatud.",
- "Password for %1$s changed on %2$s" : "%1$s parool muudetud %2$s",
- "Password changed for %s" : "%s parool muudetud",
+ "Password for %1$s changed on %2$s" : "%1$s salasõna teenuses %2$s on muutunud",
+ "Password changed for %s" : "%s salasõna on muudetud",
"If you did not request this, please contact an administrator." : "Kui sa pole seda taotlenud, võta ühendust administraatoriga.",
"Your email address on %s was changed." : "Sinu %s e-posti aadressi muudeti.",
"Your email address on %s was changed by an administrator." : "Administraator muutis sinu %s e-posti aadressi.",
@@ -98,7 +99,7 @@
"Welcome aboard %s" : "Tere tulemast %s",
"Welcome to your %s account, you can add, protect, and share your data." : "Tere tulemast oma %s kontole. Sa saad lisada, kaitsta ja jagada oma andmeid.",
"Your Login is: %s" : "Sinu kasutajanimi on: %s",
- "Set your password" : "Määra oma parool",
+ "Set your password" : "Sisesta oma salasõna",
"Go to %s" : "Mine %s",
"Install Client" : "Paigalda kliendiprogramm",
"Logged in account must be a sub admin" : "Sisselogitud kasutajakonto peab olema peakasutajate alamgrupi liige",
@@ -119,17 +120,22 @@
"Mobile & desktop" : "Mobiil ja töölaud",
"Email server" : "E-kirjade server",
"Mail Providers" : "E-posti teenusepakkujad",
- "User's email account" : "Kasutaja e-postikonto",
- "System email account" : "Süsteemi e-posti konto",
+ "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Lisaks järgnevale üldisele valikule on võimalik ka isikliku e-postiikonto kasutamine. Hetkel toimib see võimalus vaid Nextcloudi kalendrikutsete puhul ning eelduseks on Nextcloud Mail 4.1 või suurem ning seal seadistatud e-postikonto vastab kasutaja e-postiaadressile Nextcloudi profiilis.",
+ "Send emails using" : "E-kirjade saatmisel on kasutusel",
+ "User's email account" : "Kasutaja seadistatud e-postikonto",
+ "System email account" : "Süsteemis seadistatud e-postikonto",
"Security & setup checks" : "Turva- ja paigalduse kontrollid",
"Background jobs" : "Taustal toimivad haldustoimingud",
"Unlimited" : "Piiramatult",
"Verifying" : "Kontrollin",
- "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside filtreerimine",
- "Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside filtreerimine pole kasutusel.",
+ "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside vahemikus",
+ "Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside vahemikud pole seadistatud.",
"Configuration key \"%1$s\" expects an array (%2$s found). Admin IP range validation will not be applied." : "Seadistuste võtmes „%1$s“ peab olema kirjas massiiv ( aga leidsime „%2$s“). Süsteemihalduseks lubatud IP-aadresside filtreerimine hetkel ei toimi.",
"Configuration key \"%1$s\" contains invalid IP range(s): \"%2$s\"" : "Seadistuste võtmes „%1$s“ on vigane IP-aadressi(de) vahemik: „%2$s“",
"Admin IP filtering is correctly configured." : "Süsteemihalduseks lubatud IP-aadresside filtreerimine on korrektselt seadistatud.",
+ "App directories owner" : "Rakenduste kausta omanik",
+ "Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Mõnede rakenduste kaustade omanik erinev kogu Nextcloudi serveri omanikust. Nii võib juhtuda, kui rakendused on paigaldatud käsitsi. Palun kontrolli järgnevate rakenduste kaustade omanikke:\n%s",
+ "App directories have the correct owner \"%s\"" : "Rakenduste kaustadel on korrektne omanik: „%s“",
"Your remote address could not be determined." : "Sinu kaugaadressi tuvastamine ei õnnestunud.",
"No altered files" : "Muudetud faile pole",
"Database missing primary keys" : "Andmebaasis on puudu primaarvõtmed",
@@ -139,6 +145,7 @@
"Mail delivery is disabled by instance config \"%s\"." : "Selles serveris piirab e-kirjade edasisaatmist seadistus „%s“.",
"Email test was successfully sent" : "Testkirja saatmine õnnestus",
"Your \"trusted_proxies\" setting is not correctly set, it should be an array." : "Serveri „trusted_proxies“ seadistus pole korrektne - seal peab leiduma massiiv, aga hetkel on midagi muud.",
+ "This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Sellel serveril puudub toimiv internetiühendus: mitmete otspunktidega ei ole leitavad. See tähendab, et mõned funktsionaalsused, nagu näiteks väliste andmehoidlate ühendamine, uuenduste teavitused või kolmandate osapoolte rakenduste paigaldamine ei tööta. Ligipääs failidele eemalt ning teavistuste saatmine e-kirjaga ei pruugi samuti toimida. Kui soovid kasutada täielikku funktsionaalsust, siis palun taga toimiv internetiühendus.",
"Old server-side-encryption" : "Vana serveripoolne krüptimine",
"Disabled" : "Keelatud",
"The old server-side-encryption format is enabled. We recommend disabling this." : "Vana serveripoolse krüptimise vorming on kasutusel. Mes soovitame, et lülitad selle välja.",
@@ -206,8 +213,8 @@
"Restrict users to only share with users in their groups" : "Luba kasutajatel jagada kasutajatega ainult oma grupi piires",
"Allow users to share via link and emails" : "Luba kasutajatel lingiga ja e-postiga jagamist",
"Allow public uploads" : "Luba avalikud üleslaadimised",
- "Always ask for a password" : "Alati küsi parooli",
- "Enforce password protection" : "Jõusta paroolikaitse",
+ "Always ask for a password" : "Alati küsi salasõna",
+ "Enforce password protection" : "Jõusta salasõnakaitse",
"Exclude groups from password requirements" : "Välista grupid salasõnareeglitest",
"Exclude groups from creating link shares" : "Välista grupid jagamislinkide loomisest",
"Limit sharing based on groups" : "Piira jagamist gruppide alusel",
@@ -215,9 +222,11 @@
"Exclude some groups from sharing" : "Välista mõned grupid jagamisest",
"Limit sharing to some groups" : "Piira jagamist mõnede gruppidega",
"Groups excluded from sharing" : "Jagamisest välistatud grupid",
+ "Set default expiration date for internal shares" : "Jagamisel selle serveri piires kasuta vaikimisi aegumist",
"Enforce expiration date" : "Sunnitud aegumise kuupäev",
"Default expiration time of new shares in days" : "Uue jaosmeedia vaikimisi aegumine päevades",
"Expire shares after x days" : "Jaosmeedia aegub x päeva möödudes",
+ "Set default expiration date for shares to other servers" : "Jagamisel teistesse serveritesse kasuta vaikimisi aegumist",
"Enforce expiration date for remote shares" : "Määra lingi kaugserverid asuva jaosmeedia vaikimisi aegumiskuupäev ",
"Default expiration time of remote shares in days" : "Kaugserveris asuva jaosmeedia vaikimisi aegumine päevades",
"Expire remote shares after x days" : "Jaosmeedia aegub x päeva möödudes",
@@ -227,6 +236,7 @@
"Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Kuva avaliku lingiga üleslaadimise lehel lahtiütluste tekst (vaid siis, kui failide loend on peidetud)",
"Disclaimer text" : "Vastutusest lahtiütluse tekst",
"This text will be shown on the public link upload page when the file list is hidden." : "Seda teksti näidatakse avaliku lingiga üleslaadimise lehel kui failide loend on peidetud.",
+ "Default share permissions" : "Vaikimisi õigusel jagamisel",
"Two-Factor Authentication" : "Kaheastmeline autentimine",
"Two-factor authentication can be enforced for all accounts and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "Kaheastmelist autentimist on võimalik teha kohustuslikuks kas kõikidele kasutajakontodele või konkreetsete gruppide kaupa. Kui kaheastmelise autentimise kohustuslikkus on määratud, kuid on kasutajal seadistamata, siis ta ei saa siia serverisse sisse logida.",
"Enforce two-factor authentication" : "Tee kaheastmeline autentimine kohustuslikuks",
@@ -347,7 +357,7 @@
"Web, desktop and mobile clients currently logged in to your account." : "Sinu kontole hetkel sisse loginud veebi-, töölaua-, ja mobiilsed kliendid.",
"Error while creating device token" : "Tõrge seadme märke loomisel",
"App name" : "Rakenduse nimi",
- "Create new app password" : "Loo uus rakenduse parool",
+ "Create new app password" : "Loo uus rakenduse salasõna",
"App password copied!" : "Rakenduse salasõna on kopeeritud!",
"Copy app password" : "Kopeeri rakenduse salasõna",
"Login name copied!" : "Kasutajanimi on koeeritud!",
@@ -527,6 +537,7 @@
"Set account as admin for" : "Määra kasutajakonto peakasutajaks siin:",
"Select account quota" : "Määra kasutajakonto kvoot",
"Set the language" : "Vali keel",
+ "Toggle account actions menu" : "Lülita kasutajakonto tegevuste menüü sisse/välja",
"Done" : "Valmis",
"Edit" : "Muuda",
"Account management settings" : "Kasutajakontode halduse seadistused",
@@ -558,8 +569,13 @@
"No devices configured." : "Ühtegi seadet pole seadistatud.",
"The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:",
"Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.",
- "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saate jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.",
+ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saad jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.",
"You need to enable the File sharing App." : "Sa pead kasutusele võtma Failijagamise rakenduse.",
+ "App Store" : "Rakendustepood",
+ "Loading app list" : "Laadin rakenduste loendit",
+ "Loading categories" : "Laadin kategooriaid",
+ "Developer documentation ↗" : "Dokumentatsioon arendajatele ↗",
+ "Version {version}, {license}-licensed" : "Versioon {version}, avaldatud {license} litsentsi alusel",
"Version {version}" : "Versioon {version}",
"All accounts" : "Kõik kasutajakontod",
"Admins" : "Haldurid",
diff --git a/apps/settings/l10n/lv.js b/apps/settings/l10n/lv.js
index f22d5e9ac96..0516783f8b2 100644
--- a/apps/settings/l10n/lv.js
+++ b/apps/settings/l10n/lv.js
@@ -122,7 +122,7 @@ OC.L10N.register(
"Create new app password" : "Izveidot jaunu lietotnes paroli",
"New app password" : "Jauna lietotnes parole",
"Use the credentials below to configure your app or device. For security reasons this password will only be shown once." : "Zemāk esošie piekļuves dati jāizmanto, lai konfigurētu lietotni vai ierīci. Drošības iemeslu dēļ šī parole tiks parādīta tikai vienu reizi.",
- "Login" : "Pieteikumvārds",
+ "Login" : "Pieteikties",
"Password" : "Parole",
"Show QR code for mobile apps" : "Parādīt kvadrātkodu tālruņa lietotnēm",
"Profile" : "Profils",
diff --git a/apps/settings/l10n/lv.json b/apps/settings/l10n/lv.json
index 5c87992b05b..11de016ba60 100644
--- a/apps/settings/l10n/lv.json
+++ b/apps/settings/l10n/lv.json
@@ -120,7 +120,7 @@
"Create new app password" : "Izveidot jaunu lietotnes paroli",
"New app password" : "Jauna lietotnes parole",
"Use the credentials below to configure your app or device. For security reasons this password will only be shown once." : "Zemāk esošie piekļuves dati jāizmanto, lai konfigurētu lietotni vai ierīci. Drošības iemeslu dēļ šī parole tiks parādīta tikai vienu reizi.",
- "Login" : "Pieteikumvārds",
+ "Login" : "Pieteikties",
"Password" : "Parole",
"Show QR code for mobile apps" : "Parādīt kvadrātkodu tālruņa lietotnēm",
"Profile" : "Profils",
diff --git a/apps/sharebymail/l10n/et_EE.js b/apps/sharebymail/l10n/et_EE.js
index 47f81d56824..c47755cfca4 100644
--- a/apps/sharebymail/l10n/et_EE.js
+++ b/apps/sharebymail/l10n/et_EE.js
@@ -3,6 +3,8 @@ OC.L10N.register(
{
"Shared with {email}" : "Jagatud aadressile {email}",
"Shared with {email} by {actor}" : "Jagatud aadressile {email} {actor} poolt",
+ "Unshared from {email}" : "Jagamine {email} aadressile on lõpetatud",
+ "Unshared from {email} by {actor}" : "{actor} lõpetas jagamise {email} aadressile",
"Password for mail share sent to {email}" : "E-kirjaga jagamise salasõna on saadetud aadressile {email}",
"Password for mail share sent to you" : "Sulle saadetud e-kirjaga jagamise salasõna",
"Password to access {file} was sent to {email}" : "Salasõna ligipääsuks „{file}“ failile saadeti aadressile {email}",
@@ -10,6 +12,7 @@ OC.L10N.register(
"Share by mail" : "Jaga e-postiga",
"Sharing %1$s failed, because this item is already shared with the account %2$s" : "%1$s jagamine ebaõnnestus, kuna seda üksust on juba jagatud kontoga %2$s",
"We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Me ei saa sulle automaatselt loodud salasõna saata. Palun määra oma isiklikes seadistustes korrektne e-posti aadress ja proovi uuesti.",
+ "Failed to send share by email. Got an invalid email address" : "Jaosmeedia saatmine e-postiga ei õnnestunud. Ilmselt oli e-posti aadress vale.",
"Failed to send share by email" : "Jaosmeediat polnud võimalik e-kirjaga saata",
"%1$s shared %2$s with you" : "%1$s jagas sinuga: %2$s",
"Note:" : "Märkus:",
@@ -31,7 +34,8 @@ OC.L10N.register(
"You can choose a different password at any time in the share dialog." : "Salasõna saad alati jagamisvaatest muuta.",
"Could not find share" : "Jagamist ei leitud.",
"Share provider which allows you to share files by mail" : "Jagamisteenuse pakkuja, mis võimaldab sul meediat jagada e-posti vahendusel",
- "Send password by mail" : "Saada parool e-postiga",
+ "Unable to update share by mail config" : "E-postiga jagamise seadistuste uuendamine ei õnnestu.",
+ "Send password by mail" : "Saada salasõna e-postiga",
"Reply to initiator" : "Vasta algatajale"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/sharebymail/l10n/et_EE.json b/apps/sharebymail/l10n/et_EE.json
index ce01d8465ad..ad4029da1e0 100644
--- a/apps/sharebymail/l10n/et_EE.json
+++ b/apps/sharebymail/l10n/et_EE.json
@@ -1,6 +1,8 @@
{ "translations": {
"Shared with {email}" : "Jagatud aadressile {email}",
"Shared with {email} by {actor}" : "Jagatud aadressile {email} {actor} poolt",
+ "Unshared from {email}" : "Jagamine {email} aadressile on lõpetatud",
+ "Unshared from {email} by {actor}" : "{actor} lõpetas jagamise {email} aadressile",
"Password for mail share sent to {email}" : "E-kirjaga jagamise salasõna on saadetud aadressile {email}",
"Password for mail share sent to you" : "Sulle saadetud e-kirjaga jagamise salasõna",
"Password to access {file} was sent to {email}" : "Salasõna ligipääsuks „{file}“ failile saadeti aadressile {email}",
@@ -8,6 +10,7 @@
"Share by mail" : "Jaga e-postiga",
"Sharing %1$s failed, because this item is already shared with the account %2$s" : "%1$s jagamine ebaõnnestus, kuna seda üksust on juba jagatud kontoga %2$s",
"We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Me ei saa sulle automaatselt loodud salasõna saata. Palun määra oma isiklikes seadistustes korrektne e-posti aadress ja proovi uuesti.",
+ "Failed to send share by email. Got an invalid email address" : "Jaosmeedia saatmine e-postiga ei õnnestunud. Ilmselt oli e-posti aadress vale.",
"Failed to send share by email" : "Jaosmeediat polnud võimalik e-kirjaga saata",
"%1$s shared %2$s with you" : "%1$s jagas sinuga: %2$s",
"Note:" : "Märkus:",
@@ -29,7 +32,8 @@
"You can choose a different password at any time in the share dialog." : "Salasõna saad alati jagamisvaatest muuta.",
"Could not find share" : "Jagamist ei leitud.",
"Share provider which allows you to share files by mail" : "Jagamisteenuse pakkuja, mis võimaldab sul meediat jagada e-posti vahendusel",
- "Send password by mail" : "Saada parool e-postiga",
+ "Unable to update share by mail config" : "E-postiga jagamise seadistuste uuendamine ei õnnestu.",
+ "Send password by mail" : "Saada salasõna e-postiga",
"Reply to initiator" : "Vasta algatajale"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/user_ldap/ajax/deleteConfiguration.php b/apps/user_ldap/ajax/deleteConfiguration.php
index f09295355ac..68bce69f982 100644
--- a/apps/user_ldap/ajax/deleteConfiguration.php
+++ b/apps/user_ldap/ajax/deleteConfiguration.php
@@ -1,8 +1,6 @@
<?php
use OCA\User_LDAP\Helper;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Server;
use OCP\Util;
@@ -17,7 +15,7 @@ use OCP\Util;
\OC_JSON::callCheck();
$prefix = (string)$_POST['ldap_serverconfig_chooser'];
-$helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+$helper = Server::get(Helper::class);
if ($helper->deleteServerConfiguration($prefix)) {
\OC_JSON::success();
} else {
diff --git a/apps/user_ldap/ajax/getNewServerConfigPrefix.php b/apps/user_ldap/ajax/getNewServerConfigPrefix.php
index e8746a7c1b1..e5ba6375c73 100644
--- a/apps/user_ldap/ajax/getNewServerConfigPrefix.php
+++ b/apps/user_ldap/ajax/getNewServerConfigPrefix.php
@@ -2,8 +2,6 @@
use OCA\User_LDAP\Configuration;
use OCA\User_LDAP\Helper;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Server;
/**
@@ -16,7 +14,7 @@ use OCP\Server;
\OC_JSON::checkAppEnabled('user_ldap');
\OC_JSON::callCheck();
-$helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+$helper = Server::get(Helper::class);
$serverConnections = $helper->getServerConfigurationPrefixes();
sort($serverConnections);
$lk = array_pop($serverConnections);
diff --git a/apps/user_ldap/lib/Command/Search.php b/apps/user_ldap/lib/Command/Search.php
index ad13c94c84a..85906b20e9a 100644
--- a/apps/user_ldap/lib/Command/Search.php
+++ b/apps/user_ldap/lib/Command/Search.php
@@ -12,7 +12,6 @@ use OCA\User_LDAP\Helper;
use OCA\User_LDAP\LDAP;
use OCA\User_LDAP\User_Proxy;
use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Server;
use Symfony\Component\Console\Command\Command;
@@ -83,7 +82,7 @@ class Search extends Command {
}
protected function execute(InputInterface $input, OutputInterface $output): int {
- $helper = new Helper($this->ocConfig, Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$configPrefixes = $helper->getServerConfigurationPrefixes(true);
$ldapWrapper = new LDAP();
diff --git a/apps/user_ldap/lib/Command/SetConfig.php b/apps/user_ldap/lib/Command/SetConfig.php
index 5a0b65a2c3e..7e9efcf34d0 100644
--- a/apps/user_ldap/lib/Command/SetConfig.php
+++ b/apps/user_ldap/lib/Command/SetConfig.php
@@ -11,8 +11,6 @@ use OCA\User_LDAP\Configuration;
use OCA\User_LDAP\ConnectionFactory;
use OCA\User_LDAP\Helper;
use OCA\User_LDAP\LDAP;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Server;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
@@ -43,7 +41,7 @@ class SetConfig extends Command {
}
protected function execute(InputInterface $input, OutputInterface $output): int {
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$availableConfigs = $helper->getServerConfigurationPrefixes();
$configID = $input->getArgument('configID');
if (!in_array($configID, $availableConfigs)) {
diff --git a/apps/user_ldap/lib/Connection.php b/apps/user_ldap/lib/Connection.php
index 78a5f93d29e..b25a2e72b2b 100644
--- a/apps/user_ldap/lib/Connection.php
+++ b/apps/user_ldap/lib/Connection.php
@@ -11,8 +11,6 @@ use OC\ServerNotAvailableException;
use OCA\User_LDAP\Exceptions\ConfigurationIssueException;
use OCP\ICache;
use OCP\ICacheFactory;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\IL10N;
use OCP\Server;
use OCP\Util;
@@ -156,7 +154,7 @@ class Connection extends LDAPUtility {
if ($memcache->isAvailable()) {
$this->cache = $memcache->createDistributed();
}
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$this->doNotValidate = !in_array($this->configPrefix,
$helper->getServerConfigurationPrefixes());
$this->logger = Server::get(LoggerInterface::class);
diff --git a/apps/user_ldap/lib/Helper.php b/apps/user_ldap/lib/Helper.php
index 27c19e6c4f5..d3abf04fd1e 100644
--- a/apps/user_ldap/lib/Helper.php
+++ b/apps/user_ldap/lib/Helper.php
@@ -9,7 +9,7 @@ namespace OCA\User_LDAP;
use OCP\Cache\CappedMemoryCache;
use OCP\DB\QueryBuilder\IQueryBuilder;
-use OCP\IConfig;
+use OCP\IAppConfig;
use OCP\IDBConnection;
use OCP\Server;
@@ -18,7 +18,7 @@ class Helper {
protected CappedMemoryCache $sanitizeDnCache;
public function __construct(
- private IConfig $config,
+ private IAppConfig $appConfig,
private IDBConnection $connection,
) {
$this->sanitizeDnCache = new CappedMemoryCache(10000);
@@ -45,21 +45,37 @@ class Helper {
* except the default (first) server shall be connected to.
*
*/
- public function getServerConfigurationPrefixes($activeConfigurations = false): array {
+ public function getServerConfigurationPrefixes(bool $activeConfigurations = false): array {
+ $all = $this->getAllServerConfigurationPrefixes();
+ if (!$activeConfigurations) {
+ return $all;
+ }
+ return array_values(array_filter(
+ $all,
+ fn (string $prefix): bool => ($this->appConfig->getValueString('user_ldap', $prefix . 'ldap_configuration_active') === '1')
+ ));
+ }
+
+ protected function getAllServerConfigurationPrefixes(): array {
+ $unfilled = ['UNFILLED'];
+ $prefixes = $this->appConfig->getValueArray('user_ldap', 'configuration_prefixes', $unfilled);
+ if ($prefixes !== $unfilled) {
+ return $prefixes;
+ }
+
+ /* Fallback to browsing key for migration from Nextcloud<32 */
$referenceConfigkey = 'ldap_configuration_active';
$keys = $this->getServersConfig($referenceConfigkey);
$prefixes = [];
foreach ($keys as $key) {
- if ($activeConfigurations && $this->config->getAppValue('user_ldap', $key, '0') !== '1') {
- continue;
- }
-
$len = strlen($key) - strlen($referenceConfigkey);
$prefixes[] = substr($key, 0, $len);
}
- asort($prefixes);
+ sort($prefixes);
+
+ $this->appConfig->setValueArray('user_ldap', 'configuration_prefixes', $prefixes);
return $prefixes;
}
@@ -68,46 +84,45 @@ class Helper {
*
* determines the host for every configured connection
*
- * @return array an array with configprefix as keys
+ * @return array<string,string> an array with configprefix as keys
*
*/
- public function getServerConfigurationHosts() {
- $referenceConfigkey = 'ldap_host';
-
- $keys = $this->getServersConfig($referenceConfigkey);
+ public function getServerConfigurationHosts(): array {
+ $prefixes = $this->getServerConfigurationPrefixes();
+ $referenceConfigkey = 'ldap_host';
$result = [];
- foreach ($keys as $key) {
- $len = strlen($key) - strlen($referenceConfigkey);
- $prefix = substr($key, 0, $len);
- $result[$prefix] = $this->config->getAppValue('user_ldap', $key);
+ foreach ($prefixes as $prefix) {
+ $result[$prefix] = $this->appConfig->getValueString('user_ldap', $prefix . $referenceConfigkey);
}
return $result;
}
/**
- * return the next available configuration prefix
- *
- * @return string
+ * return the next available configuration prefix and register it as used
*/
- public function getNextServerConfigurationPrefix() {
- $serverConnections = $this->getServerConfigurationPrefixes();
-
- if (count($serverConnections) === 0) {
- return 's01';
+ public function getNextServerConfigurationPrefix(): string {
+ $prefixes = $this->getServerConfigurationPrefixes();
+
+ if (count($prefixes) === 0) {
+ $prefix = 's01';
+ } else {
+ sort($prefixes);
+ $lastKey = array_pop($prefixes);
+ $lastNumber = (int)str_replace('s', '', $lastKey);
+ $prefix = 's' . str_pad((string)($lastNumber + 1), 2, '0', STR_PAD_LEFT);
}
- sort($serverConnections);
- $lastKey = array_pop($serverConnections);
- $lastNumber = (int)str_replace('s', '', $lastKey);
- return 's' . str_pad((string)($lastNumber + 1), 2, '0', STR_PAD_LEFT);
+ $prefixes[] = $prefix;
+ $this->appConfig->setValueArray('user_ldap', 'configuration_prefixes', $prefixes);
+ return $prefix;
}
private function getServersConfig(string $value): array {
$regex = '/' . $value . '$/S';
- $keys = $this->config->getAppKeys('user_ldap');
+ $keys = $this->appConfig->getKeys('user_ldap');
$result = [];
foreach ($keys as $key) {
if (preg_match($regex, $key) === 1) {
@@ -125,7 +140,9 @@ class Helper {
* @return bool true on success, false otherwise
*/
public function deleteServerConfiguration($prefix) {
- if (!in_array($prefix, self::getServerConfigurationPrefixes())) {
+ $prefixes = $this->getServerConfigurationPrefixes();
+ $index = array_search($prefix, $prefixes);
+ if ($index === false) {
return false;
}
@@ -144,7 +161,11 @@ class Helper {
$query->andWhere($query->expr()->notLike('configkey', $query->createNamedParameter('s%')));
}
- $deletedRows = $query->execute();
+ $deletedRows = $query->executeStatement();
+
+ unset($prefixes[$index]);
+ $this->appConfig->setValueArray('user_ldap', 'configuration_prefixes', array_values($prefixes));
+
return $deletedRows !== 0;
}
@@ -152,10 +173,13 @@ class Helper {
* checks whether there is one or more disabled LDAP configurations
*/
public function haveDisabledConfigurations(): bool {
- $all = $this->getServerConfigurationPrefixes(false);
- $active = $this->getServerConfigurationPrefixes(true);
-
- return count($all) !== count($active) || count($all) === 0;
+ $all = $this->getServerConfigurationPrefixes();
+ foreach ($all as $prefix) {
+ if ($this->appConfig->getValueString('user_ldap', $prefix . 'ldap_configuration_active') !== '1') {
+ return true;
+ }
+ }
+ return false;
}
/**
diff --git a/apps/user_ldap/lib/Jobs/CleanUp.php b/apps/user_ldap/lib/Jobs/CleanUp.php
index 7cfc473c950..a1309c0c463 100644
--- a/apps/user_ldap/lib/Jobs/CleanUp.php
+++ b/apps/user_ldap/lib/Jobs/CleanUp.php
@@ -67,7 +67,7 @@ class CleanUp extends TimedJob {
if (isset($arguments['helper'])) {
$this->ldapHelper = $arguments['helper'];
} else {
- $this->ldapHelper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $this->ldapHelper = Server::get(Helper::class);
}
if (isset($arguments['ocConfig'])) {
diff --git a/apps/user_ldap/lib/Settings/Admin.php b/apps/user_ldap/lib/Settings/Admin.php
index 014210ca8f0..49868eb68c7 100644
--- a/apps/user_ldap/lib/Settings/Admin.php
+++ b/apps/user_ldap/lib/Settings/Admin.php
@@ -8,8 +8,6 @@ namespace OCA\User_LDAP\Settings;
use OCA\User_LDAP\Configuration;
use OCA\User_LDAP\Helper;
use OCP\AppFramework\Http\TemplateResponse;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\IL10N;
use OCP\Server;
use OCP\Settings\IDelegatedSettings;
@@ -26,7 +24,7 @@ class Admin implements IDelegatedSettings {
* @return TemplateResponse
*/
public function getForm() {
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$prefixes = $helper->getServerConfigurationPrefixes();
if (count($prefixes) === 0) {
$newPrefix = $helper->getNextServerConfigurationPrefix();
diff --git a/apps/user_ldap/tests/AccessTest.php b/apps/user_ldap/tests/AccessTest.php
index 86ce2aff854..eafaeb76403 100644
--- a/apps/user_ldap/tests/AccessTest.php
+++ b/apps/user_ldap/tests/AccessTest.php
@@ -25,7 +25,6 @@ use OCP\HintException;
use OCP\IAppConfig;
use OCP\IAvatarManager;
use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Image;
use OCP\IUserManager;
use OCP\Notification\IManager as INotificationManager;
@@ -110,7 +109,7 @@ class AccessTest extends TestCase {
$this->createMock(INotificationManager::class),
$this->shareManager])
->getMock();
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
return [$lw, $connector, $um, $helper];
}
diff --git a/apps/user_ldap/tests/HelperTest.php b/apps/user_ldap/tests/HelperTest.php
index 470b67c5531..adea600d900 100644
--- a/apps/user_ldap/tests/HelperTest.php
+++ b/apps/user_ldap/tests/HelperTest.php
@@ -8,7 +8,7 @@ declare(strict_types=1);
namespace OCA\User_LDAP\Tests;
use OCA\User_LDAP\Helper;
-use OCP\IConfig;
+use OCP\IAppConfig;
use OCP\IDBConnection;
use OCP\Server;
use PHPUnit\Framework\MockObject\MockObject;
@@ -17,45 +17,53 @@ use PHPUnit\Framework\MockObject\MockObject;
* @group DB
*/
class HelperTest extends \Test\TestCase {
- private IConfig&MockObject $config;
+ private IAppConfig&MockObject $appConfig;
private Helper $helper;
protected function setUp(): void {
parent::setUp();
- $this->config = $this->createMock(IConfig::class);
- $this->helper = new Helper($this->config, Server::get(IDBConnection::class));
+ $this->appConfig = $this->createMock(IAppConfig::class);
+ $this->helper = new Helper(
+ $this->appConfig,
+ Server::get(IDBConnection::class)
+ );
}
public function testGetServerConfigurationPrefixes(): void {
- $this->config->method('getAppKeys')
- ->with($this->equalTo('user_ldap'))
+ $this->appConfig->method('getKeys')
+ ->with('user_ldap')
->willReturn([
'foo',
'ldap_configuration_active',
's1ldap_configuration_active',
]);
+ $this->appConfig->method('getValueArray')
+ ->with('user_ldap', 'configuration_prefixes')
+ -> willReturnArgument(2);
+
$result = $this->helper->getServerConfigurationPrefixes(false);
$this->assertEquals(['', 's1'], $result);
}
public function testGetServerConfigurationPrefixesActive(): void {
- $this->config->method('getAppKeys')
- ->with($this->equalTo('user_ldap'))
+ $this->appConfig->method('getKeys')
+ ->with('user_ldap')
->willReturn([
'foo',
'ldap_configuration_active',
's1ldap_configuration_active',
]);
- $this->config->method('getAppValue')
+ $this->appConfig->method('getValueArray')
+ ->with('user_ldap', 'configuration_prefixes')
+ -> willReturnArgument(2);
+
+ $this->appConfig->method('getValueString')
->willReturnCallback(function ($app, $key, $default) {
- if ($app !== 'user_ldap') {
- $this->fail('wrong app');
- }
if ($key === 's1ldap_configuration_active') {
return '1';
}
@@ -67,21 +75,58 @@ class HelperTest extends \Test\TestCase {
$this->assertEquals(['s1'], $result);
}
- public function testGetServerConfigurationHost(): void {
- $this->config->method('getAppKeys')
- ->with($this->equalTo('user_ldap'))
+ public function testGetServerConfigurationHostFromAppKeys(): void {
+ $this->appConfig->method('getKeys')
+ ->with('user_ldap')
->willReturn([
'foo',
'ldap_host',
's1ldap_host',
's02ldap_host',
+ 'ldap_configuration_active',
+ 's1ldap_configuration_active',
+ 's02ldap_configuration_active',
]);
- $this->config->method('getAppValue')
+ $this->appConfig->method('getValueArray')
+ ->with('user_ldap', 'configuration_prefixes')
+ -> willReturnArgument(2);
+
+ $this->appConfig->method('getValueString')
->willReturnCallback(function ($app, $key, $default) {
- if ($app !== 'user_ldap') {
- $this->fail('wrong app');
+ if ($key === 'ldap_host') {
+ return 'example.com';
}
+ if ($key === 's1ldap_host') {
+ return 'foo.bar.com';
+ }
+ return $default;
+ });
+
+ $result = $this->helper->getServerConfigurationHosts();
+
+ $this->assertEquals([
+ '' => 'example.com',
+ 's1' => 'foo.bar.com',
+ 's02' => '',
+ ], $result);
+ }
+
+ public function testGetServerConfigurationHost(): void {
+ $this->appConfig
+ ->expects(self::never())
+ ->method('getKeys');
+
+ $this->appConfig->method('getValueArray')
+ ->with('user_ldap', 'configuration_prefixes')
+ -> willReturn([
+ '',
+ 's1',
+ 's02',
+ ]);
+
+ $this->appConfig->method('getValueString')
+ ->willReturnCallback(function ($app, $key, $default) {
if ($key === 'ldap_host') {
return 'example.com';
}
diff --git a/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php b/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php
index be8d7702cd1..00f8be18586 100644
--- a/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php
+++ b/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php
@@ -16,7 +16,6 @@ use OCA\User_LDAP\User\Manager;
use OCA\User_LDAP\UserPluginManager;
use OCP\IAvatarManager;
use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Image;
use OCP\IUserManager;
use OCP\Server;
@@ -125,7 +124,7 @@ abstract class AbstractIntegrationTest {
* initializes the test Helper
*/
protected function initHelper() {
- $this->helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $this->helper = Server::get(Helper::class);
}
/**
diff --git a/apps/user_ldap/tests/LDAPProviderTest.php b/apps/user_ldap/tests/LDAPProviderTest.php
index a4da4a91948..57323e374aa 100644
--- a/apps/user_ldap/tests/LDAPProviderTest.php
+++ b/apps/user_ldap/tests/LDAPProviderTest.php
@@ -21,7 +21,6 @@ use OCA\User_LDAP\User_LDAP;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\ICacheFactory;
use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\IServerContainer;
use OCP\Server;
use Psr\Log\LoggerInterface;
@@ -199,7 +198,7 @@ class LDAPProviderTest extends \Test\TestCase {
$server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock());
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$ldapProvider = $this->getLDAPProvider($server);
$this->assertEquals(
@@ -212,7 +211,7 @@ class LDAPProviderTest extends \Test\TestCase {
$server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock());
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$ldapProvider = $this->getLDAPProvider($server);
$this->assertEquals(